| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 global_context()->set_function_instance_map(*fm); | 411 global_context()->set_function_instance_map(*fm); |
| 412 // Please note that the prototype property for function instances must be | 412 // Please note that the prototype property for function instances must be |
| 413 // writable. | 413 // writable. |
| 414 Handle<DescriptorArray> function_map_descriptors = | 414 Handle<DescriptorArray> function_map_descriptors = |
| 415 ComputeFunctionInstanceDescriptor(ADD_WRITEABLE_PROTOTYPE); | 415 ComputeFunctionInstanceDescriptor(ADD_WRITEABLE_PROTOTYPE); |
| 416 fm->set_instance_descriptors(*function_map_descriptors); | 416 fm->set_instance_descriptors(*function_map_descriptors); |
| 417 fm->set_function_with_prototype(true); | 417 fm->set_function_with_prototype(true); |
| 418 | 418 |
| 419 // Functions with this map will not have a 'prototype' property, and | 419 // Functions with this map will not have a 'prototype' property, and |
| 420 // can not be used as constructors. | 420 // can not be used as constructors. |
| 421 fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 421 Handle<Map> function_without_prototype_map = |
| 422 global_context()->set_function_without_prototype_map(*fm); | 422 Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| 423 function_map_descriptors = | 423 global_context()->set_function_without_prototype_map( |
| 424 *function_without_prototype_map); |
| 425 Handle<DescriptorArray> function_without_prototype_map_descriptors = |
| 424 ComputeFunctionInstanceDescriptor(DONT_ADD_PROTOTYPE); | 426 ComputeFunctionInstanceDescriptor(DONT_ADD_PROTOTYPE); |
| 425 fm->set_instance_descriptors(*function_map_descriptors); | 427 function_without_prototype_map->set_instance_descriptors( |
| 426 fm->set_function_with_prototype(false); | 428 *function_without_prototype_map_descriptors); |
| 429 function_without_prototype_map->set_function_with_prototype(false); |
| 427 | 430 |
| 428 // Allocate the function map first and then patch the prototype later | 431 // Allocate the function map first and then patch the prototype later |
| 429 fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 432 fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| 430 global_context()->set_function_map(*fm); | 433 global_context()->set_function_map(*fm); |
| 431 function_map_descriptors = | 434 function_map_descriptors = |
| 432 ComputeFunctionInstanceDescriptor(ADD_READONLY_PROTOTYPE); | 435 ComputeFunctionInstanceDescriptor(ADD_READONLY_PROTOTYPE); |
| 433 fm->set_instance_descriptors(*function_map_descriptors); | 436 fm->set_instance_descriptors(*function_map_descriptors); |
| 434 fm->set_function_with_prototype(true); | 437 fm->set_function_with_prototype(true); |
| 435 | 438 |
| 436 Handle<String> object_name = Handle<String>(Heap::Object_symbol()); | 439 Handle<String> object_name = Handle<String>(Heap::Object_symbol()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 452 global_context()->set_initial_object_prototype(*prototype); | 455 global_context()->set_initial_object_prototype(*prototype); |
| 453 SetPrototype(object_fun, prototype); | 456 SetPrototype(object_fun, prototype); |
| 454 object_function_map-> | 457 object_function_map-> |
| 455 set_instance_descriptors(Heap::empty_descriptor_array()); | 458 set_instance_descriptors(Heap::empty_descriptor_array()); |
| 456 } | 459 } |
| 457 | 460 |
| 458 // Allocate the empty function as the prototype for function ECMAScript | 461 // Allocate the empty function as the prototype for function ECMAScript |
| 459 // 262 15.3.4. | 462 // 262 15.3.4. |
| 460 Handle<String> symbol = Factory::LookupAsciiSymbol("Empty"); | 463 Handle<String> symbol = Factory::LookupAsciiSymbol("Empty"); |
| 461 Handle<JSFunction> empty_function = | 464 Handle<JSFunction> empty_function = |
| 462 Factory::NewFunction(symbol, Factory::null_value()); | 465 Factory::NewFunctionWithoutPrototype(symbol); |
| 463 | 466 |
| 464 // --- E m p t y --- | 467 // --- E m p t y --- |
| 465 Handle<Code> code = | 468 Handle<Code> code = |
| 466 Handle<Code>(Builtins::builtin(Builtins::EmptyFunction)); | 469 Handle<Code>(Builtins::builtin(Builtins::EmptyFunction)); |
| 467 empty_function->set_code(*code); | 470 empty_function->set_code(*code); |
| 468 Handle<String> source = Factory::NewStringFromAscii(CStrVector("() {}")); | 471 Handle<String> source = Factory::NewStringFromAscii(CStrVector("() {}")); |
| 469 Handle<Script> script = Factory::NewScript(source); | 472 Handle<Script> script = Factory::NewScript(source); |
| 470 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 473 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
| 471 empty_function->shared()->set_script(*script); | 474 empty_function->shared()->set_script(*script); |
| 472 empty_function->shared()->set_start_position(0); | 475 empty_function->shared()->set_start_position(0); |
| 473 empty_function->shared()->set_end_position(source->length()); | 476 empty_function->shared()->set_end_position(source->length()); |
| 474 empty_function->shared()->DontAdaptArguments(); | 477 empty_function->shared()->DontAdaptArguments(); |
| 475 global_context()->function_map()->set_prototype(*empty_function); | 478 global_context()->function_map()->set_prototype(*empty_function); |
| 476 global_context()->function_instance_map()->set_prototype(*empty_function); | 479 global_context()->function_instance_map()->set_prototype(*empty_function); |
| 477 | 480 global_context()->function_without_prototype_map()-> |
| 478 // Allocate a distinct prototype for the function map for functions without | 481 set_prototype(*empty_function); |
| 479 // prototype, so it will not add 'prototype' property in the proto chain. | |
| 480 global_context()->function_without_prototype_map()->set_prototype( | |
| 481 *Factory::NewJSObject(Top::object_function(), TENURED)); | |
| 482 | 482 |
| 483 // Allocate the function map first and then patch the prototype later | 483 // Allocate the function map first and then patch the prototype later |
| 484 Handle<Map> empty_fm = Factory::CopyMapDropDescriptors(fm); | 484 Handle<Map> empty_fm = Factory::CopyMapDropDescriptors( |
| 485 empty_fm->set_instance_descriptors(*function_map_descriptors); | 485 function_without_prototype_map); |
| 486 empty_fm->set_instance_descriptors( |
| 487 *function_without_prototype_map_descriptors); |
| 486 empty_fm->set_prototype(global_context()->object_function()->prototype()); | 488 empty_fm->set_prototype(global_context()->object_function()->prototype()); |
| 487 empty_function->set_map(*empty_fm); | 489 empty_function->set_map(*empty_fm); |
| 488 return empty_function; | 490 return empty_function; |
| 489 } | 491 } |
| 490 | 492 |
| 491 | 493 |
| 492 void Genesis::CreateRoots() { | 494 void Genesis::CreateRoots() { |
| 493 // Allocate the global context FixedArray first and then patch the | 495 // Allocate the global context FixedArray first and then patch the |
| 494 // closure and extension object later (we need the empty function | 496 // closure and extension object later (we need the empty function |
| 495 // and the global object, but in order to create those, we need the | 497 // and the global object, but in order to create those, we need the |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 // only work if it appears to be compiled. | 1253 // only work if it appears to be compiled. |
| 1252 call->shared()->DontAdaptArguments(); | 1254 call->shared()->DontAdaptArguments(); |
| 1253 ASSERT(call->is_compiled()); | 1255 ASSERT(call->is_compiled()); |
| 1254 | 1256 |
| 1255 // Set the expected parameters for apply to 2; required by builtin. | 1257 // Set the expected parameters for apply to 2; required by builtin. |
| 1256 apply->shared()->set_formal_parameter_count(2); | 1258 apply->shared()->set_formal_parameter_count(2); |
| 1257 | 1259 |
| 1258 // Set the lengths for the functions to satisfy ECMA-262. | 1260 // Set the lengths for the functions to satisfy ECMA-262. |
| 1259 call->shared()->set_length(1); | 1261 call->shared()->set_length(1); |
| 1260 apply->shared()->set_length(2); | 1262 apply->shared()->set_length(2); |
| 1261 | |
| 1262 // Install the call, apply, toString and constructor properties | |
| 1263 // for the functions without prototype. | |
| 1264 Handle<JSObject> wp_proto = Handle<JSObject>( | |
| 1265 JSObject::cast(Top::function_without_prototype_map()->prototype())); | |
| 1266 | |
| 1267 Handle<String> call_symbol = Factory::LookupAsciiSymbol("call"); | |
| 1268 SetProperty(wp_proto, call_symbol, call, DONT_ENUM); | |
| 1269 | |
| 1270 Handle<String> apply_symbol = Factory::LookupAsciiSymbol("apply"); | |
| 1271 SetProperty(wp_proto, apply_symbol, apply, DONT_ENUM); | |
| 1272 | |
| 1273 Handle<Object> to_string = GetProperty(proto, "toString"); | |
| 1274 Handle<String> to_string_symbol = Factory::LookupAsciiSymbol("toString"); | |
| 1275 SetProperty(wp_proto, to_string_symbol, to_string, DONT_ENUM); | |
| 1276 | |
| 1277 SetProperty(wp_proto, Factory::constructor_symbol(), function, DONT_ENUM); | |
| 1278 } | 1263 } |
| 1279 | 1264 |
| 1280 // Create a constructor for RegExp results (a variant of Array that | 1265 // Create a constructor for RegExp results (a variant of Array that |
| 1281 // predefines the two properties index and match). | 1266 // predefines the two properties index and match). |
| 1282 { | 1267 { |
| 1283 // RegExpResult initial map. | 1268 // RegExpResult initial map. |
| 1284 | 1269 |
| 1285 // Find global.Array.prototype to inherit from. | 1270 // Find global.Array.prototype to inherit from. |
| 1286 Handle<JSFunction> array_constructor(global_context()->array_function()); | 1271 Handle<JSFunction> array_constructor(global_context()->array_function()); |
| 1287 Handle<JSObject> array_prototype( | 1272 Handle<JSObject> array_prototype( |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1796 } | 1781 } |
| 1797 | 1782 |
| 1798 | 1783 |
| 1799 // Restore statics that are thread local. | 1784 // Restore statics that are thread local. |
| 1800 char* BootstrapperActive::RestoreState(char* from) { | 1785 char* BootstrapperActive::RestoreState(char* from) { |
| 1801 nesting_ = *reinterpret_cast<int*>(from); | 1786 nesting_ = *reinterpret_cast<int*>(from); |
| 1802 return from + sizeof(nesting_); | 1787 return from + sizeof(nesting_); |
| 1803 } | 1788 } |
| 1804 | 1789 |
| 1805 } } // namespace v8::internal | 1790 } } // namespace v8::internal |
| OLD | NEW |