From bedfa9e7109f348c0b7214877df0ed649f8f2029 Mon Sep 17 00:00:00 2001 From: "dslomov@chromium.org" Date: Wed, 1 Oct 2014 12:11:12 +0000 Subject: [PATCH] Extract runtime functions for classes into a separate file. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/621833002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24364 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- BUILD.gn | 1 + src/runtime/runtime-classes.cc | 109 +++++++++++++++++++++++++++++++++++++++++ src/runtime/runtime.cc | 91 ---------------------------------- tools/gyp/v8.gyp | 1 + 4 files changed, 111 insertions(+), 91 deletions(-) create mode 100644 src/runtime/runtime-classes.cc diff --git a/BUILD.gn b/BUILD.gn index 3f4d47d..6affb6c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -824,6 +824,7 @@ source_set("v8_base") { "src/rewriter.h", "src/runtime-profiler.cc", "src/runtime-profiler.h", + "src/runtime/runtime-classes.cc", "src/runtime/runtime-collections.cc", "src/runtime/runtime-compiler.cc", "src/runtime/runtime-i18n.cc", diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc new file mode 100644 index 0000000..ce4b2b5 --- /dev/null +++ b/src/runtime/runtime-classes.cc @@ -0,0 +1,109 @@ +// 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 +#include + +#include "src/v8.h" + +#include "src/isolate-inl.h" +#include "src/runtime/runtime.h" +#include "src/runtime/runtime-utils.h" + + +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 clone = JSFunction::CloneClosure(fun); + Handle 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 proto = PrototypeIterator::GetCurrent(iter); + if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); + + LookupIterator it(receiver, name, Handle::cast(proto)); + Handle result; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); + return *result; +} + + +static Object* StoreToSuper(Isolate* isolate, Handle home_object, + Handle receiver, Handle name, + Handle 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 proto = PrototypeIterator::GetCurrent(iter); + if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); + + LookupIterator it(receiver, name, Handle::cast(proto)); + Handle 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 diff --git a/src/runtime/runtime.cc b/src/runtime/runtime.cc index 620c91f..cf050d3 100644 --- a/src/runtime/runtime.cc +++ b/src/runtime/runtime.cc @@ -270,97 +270,6 @@ RUNTIME_FUNCTION(Runtime_PreventExtensions) { } -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 clone = JSFunction::CloneClosure(fun); - Handle 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 proto = PrototypeIterator::GetCurrent(iter); - if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); - - LookupIterator it(receiver, name, Handle::cast(proto)); - Handle result; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); - return *result; -} - - -static Object* StoreToSuper(Isolate* isolate, Handle home_object, - Handle receiver, Handle name, - Handle 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 proto = PrototypeIterator::GetCurrent(iter); - if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); - - LookupIterator it(receiver, name, Handle::cast(proto)); - Handle 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); -} - - RUNTIME_FUNCTION(Runtime_IsExtensible) { SealHandleScope shs(isolate); DCHECK(args.length() == 1); diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp index c12ab14..77c8929 100644 --- a/tools/gyp/v8.gyp +++ b/tools/gyp/v8.gyp @@ -735,6 +735,7 @@ '../../src/rewriter.h', '../../src/runtime-profiler.cc', '../../src/runtime-profiler.h', + '../../src/runtime/runtime-classes.cc', '../../src/runtime/runtime-collections.cc', '../../src/runtime/runtime-compiler.cc', '../../src/runtime/runtime-date.cc', -- 2.7.4