OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 | 859 |
860 { // --- A r r a y --- | 860 { // --- A r r a y --- |
861 Handle<JSFunction> array_function = | 861 Handle<JSFunction> array_function = |
862 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, | 862 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, |
863 isolate->initial_object_prototype(), | 863 isolate->initial_object_prototype(), |
864 Builtins::kArrayCode, true); | 864 Builtins::kArrayCode, true); |
865 array_function->shared()->set_construct_stub( | 865 array_function->shared()->set_construct_stub( |
866 isolate->builtins()->builtin(Builtins::kArrayConstructCode)); | 866 isolate->builtins()->builtin(Builtins::kArrayConstructCode)); |
867 array_function->shared()->DontAdaptArguments(); | 867 array_function->shared()->DontAdaptArguments(); |
868 | 868 |
| 869 |
869 // This seems a bit hackish, but we need to make sure Array.length | 870 // This seems a bit hackish, but we need to make sure Array.length |
870 // is 1. | 871 // is 1. |
871 array_function->shared()->set_length(1); | 872 array_function->shared()->set_length(1); |
872 Handle<DescriptorArray> array_descriptors = | 873 |
873 factory->CopyAppendForeignDescriptor( | 874 Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1)); |
874 factory->empty_descriptor_array(), | 875 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
875 factory->length_symbol(), | 876 DONT_ENUM | DONT_DELETE); |
876 factory->NewForeign(&Accessors::ArrayLength), | 877 |
877 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); | 878 DescriptorArray::WhitenessWitness witness(*array_descriptors); |
| 879 |
| 880 { // Add length. |
| 881 Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength)); |
| 882 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); |
| 883 array_descriptors->Append(&d, witness); |
| 884 } |
878 | 885 |
879 // array_function is used internally. JS code creating array object should | 886 // array_function is used internally. JS code creating array object should |
880 // search for the 'Array' property on the global object and use that one | 887 // search for the 'Array' property on the global object and use that one |
881 // as the constructor. 'Array' property on a global object can be | 888 // as the constructor. 'Array' property on a global object can be |
882 // overwritten by JS code. | 889 // overwritten by JS code. |
883 global_context()->set_array_function(*array_function); | 890 global_context()->set_array_function(*array_function); |
884 array_function->initial_map()->set_instance_descriptors(*array_descriptors); | 891 array_function->initial_map()->set_instance_descriptors(*array_descriptors); |
885 } | 892 } |
886 | 893 |
887 { // --- N u m b e r --- | 894 { // --- N u m b e r --- |
(...skipping 13 matching lines...) Expand all Loading... |
901 } | 908 } |
902 | 909 |
903 { // --- S t r i n g --- | 910 { // --- S t r i n g --- |
904 Handle<JSFunction> string_fun = | 911 Handle<JSFunction> string_fun = |
905 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, | 912 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, |
906 isolate->initial_object_prototype(), | 913 isolate->initial_object_prototype(), |
907 Builtins::kIllegal, true); | 914 Builtins::kIllegal, true); |
908 string_fun->shared()->set_construct_stub( | 915 string_fun->shared()->set_construct_stub( |
909 isolate->builtins()->builtin(Builtins::kStringConstructCode)); | 916 isolate->builtins()->builtin(Builtins::kStringConstructCode)); |
910 global_context()->set_string_function(*string_fun); | 917 global_context()->set_string_function(*string_fun); |
911 // Add 'length' property to strings. | 918 |
912 Handle<DescriptorArray> string_descriptors = | 919 Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1)); |
913 factory->CopyAppendForeignDescriptor( | 920 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
914 factory->empty_descriptor_array(), | 921 DONT_ENUM | DONT_DELETE | READ_ONLY); |
915 factory->length_symbol(), | 922 |
916 factory->NewForeign(&Accessors::StringLength), | 923 DescriptorArray::WhitenessWitness witness(*string_descriptors); |
917 static_cast<PropertyAttributes>(DONT_ENUM | | 924 |
918 DONT_DELETE | | 925 { // Add length. |
919 READ_ONLY)); | 926 Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength)); |
| 927 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); |
| 928 string_descriptors->Append(&d, witness); |
| 929 } |
920 | 930 |
921 Handle<Map> string_map = | 931 Handle<Map> string_map = |
922 Handle<Map>(global_context()->string_function()->initial_map()); | 932 Handle<Map>(global_context()->string_function()->initial_map()); |
923 string_map->set_instance_descriptors(*string_descriptors); | 933 string_map->set_instance_descriptors(*string_descriptors); |
924 } | 934 } |
925 | 935 |
926 { // --- D a t e --- | 936 { // --- D a t e --- |
927 // Builtin functions for Date.prototype. | 937 // Builtin functions for Date.prototype. |
928 Handle<JSFunction> date_fun = | 938 Handle<JSFunction> date_fun = |
929 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, | 939 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 // Builtin functions for Script. | 1475 // Builtin functions for Script. |
1466 Handle<JSFunction> script_fun = | 1476 Handle<JSFunction> script_fun = |
1467 InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, | 1477 InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, |
1468 isolate()->initial_object_prototype(), | 1478 isolate()->initial_object_prototype(), |
1469 Builtins::kIllegal, false); | 1479 Builtins::kIllegal, false); |
1470 Handle<JSObject> prototype = | 1480 Handle<JSObject> prototype = |
1471 factory()->NewJSObject(isolate()->object_function(), TENURED); | 1481 factory()->NewJSObject(isolate()->object_function(), TENURED); |
1472 SetPrototype(script_fun, prototype); | 1482 SetPrototype(script_fun, prototype); |
1473 global_context()->set_script_function(*script_fun); | 1483 global_context()->set_script_function(*script_fun); |
1474 | 1484 |
1475 // Add 'source' and 'data' property to scripts. | 1485 PropertyAttributes attribs = |
1476 PropertyAttributes common_attributes = | |
1477 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1486 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
1478 Handle<Foreign> foreign_source = | 1487 |
1479 factory()->NewForeign(&Accessors::ScriptSource); | 1488 Handle<DescriptorArray> script_descriptors( |
1480 Handle<DescriptorArray> script_descriptors = | 1489 factory()->NewDescriptorArray(13)); |
1481 factory()->CopyAppendForeignDescriptor( | 1490 |
1482 factory()->empty_descriptor_array(), | 1491 DescriptorArray::WhitenessWitness witness(*script_descriptors); |
1483 factory()->LookupAsciiSymbol("source"), | 1492 |
1484 foreign_source, | 1493 { |
1485 common_attributes); | 1494 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource)); |
1486 Handle<Foreign> foreign_name = | 1495 CallbacksDescriptor d( |
1487 factory()->NewForeign(&Accessors::ScriptName); | 1496 *factory()->LookupAsciiSymbol("source"), *f, attribs); |
1488 script_descriptors = | 1497 script_descriptors->Append(&d, witness); |
1489 factory()->CopyAppendForeignDescriptor( | 1498 } |
1490 script_descriptors, | 1499 |
1491 factory()->LookupAsciiSymbol("name"), | 1500 { |
1492 foreign_name, | 1501 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName)); |
1493 common_attributes); | 1502 CallbacksDescriptor d( |
1494 Handle<Foreign> foreign_id = factory()->NewForeign(&Accessors::ScriptId); | 1503 *factory()->LookupAsciiSymbol("name"), *f, attribs); |
1495 script_descriptors = | 1504 script_descriptors->Append(&d, witness); |
1496 factory()->CopyAppendForeignDescriptor( | 1505 } |
1497 script_descriptors, | 1506 |
1498 factory()->LookupAsciiSymbol("id"), | 1507 { |
1499 foreign_id, | 1508 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId)); |
1500 common_attributes); | 1509 CallbacksDescriptor d( |
1501 Handle<Foreign> foreign_line_offset = | 1510 *factory()->LookupAsciiSymbol("id"), *f, attribs); |
1502 factory()->NewForeign(&Accessors::ScriptLineOffset); | 1511 script_descriptors->Append(&d, witness); |
1503 script_descriptors = | 1512 } |
1504 factory()->CopyAppendForeignDescriptor( | 1513 |
1505 script_descriptors, | 1514 { |
1506 factory()->LookupAsciiSymbol("line_offset"), | 1515 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset)); |
1507 foreign_line_offset, | 1516 CallbacksDescriptor d( |
1508 common_attributes); | 1517 *factory()->LookupAsciiSymbol("line_offset"), *f, attribs); |
1509 Handle<Foreign> foreign_column_offset = | 1518 script_descriptors->Append(&d, witness); |
1510 factory()->NewForeign(&Accessors::ScriptColumnOffset); | 1519 } |
1511 script_descriptors = | 1520 |
1512 factory()->CopyAppendForeignDescriptor( | 1521 { |
1513 script_descriptors, | 1522 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset)); |
1514 factory()->LookupAsciiSymbol("column_offset"), | 1523 CallbacksDescriptor d( |
1515 foreign_column_offset, | 1524 *factory()->LookupAsciiSymbol("column_offset"), *f, attribs); |
1516 common_attributes); | 1525 script_descriptors->Append(&d, witness); |
1517 Handle<Foreign> foreign_data = | 1526 } |
1518 factory()->NewForeign(&Accessors::ScriptData); | 1527 |
1519 script_descriptors = | 1528 { |
1520 factory()->CopyAppendForeignDescriptor( | 1529 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData)); |
1521 script_descriptors, | 1530 CallbacksDescriptor d( |
1522 factory()->LookupAsciiSymbol("data"), | 1531 *factory()->LookupAsciiSymbol("data"), *f, attribs); |
1523 foreign_data, | 1532 script_descriptors->Append(&d, witness); |
1524 common_attributes); | 1533 } |
1525 Handle<Foreign> foreign_type = | 1534 |
1526 factory()->NewForeign(&Accessors::ScriptType); | 1535 { |
1527 script_descriptors = | 1536 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType)); |
1528 factory()->CopyAppendForeignDescriptor( | 1537 CallbacksDescriptor d( |
1529 script_descriptors, | 1538 *factory()->LookupAsciiSymbol("type"), *f, attribs); |
1530 factory()->LookupAsciiSymbol("type"), | 1539 script_descriptors->Append(&d, witness); |
1531 foreign_type, | 1540 } |
1532 common_attributes); | 1541 |
1533 Handle<Foreign> foreign_compilation_type = | 1542 { |
1534 factory()->NewForeign(&Accessors::ScriptCompilationType); | 1543 Handle<Foreign> f(factory()->NewForeign( |
1535 script_descriptors = | 1544 &Accessors::ScriptCompilationType)); |
1536 factory()->CopyAppendForeignDescriptor( | 1545 CallbacksDescriptor d( |
1537 script_descriptors, | 1546 *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs); |
1538 factory()->LookupAsciiSymbol("compilation_type"), | 1547 script_descriptors->Append(&d, witness); |
1539 foreign_compilation_type, | 1548 } |
1540 common_attributes); | 1549 |
1541 Handle<Foreign> foreign_line_ends = | 1550 { |
1542 factory()->NewForeign(&Accessors::ScriptLineEnds); | 1551 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds)); |
1543 script_descriptors = | 1552 CallbacksDescriptor d( |
1544 factory()->CopyAppendForeignDescriptor( | 1553 *factory()->LookupAsciiSymbol("line_ends"), *f, attribs); |
1545 script_descriptors, | 1554 script_descriptors->Append(&d, witness); |
1546 factory()->LookupAsciiSymbol("line_ends"), | 1555 } |
1547 foreign_line_ends, | 1556 |
1548 common_attributes); | 1557 { |
1549 Handle<Foreign> foreign_context_data = | 1558 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData)); |
1550 factory()->NewForeign(&Accessors::ScriptContextData); | 1559 CallbacksDescriptor d( |
1551 script_descriptors = | 1560 *factory()->LookupAsciiSymbol("context_data"), *f, attribs); |
1552 factory()->CopyAppendForeignDescriptor( | 1561 script_descriptors->Append(&d, witness); |
1553 script_descriptors, | 1562 } |
1554 factory()->LookupAsciiSymbol("context_data"), | 1563 |
1555 foreign_context_data, | 1564 { |
1556 common_attributes); | 1565 Handle<Foreign> f(factory()->NewForeign( |
1557 Handle<Foreign> foreign_eval_from_script = | 1566 &Accessors::ScriptEvalFromScript)); |
1558 factory()->NewForeign(&Accessors::ScriptEvalFromScript); | 1567 CallbacksDescriptor d( |
1559 script_descriptors = | 1568 *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs); |
1560 factory()->CopyAppendForeignDescriptor( | 1569 script_descriptors->Append(&d, witness); |
1561 script_descriptors, | 1570 } |
1562 factory()->LookupAsciiSymbol("eval_from_script"), | 1571 |
1563 foreign_eval_from_script, | 1572 { |
1564 common_attributes); | 1573 Handle<Foreign> f(factory()->NewForeign( |
1565 Handle<Foreign> foreign_eval_from_script_position = | 1574 &Accessors::ScriptEvalFromScriptPosition)); |
1566 factory()->NewForeign(&Accessors::ScriptEvalFromScriptPosition); | 1575 CallbacksDescriptor d( |
1567 script_descriptors = | 1576 *factory()->LookupAsciiSymbol("eval_from_script_position"), |
1568 factory()->CopyAppendForeignDescriptor( | 1577 *f, |
1569 script_descriptors, | 1578 attribs); |
1570 factory()->LookupAsciiSymbol("eval_from_script_position"), | 1579 script_descriptors->Append(&d, witness); |
1571 foreign_eval_from_script_position, | 1580 } |
1572 common_attributes); | 1581 |
1573 Handle<Foreign> foreign_eval_from_function_name = | 1582 { |
1574 factory()->NewForeign(&Accessors::ScriptEvalFromFunctionName); | 1583 Handle<Foreign> f(factory()->NewForeign( |
1575 script_descriptors = | 1584 &Accessors::ScriptEvalFromFunctionName)); |
1576 factory()->CopyAppendForeignDescriptor( | 1585 CallbacksDescriptor d( |
1577 script_descriptors, | 1586 *factory()->LookupAsciiSymbol("eval_from_function_name"), |
1578 factory()->LookupAsciiSymbol("eval_from_function_name"), | 1587 *f, |
1579 foreign_eval_from_function_name, | 1588 attribs); |
1580 common_attributes); | 1589 script_descriptors->Append(&d, witness); |
| 1590 } |
| 1591 |
| 1592 script_descriptors->Sort(witness); |
1581 | 1593 |
1582 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); | 1594 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); |
1583 script_map->set_instance_descriptors(*script_descriptors); | 1595 script_map->set_instance_descriptors(*script_descriptors); |
1584 | 1596 |
1585 // Allocate the empty script. | 1597 // Allocate the empty script. |
1586 Handle<Script> script = factory()->NewScript(factory()->empty_string()); | 1598 Handle<Script> script = factory()->NewScript(factory()->empty_string()); |
1587 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 1599 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
1588 heap()->public_set_empty_script(*script); | 1600 heap()->public_set_empty_script(*script); |
1589 } | 1601 } |
1590 { | 1602 { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT | 1642 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT |
1631 // transition easy to trap. Moreover, they rarely are smi-only. | 1643 // transition easy to trap. Moreover, they rarely are smi-only. |
1632 MaybeObject* maybe_map = | 1644 MaybeObject* maybe_map = |
1633 array_function->initial_map()->Copy(DescriptorArray::MAY_BE_SHARED); | 1645 array_function->initial_map()->Copy(DescriptorArray::MAY_BE_SHARED); |
1634 Map* new_map; | 1646 Map* new_map; |
1635 if (!maybe_map->To(&new_map)) return false; | 1647 if (!maybe_map->To(&new_map)) return false; |
1636 new_map->set_elements_kind(FAST_HOLEY_ELEMENTS); | 1648 new_map->set_elements_kind(FAST_HOLEY_ELEMENTS); |
1637 array_function->set_initial_map(new_map); | 1649 array_function->set_initial_map(new_map); |
1638 | 1650 |
1639 // Make "length" magic on instances. | 1651 // Make "length" magic on instances. |
1640 Handle<DescriptorArray> array_descriptors = | 1652 Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1)); |
1641 factory()->CopyAppendForeignDescriptor( | 1653 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
1642 factory()->empty_descriptor_array(), | 1654 DONT_ENUM | DONT_DELETE); |
1643 factory()->length_symbol(), | 1655 |
1644 factory()->NewForeign(&Accessors::ArrayLength), | 1656 DescriptorArray::WhitenessWitness witness(*array_descriptors); |
1645 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); | 1657 |
| 1658 { // Add length. |
| 1659 Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength)); |
| 1660 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); |
| 1661 array_descriptors->Append(&d, witness); |
| 1662 } |
1646 | 1663 |
1647 array_function->initial_map()->set_instance_descriptors( | 1664 array_function->initial_map()->set_instance_descriptors( |
1648 *array_descriptors); | 1665 *array_descriptors); |
1649 | 1666 |
1650 global_context()->set_internal_array_function(*array_function); | 1667 global_context()->set_internal_array_function(*array_function); |
1651 } | 1668 } |
1652 | 1669 |
1653 if (FLAG_disable_native_files) { | 1670 if (FLAG_disable_native_files) { |
1654 PrintF("Warning: Running without installed natives!\n"); | 1671 PrintF("Warning: Running without installed natives!\n"); |
1655 return true; | 1672 return true; |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2353 return from + sizeof(NestingCounterType); | 2370 return from + sizeof(NestingCounterType); |
2354 } | 2371 } |
2355 | 2372 |
2356 | 2373 |
2357 // Called when the top-level V8 mutex is destroyed. | 2374 // Called when the top-level V8 mutex is destroyed. |
2358 void Bootstrapper::FreeThreadResources() { | 2375 void Bootstrapper::FreeThreadResources() { |
2359 ASSERT(!IsActive()); | 2376 ASSERT(!IsActive()); |
2360 } | 2377 } |
2361 | 2378 |
2362 } } // namespace v8::internal | 2379 } } // namespace v8::internal |
OLD | NEW |