CONVERT_ARG_CHECKED(JSFunction, function, 0);
CONVERT_ARG_CHECKED(JSArray, params, 1);
+ RUNTIME_ASSERT(params->HasFastElements());
FixedArray* fixed = FixedArray::cast(params->elements());
- bool exception = false;
- Object*** param_data = NewArray<Object**>(fixed->length());
- for (int i = 0; i < fixed->length(); i++) {
+ int fixed_length = Smi::cast(params->length())->value();
+ SmartPointer<Object**> param_data(NewArray<Object**>(fixed_length));
+ for (int i = 0; i < fixed_length; i++) {
Handle<Object> val = Handle<Object>(fixed->get(i));
param_data[i] = val.location();
}
+ bool exception = false;
Handle<Object> result = Execution::New(
- function, fixed->length(), param_data, &exception);
+ function, fixed_length, *param_data, &exception);
+ if (exception) {
+ return Failure::Exception();
+ }
+ ASSERT(!result.is_null());
return *result;
}
throw new $TypeError('Bind must be called on a function');
}
// this_arg is not an argument that should be bound.
- var argc_bound = %_ArgumentsLength() - 1;
+ var argc_bound = (%_ArgumentsLength() || 1) - 1;
if (argc_bound > 0) {
var bound_args = new $Array(argc_bound);
for(var i = 0; i < argc_bound; i++) {