Index: src/api-natives.cc |
diff --git a/src/api-natives.cc b/src/api-natives.cc |
index a62c231ceb229586791f2aefa61e924cb19b9390..1284af6e6522317c92b1f6b89d85f5cfdd2a87a3 100644 |
--- a/src/api-natives.cc |
+++ b/src/api-natives.cc |
@@ -37,6 +37,25 @@ MaybeHandle<Object> Instantiate(Isolate* isolate, Handle<Object> data, |
} |
+MaybeHandle<JSFunction> InstantiateFunctionOrMaybeDont(Isolate* isolate, |
+ Handle<Object> data) { |
+ DCHECK(data->IsFunctionTemplateInfo() || data->IsJSFunction()); |
+ if (data->IsFunctionTemplateInfo()) { |
+ // A function template needs to be instantiated. |
+ return InstantiateFunction(isolate, |
+ Handle<FunctionTemplateInfo>::cast(data)); |
+#ifdef V8_JS_ACCESSORS |
+ } else if (data->IsJSFunction()) { |
+ // If we already have a proper function, we do not need additional work. |
+ // (This should only happen for JavaScript API accessors.) |
+ return Handle<JSFunction>::cast(data); |
+#endif // V8_JS_ACCESSORS |
+ } else { |
+ UNREACHABLE(); |
+ return MaybeHandle<JSFunction>(); |
+ } |
+} |
+ |
MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate, |
Handle<JSObject> object, |
Handle<Name> name, |
@@ -44,18 +63,14 @@ MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate, |
Handle<Object> setter, |
PropertyAttributes attributes) { |
if (!getter->IsUndefined()) { |
- ASSIGN_RETURN_ON_EXCEPTION( |
- isolate, getter, |
- InstantiateFunction(isolate, |
- Handle<FunctionTemplateInfo>::cast(getter)), |
- Object); |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, getter, |
+ InstantiateFunctionOrMaybeDont(isolate, getter), |
+ Object); |
} |
if (!setter->IsUndefined()) { |
- ASSIGN_RETURN_ON_EXCEPTION( |
- isolate, setter, |
- InstantiateFunction(isolate, |
- Handle<FunctionTemplateInfo>::cast(setter)), |
- Object); |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, setter, |
+ InstantiateFunctionOrMaybeDont(isolate, setter), |
+ Object); |
} |
RETURN_ON_EXCEPTION(isolate, JSObject::DefineAccessor(object, name, getter, |
setter, attributes), |
@@ -364,10 +379,19 @@ void ApiNatives::AddDataProperty(Isolate* isolate, Handle<TemplateInfo> info, |
void ApiNatives::AddAccessorProperty(Isolate* isolate, |
Handle<TemplateInfo> info, |
- Handle<Name> name, |
- Handle<FunctionTemplateInfo> getter, |
- Handle<FunctionTemplateInfo> setter, |
+ Handle<Name> name, Handle<Object> getter, |
+ Handle<Object> setter, |
PropertyAttributes attributes) { |
+#ifdef V8_JS_ACCESSORS |
+ DCHECK(getter.is_null() || getter->IsFunctionTemplateInfo() || |
+ getter->IsJSFunction()); |
+ DCHECK(setter.is_null() || setter->IsFunctionTemplateInfo() || |
+ setter->IsJSFunction()); |
+#else |
+ DCHECK(getter.is_null() || getter->IsFunctionTemplateInfo()); |
+ DCHECK(setter.is_null() || setter->IsFunctionTemplateInfo()); |
+#endif // V8_JS_ACCESSORS |
+ |
const int kSize = 4; |
PropertyDetails details(attributes, ACCESSOR, 0, PropertyCellType::kNoCell); |
auto details_handle = handle(details.AsSmi(), isolate); |