OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
885 // is 1. | 885 // is 1. |
886 array_function->shared()->set_length(1); | 886 array_function->shared()->set_length(1); |
887 Handle<DescriptorArray> array_descriptors = | 887 Handle<DescriptorArray> array_descriptors = |
888 factory->CopyAppendForeignDescriptor( | 888 factory->CopyAppendForeignDescriptor( |
889 factory->empty_descriptor_array(), | 889 factory->empty_descriptor_array(), |
890 factory->length_symbol(), | 890 factory->length_symbol(), |
891 factory->NewForeign(&Accessors::ArrayLength), | 891 factory->NewForeign(&Accessors::ArrayLength), |
892 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); | 892 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); |
893 | 893 |
894 // Cache the fast JavaScript array map | 894 // Cache the fast JavaScript array map |
895 global_context()->set_js_array_map(array_function->initial_map()); | 895 Map* initial_map = array_function->initial_map(); |
896 global_context()->js_array_map()->set_instance_descriptors( | 896 initial_map->set_instance_descriptors(*array_descriptors); |
897 *array_descriptors); | |
898 // array_function is used internally. JS code creating array object should | 897 // array_function is used internally. JS code creating array object should |
899 // search for the 'Array' property on the global object and use that one | 898 // search for the 'Array' property on the global object and use that one |
900 // as the constructor. 'Array' property on a global object can be | 899 // as the constructor. 'Array' property on a global object can be |
901 // overwritten by JS code. | 900 // overwritten by JS code. |
902 global_context()->set_array_function(*array_function); | 901 global_context()->set_array_function(*array_function); |
903 } | 902 } |
904 | 903 |
905 { // --- N u m b e r --- | 904 { // --- N u m b e r --- |
906 Handle<JSFunction> number_fun = | 905 Handle<JSFunction> number_fun = |
907 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, | 906 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1630 array_function->shared()->DontAdaptArguments(); | 1629 array_function->shared()->DontAdaptArguments(); |
1631 | 1630 |
1632 // InternalArrays should not use Smi-Only array optimizations. There are too | 1631 // InternalArrays should not use Smi-Only array optimizations. There are too |
1633 // many places in the C++ runtime code (e.g. RegEx) that assume that | 1632 // many places in the C++ runtime code (e.g. RegEx) that assume that |
1634 // elements in InternalArrays can be set to non-Smi values without going | 1633 // elements in InternalArrays can be set to non-Smi values without going |
1635 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT | 1634 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT |
1636 // transition easy to trap. Moreover, they rarely are smi-only. | 1635 // transition easy to trap. Moreover, they rarely are smi-only. |
1637 MaybeObject* maybe_map = | 1636 MaybeObject* maybe_map = |
1638 array_function->initial_map()->CopyDropTransitions(); | 1637 array_function->initial_map()->CopyDropTransitions(); |
1639 Map* new_map; | 1638 Map* new_map; |
1640 if (!maybe_map->To<Map>(&new_map)) return maybe_map; | 1639 if (!maybe_map->To<Map>(&new_map)) return false; |
1641 new_map->set_elements_kind(FAST_ELEMENTS); | 1640 new_map->set_elements_kind(FAST_ELEMENTS); |
1642 array_function->set_initial_map(new_map); | 1641 array_function->set_initial_map(new_map); |
1643 | 1642 |
1644 // Make "length" magic on instances. | 1643 // Make "length" magic on instances. |
1645 Handle<DescriptorArray> array_descriptors = | 1644 Handle<DescriptorArray> array_descriptors = |
1646 factory()->CopyAppendForeignDescriptor( | 1645 factory()->CopyAppendForeignDescriptor( |
1647 factory()->empty_descriptor_array(), | 1646 factory()->empty_descriptor_array(), |
1648 factory()->length_symbol(), | 1647 factory()->length_symbol(), |
1649 factory()->NewForeign(&Accessors::ArrayLength), | 1648 factory()->NewForeign(&Accessors::ArrayLength), |
1650 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); | 1649 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1729 // Add initial map. | 1728 // Add initial map. |
1730 Handle<Map> initial_map = | 1729 Handle<Map> initial_map = |
1731 factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); | 1730 factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); |
1732 initial_map->set_constructor(*array_constructor); | 1731 initial_map->set_constructor(*array_constructor); |
1733 | 1732 |
1734 // Set prototype on map. | 1733 // Set prototype on map. |
1735 initial_map->set_non_instance_prototype(false); | 1734 initial_map->set_non_instance_prototype(false); |
1736 initial_map->set_prototype(*array_prototype); | 1735 initial_map->set_prototype(*array_prototype); |
1737 | 1736 |
1738 // Update map with length accessor from Array and add "index" and "input". | 1737 // Update map with length accessor from Array and add "index" and "input". |
1739 Handle<Map> array_map(global_context()->js_array_map()); | |
1740 Handle<DescriptorArray> array_descriptors( | |
1741 array_map->instance_descriptors()); | |
1742 ASSERT_EQ(1, array_descriptors->number_of_descriptors()); | |
1743 | |
1744 Handle<DescriptorArray> reresult_descriptors = | 1738 Handle<DescriptorArray> reresult_descriptors = |
1745 factory()->NewDescriptorArray(3); | 1739 factory()->NewDescriptorArray(3); |
1746 | |
1747 DescriptorArray::WhitenessWitness witness(*reresult_descriptors); | 1740 DescriptorArray::WhitenessWitness witness(*reresult_descriptors); |
1748 | 1741 |
1749 reresult_descriptors->CopyFrom(0, *array_descriptors, 0, witness); | 1742 JSFunction* array_function = global_context()->array_function(); |
1743 Handle<DescriptorArray> array_descriptors( | |
1744 array_function->initial_map()->instance_descriptors()); | |
1745 int index = array_descriptors->SearchWithCache(heap()->length_symbol()); | |
1746 reresult_descriptors->CopyFrom(0, *array_descriptors, index, witness); | |
1750 | 1747 |
1751 int enum_index = 0; | 1748 int enum_index = 0; |
1752 { | 1749 { |
1753 FieldDescriptor index_field(heap()->index_symbol(), | 1750 FieldDescriptor index_field(heap()->index_symbol(), |
1754 JSRegExpResult::kIndexIndex, | 1751 JSRegExpResult::kIndexIndex, |
1755 NONE, | 1752 NONE, |
1756 enum_index++); | 1753 enum_index++); |
1757 reresult_descriptors->Set(1, &index_field, witness); | 1754 reresult_descriptors->Set(1, &index_field, witness); |
1758 } | 1755 } |
1759 | 1756 |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2317 InstallJSFunctionResultCaches(); | 2314 InstallJSFunctionResultCaches(); |
2318 InitializeNormalizedMapCaches(); | 2315 InitializeNormalizedMapCaches(); |
2319 if (!InstallNatives()) return; | 2316 if (!InstallNatives()) return; |
2320 | 2317 |
2321 MakeFunctionInstancePrototypeWritable(); | 2318 MakeFunctionInstancePrototypeWritable(); |
2322 | 2319 |
2323 if (!ConfigureGlobalObjects(global_template)) return; | 2320 if (!ConfigureGlobalObjects(global_template)) return; |
2324 isolate->counters()->contexts_created_from_scratch()->Increment(); | 2321 isolate->counters()->contexts_created_from_scratch()->Increment(); |
2325 } | 2322 } |
2326 | 2323 |
2324 Handle<Context> context = global_context(); | |
2325 context->set_untransitioned_js_array_map( | |
2326 context->array_function()->initial_map()); | |
2327 context->set_fast_array_element_bias(0); | |
Jakob Kummerow
2012/01/04 20:55:17
I have a weak preference to use "Smi::FromInt(0)"
| |
2328 | |
2327 // Initialize experimental globals and install experimental natives. | 2329 // Initialize experimental globals and install experimental natives. |
2328 InitializeExperimentalGlobal(); | 2330 InitializeExperimentalGlobal(); |
2329 if (!InstallExperimentalNatives()) return; | 2331 if (!InstallExperimentalNatives()) return; |
2330 | 2332 |
2331 result_ = global_context_; | 2333 result_ = global_context_; |
2332 } | 2334 } |
2333 | 2335 |
2334 | 2336 |
2335 // Support for thread preemption. | 2337 // Support for thread preemption. |
2336 | 2338 |
(...skipping 17 matching lines...) Expand all Loading... | |
2354 return from + sizeof(NestingCounterType); | 2356 return from + sizeof(NestingCounterType); |
2355 } | 2357 } |
2356 | 2358 |
2357 | 2359 |
2358 // Called when the top-level V8 mutex is destroyed. | 2360 // Called when the top-level V8 mutex is destroyed. |
2359 void Bootstrapper::FreeThreadResources() { | 2361 void Bootstrapper::FreeThreadResources() { |
2360 ASSERT(!IsActive()); | 2362 ASSERT(!IsActive()); |
2361 } | 2363 } |
2362 | 2364 |
2363 } } // namespace v8::internal | 2365 } } // namespace v8::internal |
OLD | NEW |