Index: src/bootstrapper.cc |
=================================================================== |
--- src/bootstrapper.cc (revision 8009) |
+++ src/bootstrapper.cc (working copy) |
@@ -171,7 +171,7 @@ |
// Creates the empty function. Used for creating a context from scratch. |
Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); |
// Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 |
- Handle<JSFunction> CreateThrowTypeErrorFunction(Builtins::Name builtin); |
+ Handle<JSFunction> GetThrowTypeErrorFunction(); |
void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); |
// Creates the global objects using the global and the template passed in |
@@ -265,6 +265,7 @@ |
// These are the final, writable prototype, maps. |
Handle<Map> function_instance_map_writable_prototype_; |
Handle<Map> strict_mode_function_instance_map_writable_prototype_; |
+ Handle<JSFunction> throw_type_error_function; |
BootstrapperActive active_; |
friend class Bootstrapper; |
@@ -549,22 +550,22 @@ |
// ECMAScript 5th Edition, 13.2.3 |
-Handle<JSFunction> Genesis::CreateThrowTypeErrorFunction( |
- Builtins::Name builtin) { |
- Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); |
- Handle<JSFunction> throw_type_error = |
- factory()->NewFunctionWithoutPrototype(name, kStrictMode); |
- Handle<Code> code = Handle<Code>( |
- isolate()->builtins()->builtin(builtin)); |
+Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { |
+ if (throw_type_error_function.is_null()) { |
+ Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); |
+ throw_type_error_function = |
+ factory()->NewFunctionWithoutPrototype(name, kNonStrictMode); |
+ Handle<Code> code(isolate()->builtins()->builtin( |
+ Builtins::kStrictModePoisonPill)); |
+ throw_type_error_function->set_map( |
+ global_context()->function_map()); |
+ throw_type_error_function->set_code(*code); |
+ throw_type_error_function->shared()->set_code(*code); |
+ throw_type_error_function->shared()->DontAdaptArguments(); |
- throw_type_error->set_map(global_context()->strict_mode_function_map()); |
- throw_type_error->set_code(*code); |
- throw_type_error->shared()->set_code(*code); |
- throw_type_error->shared()->DontAdaptArguments(); |
- |
- PreventExtensions(throw_type_error); |
- |
- return throw_type_error; |
+ PreventExtensions(throw_type_error_function); |
+ } |
+ return throw_type_error_function; |
} |
@@ -621,17 +622,15 @@ |
CreateStrictModeFunctionMap( |
ADD_WRITEABLE_PROTOTYPE, empty, arguments, caller); |
- // Create the ThrowTypeError function instances. |
- Handle<JSFunction> arguments_throw = |
- CreateThrowTypeErrorFunction(Builtins::kStrictFunctionArguments); |
- Handle<JSFunction> caller_throw = |
- CreateThrowTypeErrorFunction(Builtins::kStrictFunctionCaller); |
+ // Create the ThrowTypeError function instance. |
+ Handle<JSFunction> throw_function = |
+ GetThrowTypeErrorFunction(); |
// Complete the callback fixed arrays. |
- arguments->set(0, *arguments_throw); |
- arguments->set(1, *arguments_throw); |
- caller->set(0, *caller_throw); |
- caller->set(1, *caller_throw); |
+ arguments->set(0, *throw_function); |
+ arguments->set(1, *throw_function); |
+ caller->set(0, *throw_function); |
+ caller->set(1, *throw_function); |
} |
@@ -1061,16 +1060,14 @@ |
Handle<FixedArray> callee = factory->NewFixedArray(2, TENURED); |
Handle<FixedArray> caller = factory->NewFixedArray(2, TENURED); |
- Handle<JSFunction> callee_throw = |
- CreateThrowTypeErrorFunction(Builtins::kStrictArgumentsCallee); |
- Handle<JSFunction> caller_throw = |
- CreateThrowTypeErrorFunction(Builtins::kStrictArgumentsCaller); |
+ Handle<JSFunction> throw_function = |
+ GetThrowTypeErrorFunction(); |
// Install the ThrowTypeError functions. |
- callee->set(0, *callee_throw); |
- callee->set(1, *callee_throw); |
- caller->set(0, *caller_throw); |
- caller->set(1, *caller_throw); |
+ callee->set(0, *throw_function); |
+ callee->set(1, *throw_function); |
+ caller->set(0, *throw_function); |
+ caller->set(1, *throw_function); |
// Create the descriptor array for the arguments object. |
Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3); |