Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(685)

Unified Diff: src/objects.cc

Issue 1609233002: Do not eagerly instantiate accessors' JSFunction. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 3ddbe50f75904e7099ac25752d4c1edec6bec22e..265e20421b6da340a75143f02046b305174cc609 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -11,6 +11,7 @@
#include "src/accessors.h"
#include "src/allocation-site-scopes.h"
#include "src/api.h"
+#include "src/api-natives.h"
#include "src/arguments.h"
#include "src/base/bits.h"
#include "src/base/utils/random-number-generator.h"
@@ -1173,7 +1174,18 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(
// Regular accessor.
Handle<Object> getter(AccessorPair::cast(*structure)->getter(), isolate);
- if (getter->IsCallable()) {
+ if (getter->IsFunctionTemplateInfo()) {
+ auto result = Builtins::InvokeApiFunction(
+ Handle<FunctionTemplateInfo>::cast(getter), receiver, 0, nullptr);
+ if (isolate->has_pending_exception()) {
+ return MaybeHandle<Object>();
+ }
+ Handle<Object> return_value;
+ if (result.ToHandle(&return_value)) {
+ return_value->VerifyApiCallResultType();
+ return handle(*return_value, isolate);
+ }
+ } else if (getter->IsCallable()) {
// TODO(rossberg): nicer would be to cast to some JSCallable here...
return Object::GetPropertyWithDefinedGetter(
receiver, Handle<JSReceiver>::cast(getter));
@@ -1231,7 +1243,16 @@ Maybe<bool> Object::SetPropertyWithAccessor(LookupIterator* it,
// Regular accessor.
Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
- if (setter->IsCallable()) {
+ if (setter->IsFunctionTemplateInfo()) {
+ Handle<Object> argv[] = {value};
+ auto result =
+ Builtins::InvokeApiFunction(Handle<FunctionTemplateInfo>::cast(setter),
+ receiver, arraysize(argv), argv);
+ if (isolate->has_pending_exception()) {
+ return Nothing<bool>();
+ }
+ return Just(true);
+ } else if (setter->IsCallable()) {
// TODO(rossberg): nicer would be to cast to some JSCallable here...
return SetPropertyWithDefinedSetter(
receiver, Handle<JSReceiver>::cast(setter), value, should_throw);
@@ -8999,8 +9020,10 @@ MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it,
}
}
- DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull());
- DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull());
+ DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull() ||
+ getter->IsFunctionTemplateInfo());
+ DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull() ||
+ getter->IsFunctionTemplateInfo());
// At least one of the accessors needs to be a new value.
DCHECK(!getter->IsNull() || !setter->IsNull());
if (!getter->IsNull()) {
@@ -10912,6 +10935,12 @@ Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) {
Object* AccessorPair::GetComponent(AccessorComponent component) {
Object* accessor = get(component);
+ if (accessor->IsFunctionTemplateInfo()) {
+ auto function = i::ApiNatives::InstantiateFunction(
+ handle(FunctionTemplateInfo::cast(accessor)));
+ set(component, *function.ToHandleChecked());
Toon Verwaest 2016/01/28 12:05:19 If we'd like to share the accessorpair with Functi
epertoso 2016/02/01 16:18:03 I modified JSReceiver::GetOwnPropertyDescriptor an
+ accessor = get(component);
+ }
return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor;
}

Powered by Google App Engine
This is Rietveld 408576698