Chromium Code Reviews| Index: src/runtime/runtime-array.cc |
| diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc |
| index 6d8a11e2407530ab9b52a5371d8218c3088e65a8..8d7b946fb38b106a82bf3ed04b755cff1e42f1db 100644 |
| --- a/src/runtime/runtime-array.cc |
| +++ b/src/runtime/runtime-array.cc |
| @@ -1038,6 +1038,7 @@ RUNTIME_FUNCTION(Runtime_GetArrayKeys) { |
| static Object* ArrayConstructorCommon(Isolate* isolate, |
| Handle<JSFunction> constructor, |
| + Handle<JSFunction> original_constructor, |
| Handle<AllocationSite> site, |
| Arguments* caller_args) { |
| Factory* factory = isolate->factory(); |
| @@ -1109,6 +1110,19 @@ static Object* ArrayConstructorCommon(Isolate* isolate, |
| // We must mark the allocationsite as un-inlinable. |
| site->SetDoNotInlineCall(); |
| } |
| + |
| + // Set up the prototoype using original function. |
| + // TODO(dslomov): instead of setting the __proto__, |
| + // use and cache the correct map. |
| + if (*original_constructor != *constructor) { |
| + if (original_constructor->has_instance_prototype()) { |
| + Handle<Object> prototype = |
| + handle(original_constructor->instance_prototype(), isolate); |
| + RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, JSObject::SetPrototype(array, prototype, false)); |
| + } |
| + } |
| + |
| return *array; |
| } |
| @@ -1142,7 +1156,27 @@ RUNTIME_FUNCTION(Runtime_ArrayConstructor) { |
| DCHECK(!site->SitePointsToLiteral()); |
| } |
| - return ArrayConstructorCommon(isolate, constructor, site, caller_args); |
| + return ArrayConstructorCommon(isolate, constructor, constructor, site, |
| + caller_args); |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_ArrayConstructorWithSubclassing) { |
| + HandleScope scope(isolate); |
| + int args_length = args.length(); |
| + CHECK(args_length >= 2); |
|
arv (Not doing code reviews)
2015/03/03 18:15:20
Does this need to be a CHECK and not a DCHECK?
Dmitry Lomov (no reviews)
2015/03/03 18:18:08
CHECK is safer (and does not cost us much)
|
| + |
| + // This variables and checks work around -Werror=strict-overflow. |
| + int pre_last_arg_index = args_length - 2; |
| + int last_arg_index = args_length - 1; |
| + CHECK(pre_last_arg_index >= 0); |
| + CHECK(last_arg_index >= 0); |
| + |
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, pre_last_arg_index); |
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, original_constructor, last_arg_index); |
| + Arguments caller_args(args_length - 2, args.arguments()); |
| + return ArrayConstructorCommon(isolate, constructor, original_constructor, |
| + Handle<AllocationSite>::null(), &caller_args); |
| } |
| @@ -1161,7 +1195,7 @@ RUNTIME_FUNCTION(Runtime_InternalArrayConstructor) { |
| DCHECK(arg_count == caller_args->length()); |
| } |
| #endif |
| - return ArrayConstructorCommon(isolate, constructor, |
| + return ArrayConstructorCommon(isolate, constructor, constructor, |
| Handle<AllocationSite>::null(), caller_args); |
| } |