Chromium Code Reviews| Index: src/runtime/runtime-classes.cc |
| diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0997d63afed1a89682192fd8594cfe670f1081e9 |
| --- /dev/null |
| +++ b/src/runtime/runtime-classes.cc |
| @@ -0,0 +1,120 @@ |
| +// Copyright 2014 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <stdlib.h> |
| +#include <limits> |
| + |
| +#include "src/v8.h" |
| + |
| +#include "src/accessors.h" |
| +#include "src/api.h" |
| +#include "src/arguments.h" |
| +#include "src/bailout-reason.h" |
| +#include "src/base/cpu.h" |
| +#include "src/base/platform/platform.h" |
| +#include "src/bootstrapper.h" |
| +#include "src/conversions.h" |
| +#include "src/global-handles.h" |
| +#include "src/isolate-inl.h" |
| +#include "src/prototype.h" |
| +#include "src/runtime/runtime.h" |
| +#include "src/runtime/runtime-utils.h" |
| +#include "src/utils.h" |
|
Yang
2014/10/01 11:40:29
Can we do an audit of those includes? My guess is
|
| + |
| + |
| +namespace v8 { |
| +namespace internal { |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_ToMethod) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 2); |
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| + Handle<JSFunction> clone = JSFunction::CloneClosure(fun); |
| + Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol()); |
| + JSObject::SetOwnPropertyIgnoreAttributes(clone, home_object_symbol, |
| + home_object, DONT_ENUM).Assert(); |
| + return *clone; |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { |
| + DCHECK(args.length() == 0); |
| + return isolate->heap()->home_object_symbol(); |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_LoadFromSuper) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 3); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Name, name, 2); |
| + |
| + if (home_object->IsAccessCheckNeeded() && |
| + !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) { |
| + isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); |
| + RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| + } |
| + |
| + PrototypeIterator iter(isolate, home_object); |
| + Handle<Object> proto = PrototypeIterator::GetCurrent(iter); |
| + if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); |
| + |
| + LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); |
| + return *result; |
| +} |
| + |
| + |
| +static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object, |
| + Handle<Object> receiver, Handle<Name> name, |
| + Handle<Object> value, StrictMode strict_mode) { |
| + if (home_object->IsAccessCheckNeeded() && |
| + !isolate->MayNamedAccess(home_object, name, v8::ACCESS_SET)) { |
| + isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_SET); |
| + RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| + } |
| + |
| + PrototypeIterator iter(isolate, home_object); |
| + Handle<Object> proto = PrototypeIterator::GetCurrent(iter); |
| + if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); |
| + |
| + LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + Object::SetProperty(&it, value, strict_mode, |
| + Object::CERTAINLY_NOT_STORE_FROM_KEYED, |
| + Object::SUPER_PROPERTY)); |
| + return *result; |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 4); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| + CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); |
| + |
| + return StoreToSuper(isolate, home_object, receiver, name, value, STRICT); |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 4); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| + CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); |
| + |
| + return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY); |
| +} |
| +} |
| +} // namespace v8::internal |