Index: src/bootstrapper.cc |
=================================================================== |
--- src/bootstrapper.cc (revision 4536) |
+++ src/bootstrapper.cc (working copy) |
@@ -418,12 +418,15 @@ |
// Functions with this map will not have a 'prototype' property, and |
// can not be used as constructors. |
- fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
- global_context()->set_function_without_prototype_map(*fm); |
- function_map_descriptors = |
+ Handle<Map> function_without_prototype_map = |
+ Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
+ global_context()->set_function_without_prototype_map( |
+ *function_without_prototype_map); |
+ Handle<DescriptorArray> function_without_prototype_map_descriptors = |
ComputeFunctionInstanceDescriptor(DONT_ADD_PROTOTYPE); |
- fm->set_instance_descriptors(*function_map_descriptors); |
- fm->set_function_with_prototype(false); |
+ function_without_prototype_map->set_instance_descriptors( |
+ *function_without_prototype_map_descriptors); |
+ function_without_prototype_map->set_function_with_prototype(false); |
// Allocate the function map first and then patch the prototype later |
fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
@@ -459,7 +462,7 @@ |
// 262 15.3.4. |
Handle<String> symbol = Factory::LookupAsciiSymbol("Empty"); |
Handle<JSFunction> empty_function = |
- Factory::NewFunction(symbol, Factory::null_value()); |
+ Factory::NewFunctionWithoutPrototype(symbol); |
// --- E m p t y --- |
Handle<Code> code = |
@@ -474,15 +477,14 @@ |
empty_function->shared()->DontAdaptArguments(); |
global_context()->function_map()->set_prototype(*empty_function); |
global_context()->function_instance_map()->set_prototype(*empty_function); |
+ global_context()->function_without_prototype_map()-> |
+ set_prototype(*empty_function); |
- // Allocate a distinct prototype for the function map for functions without |
- // prototype, so it will not add 'prototype' property in the proto chain. |
- global_context()->function_without_prototype_map()->set_prototype( |
- *Factory::NewJSObject(Top::object_function(), TENURED)); |
- |
// Allocate the function map first and then patch the prototype later |
- Handle<Map> empty_fm = Factory::CopyMapDropDescriptors(fm); |
- empty_fm->set_instance_descriptors(*function_map_descriptors); |
+ Handle<Map> empty_fm = Factory::CopyMapDropDescriptors( |
+ function_without_prototype_map); |
+ empty_fm->set_instance_descriptors( |
+ *function_without_prototype_map_descriptors); |
empty_fm->set_prototype(global_context()->object_function()->prototype()); |
empty_function->set_map(*empty_fm); |
return empty_function; |
@@ -1258,23 +1260,6 @@ |
// Set the lengths for the functions to satisfy ECMA-262. |
call->shared()->set_length(1); |
apply->shared()->set_length(2); |
- |
- // Install the call, apply, toString and constructor properties |
- // for the functions without prototype. |
- Handle<JSObject> wp_proto = Handle<JSObject>( |
- JSObject::cast(Top::function_without_prototype_map()->prototype())); |
- |
- Handle<String> call_symbol = Factory::LookupAsciiSymbol("call"); |
- SetProperty(wp_proto, call_symbol, call, DONT_ENUM); |
- |
- Handle<String> apply_symbol = Factory::LookupAsciiSymbol("apply"); |
- SetProperty(wp_proto, apply_symbol, apply, DONT_ENUM); |
- |
- Handle<Object> to_string = GetProperty(proto, "toString"); |
- Handle<String> to_string_symbol = Factory::LookupAsciiSymbol("toString"); |
- SetProperty(wp_proto, to_string_symbol, to_string, DONT_ENUM); |
- |
- SetProperty(wp_proto, Factory::constructor_symbol(), function, DONT_ENUM); |
} |
// Create a constructor for RegExp results (a variant of Array that |