Index: src/factory.cc |
diff --git a/src/factory.cc b/src/factory.cc |
index 26be6afac0b9cff4f09dda945501f49595c837cb..969973c3251cd0a300d5122e2c9b64eaefeead47 100644 |
--- a/src/factory.cc |
+++ b/src/factory.cc |
@@ -1308,12 +1308,11 @@ Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
} |
-Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
- Handle<Code> code, |
+Handle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code, |
Handle<Object> prototype, |
- InstanceType type, |
- int instance_size, |
- bool read_only_prototype) { |
+ InstanceType type, int instance_size, |
+ bool read_only_prototype, |
+ bool install_constructor) { |
// Allocate the function |
Handle<JSFunction> function = NewFunction( |
name, code, prototype, read_only_prototype); |
@@ -1321,8 +1320,13 @@ Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
ElementsKind elements_kind = |
type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS; |
Handle<Map> initial_map = NewMap(type, instance_size, elements_kind); |
- if (prototype->IsTheHole() && !function->shared()->is_generator()) { |
- prototype = NewFunctionPrototype(function); |
+ if (!function->shared()->is_generator()) { |
+ if (prototype->IsTheHole()) { |
+ prototype = NewFunctionPrototype(function); |
+ } else if (install_constructor) { |
+ JSObject::AddProperty(Handle<JSObject>::cast(prototype), |
+ constructor_string(), function, DONT_ENUM); |
+ } |
} |
JSFunction::SetInitialMap(function, initial_map, |
@@ -2278,8 +2282,8 @@ Handle<JSFunction> Factory::CreateApiFunction( |
break; |
} |
- result = NewFunction(empty_string(), code, prototype, type, |
- instance_size, obj->read_only_prototype()); |
+ result = NewFunction(empty_string(), code, prototype, type, instance_size, |
+ obj->read_only_prototype(), true); |
} |
result->shared()->set_length(obj->length()); |
@@ -2299,19 +2303,13 @@ Handle<JSFunction> Factory::CreateApiFunction( |
return result; |
} |
- if (prototype->IsTheHole()) { |
#ifdef DEBUG |
- LookupIterator it(handle(JSObject::cast(result->prototype())), |
- constructor_string(), |
- LookupIterator::OWN_SKIP_INTERCEPTOR); |
- MaybeHandle<Object> maybe_prop = Object::GetProperty(&it); |
- DCHECK(it.IsFound()); |
- DCHECK(maybe_prop.ToHandleChecked().is_identical_to(result)); |
+ LookupIterator it(handle(JSObject::cast(result->prototype())), |
+ constructor_string(), LookupIterator::OWN_SKIP_INTERCEPTOR); |
+ MaybeHandle<Object> maybe_prop = Object::GetProperty(&it); |
+ DCHECK(it.IsFound()); |
+ DCHECK(maybe_prop.ToHandleChecked().is_identical_to(result)); |
#endif |
- } else { |
- JSObject::AddProperty(handle(JSObject::cast(result->prototype())), |
- constructor_string(), result, DONT_ENUM); |
- } |
// Down from here is only valid for API functions that can be used as a |
// constructor (don't set the "remove prototype" flag). |