Index: src/factory.cc |
diff --git a/src/factory.cc b/src/factory.cc |
index 4ca8734100fcb4ce056fe3ad6650a7caac59e374..8307cfa196ab3835f7f57b7185f58ab77c92148b 100644 |
--- a/src/factory.cc |
+++ b/src/factory.cc |
@@ -1239,19 +1239,30 @@ Handle<Object> Factory::NewError(const char* constructor, |
} |
-Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
+Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, |
+ Handle<String> name, |
InstanceType type, |
int instance_size, |
Handle<Code> code, |
bool force_initial_map) { |
// Allocate the function |
- Handle<JSFunction> function = NewFunction(name, code, the_hole_value()); |
+ Handle<JSFunction> function = NewFunction(name, code, maybe_prototype); |
- if (force_initial_map || |
- type != JS_OBJECT_TYPE || |
- instance_size != JSObject::kHeaderSize) { |
+ Handle<Object> prototype; |
+ if (maybe_prototype.ToHandle(&prototype) && |
+ (force_initial_map || |
+ type != JS_OBJECT_TYPE || |
+ instance_size != JSObject::kHeaderSize)) { |
Handle<Map> initial_map = NewMap(type, instance_size); |
- Handle<JSObject> prototype = NewFunctionPrototype(function); |
+ if (prototype->IsJSObject()) { |
+ JSObject::SetLocalPropertyIgnoreAttributes( |
+ Handle<JSObject>::cast(prototype), |
+ constructor_string(), |
+ function, |
+ DONT_ENUM).Assert(); |
+ } else if (!function->shared()->is_generator()) { |
+ prototype = NewFunctionPrototype(function); |
+ } |
initial_map->set_prototype(*prototype); |
function->set_initial_map(*initial_map); |
initial_map->set_constructor(*function); |
@@ -1264,6 +1275,16 @@ Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
} |
+Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
+ InstanceType type, |
+ int instance_size, |
+ Handle<Code> code, |
+ bool force_initial_map) { |
+ return NewFunction( |
+ the_hole_value(), name, type, instance_size, code, force_initial_map); |
+} |
+ |
+ |
Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name, |
InstanceType type, |
int instance_size, |
@@ -2041,7 +2062,9 @@ Handle<JSObject> Factory::NewArgumentsObject(Handle<Object> callee, |
Handle<JSFunction> Factory::CreateApiFunction( |
- Handle<FunctionTemplateInfo> obj, ApiInstanceType instance_type) { |
+ Handle<FunctionTemplateInfo> obj, |
+ Handle<Object> prototype, |
+ ApiInstanceType instance_type) { |
Handle<Code> code = isolate()->builtins()->HandleApiCall(); |
Handle<Code> construct_stub = isolate()->builtins()->JSConstructStubApi(); |
@@ -2077,20 +2100,28 @@ Handle<JSFunction> Factory::CreateApiFunction( |
break; |
} |
+ MaybeHandle<Object> maybe_prototype = prototype; |
+ if (obj->remove_prototype()) maybe_prototype = MaybeHandle<Object>(); |
+ |
Handle<JSFunction> result = NewFunction( |
- Factory::empty_string(), type, instance_size, code, true); |
+ maybe_prototype, Factory::empty_string(), type, |
+ instance_size, code, true); |
- // Set length. |
result->shared()->set_length(obj->length()); |
- |
- // Set class name. |
- Handle<Object> class_name = Handle<Object>(obj->class_name(), isolate()); |
+ Handle<Object> class_name(obj->class_name(), isolate()); |
if (class_name->IsString()) { |
result->shared()->set_instance_class_name(*class_name); |
result->shared()->set_name(*class_name); |
} |
+ result->shared()->set_function_data(*obj); |
+ result->shared()->set_construct_stub(*construct_stub); |
+ result->shared()->DontAdaptArguments(); |
+ |
+ if (obj->remove_prototype()) return result; |
Igor Sheludko
2014/04/28 15:00:38
Does it make sense to put ASSERT(result->shared()-
Toon Verwaest
2014/04/29 09:41:13
Done.
|
+ // Down from here is only valid for API functions that can be used as a |
+ // constructor (don't set the "remove prototype" flag). |
- Handle<Map> map = Handle<Map>(result->initial_map()); |
+ Handle<Map> map(result->initial_map()); |
// Mark as undetectable if needed. |
if (obj->undetectable()) { |
@@ -2120,10 +2151,6 @@ Handle<JSFunction> Factory::CreateApiFunction( |
map->set_has_instance_call_handler(); |
} |
- result->shared()->set_function_data(*obj); |
- result->shared()->set_construct_stub(*construct_stub); |
- result->shared()->DontAdaptArguments(); |
- |
// Recursively copy parent instance templates' accessors, |
// 'data' may be modified. |
int max_number_of_additional_properties = 0; |