OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/extensions/externalize-string-extension.h" | 9 #include "src/extensions/externalize-string-extension.h" |
10 #include "src/extensions/free-buffer-extension.h" | 10 #include "src/extensions/free-buffer-extension.h" |
(...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1126 native_context()->set_data_view_fun(*data_view_fun); | 1126 native_context()->set_data_view_fun(*data_view_fun); |
1127 } | 1127 } |
1128 | 1128 |
1129 // -- W e a k M a p | 1129 // -- W e a k M a p |
1130 InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, | 1130 InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, |
1131 isolate->initial_object_prototype(), Builtins::kIllegal); | 1131 isolate->initial_object_prototype(), Builtins::kIllegal); |
1132 // -- W e a k S e t | 1132 // -- W e a k S e t |
1133 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, | 1133 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, |
1134 isolate->initial_object_prototype(), Builtins::kIllegal); | 1134 isolate->initial_object_prototype(), Builtins::kIllegal); |
1135 | 1135 |
1136 { // --- arguments_boilerplate_ | 1136 { // --- sloppy arguments map |
1137 // Make sure we can recognize argument objects at runtime. | 1137 // Make sure we can recognize argument objects at runtime. |
1138 // This is done by introducing an anonymous function with | 1138 // This is done by introducing an anonymous function with |
1139 // class_name equals 'Arguments'. | 1139 // class_name equals 'Arguments'. |
1140 Handle<String> arguments_string = factory->InternalizeOneByteString( | 1140 Handle<String> arguments_string = factory->InternalizeOneByteString( |
1141 STATIC_ASCII_VECTOR("Arguments")); | 1141 STATIC_ASCII_VECTOR("Arguments")); |
1142 Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); | 1142 Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); |
1143 | |
1144 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( | 1143 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( |
1145 arguments_string, code); | 1144 arguments_string, code); |
1145 function->shared()->set_instance_class_name(*arguments_string); | |
1146 | |
1147 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, | |
1148 Heap::kSloppyArgumentsObjectSize); | |
1149 // Create the descriptor array for the arguments object. | |
1150 Map::EnsureDescriptorSlack(map, 2); | |
1151 | |
1152 { // length | |
1153 FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, | |
1154 DONT_ENUM, Representation::Tagged()); | |
1155 map->AppendDescriptor(&d); | |
1156 } | |
1157 { // callee | |
1158 FieldDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, | |
1159 DONT_ENUM, Representation::Tagged()); | |
1160 map->AppendDescriptor(&d); | |
1161 } | |
1162 | |
1163 map->set_function_with_prototype(true); | |
1164 map->set_prototype(native_context()->object_function()->prototype()); | |
1165 map->set_pre_allocated_property_fields(2); | |
1166 map->set_inobject_properties(2); | |
1167 native_context()->set_sloppy_arguments_map(*map); | |
1168 | |
1146 ASSERT(!function->has_initial_map()); | 1169 ASSERT(!function->has_initial_map()); |
1147 function->shared()->set_instance_class_name(*arguments_string); | 1170 function->set_initial_map(*map); |
1148 function->shared()->set_expected_nof_properties(2); | 1171 map->set_constructor(*function); |
1149 function->set_prototype_or_initial_map( | |
1150 native_context()->object_function()->prototype()); | |
1151 Handle<JSObject> result = factory->NewJSObject(function); | |
1152 | |
1153 native_context()->set_sloppy_arguments_boilerplate(*result); | |
1154 // Note: length must be added as the first property and | |
1155 // callee must be added as the second property. | |
1156 JSObject::AddProperty( | |
1157 result, factory->length_string(), | |
1158 factory->undefined_value(), DONT_ENUM, | |
1159 Object::FORCE_TAGGED, FORCE_FIELD); | |
1160 JSObject::AddProperty( | |
1161 result, factory->callee_string(), | |
1162 factory->undefined_value(), DONT_ENUM, | |
1163 Object::FORCE_TAGGED, FORCE_FIELD); | |
1164 | 1172 |
1165 #ifdef DEBUG | 1173 #ifdef DEBUG |
Igor Sheludko
2014/07/02 14:17:14
Probably we don't need #ifdef DEBUG anymore
| |
1166 LookupResult lookup(isolate); | 1174 ASSERT(map->inobject_properties() > Heap::kArgumentsCalleeIndex); |
1167 result->LookupOwn(factory->callee_string(), &lookup); | 1175 ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
1168 ASSERT(lookup.IsField()); | 1176 ASSERT(!map->is_dictionary_map()); |
1169 ASSERT(lookup.GetFieldIndex().property_index() == | 1177 ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
1170 Heap::kArgumentsCalleeIndex); | |
1171 | |
1172 result->LookupOwn(factory->length_string(), &lookup); | |
1173 ASSERT(lookup.IsField()); | |
1174 ASSERT(lookup.GetFieldIndex().property_index() == | |
1175 Heap::kArgumentsLengthIndex); | |
1176 | |
1177 ASSERT(result->map()->inobject_properties() > Heap::kArgumentsCalleeIndex); | |
1178 ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); | |
1179 | |
1180 // Check the state of the object. | |
1181 ASSERT(result->HasFastProperties()); | |
1182 ASSERT(result->HasFastObjectElements()); | |
1183 #endif | 1178 #endif |
1184 } | 1179 } |
1185 | 1180 |
1186 { // --- aliased_arguments_boilerplate_ | 1181 { // --- aliased arguments map |
1187 // Set up a well-formed parameter map to make assertions happy. | 1182 Handle<Map> map = Map::Copy(isolate->sloppy_arguments_map()); |
1188 Handle<FixedArray> elements = factory->NewFixedArray(2); | 1183 map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); |
1189 elements->set_map(heap->sloppy_arguments_elements_map()); | 1184 ASSERT_EQ(2, map->pre_allocated_property_fields()); |
1190 Handle<FixedArray> array; | 1185 native_context()->set_aliased_arguments_map(*map); |
1191 array = factory->NewFixedArray(0); | |
1192 elements->set(0, *array); | |
1193 array = factory->NewFixedArray(0); | |
1194 elements->set(1, *array); | |
1195 | |
1196 Handle<Map> old_map( | |
1197 native_context()->sloppy_arguments_boilerplate()->map()); | |
1198 Handle<Map> new_map = Map::Copy(old_map); | |
1199 new_map->set_pre_allocated_property_fields(2); | |
1200 Handle<JSObject> result = factory->NewJSObjectFromMap(new_map); | |
1201 // Set elements kind after allocating the object because | |
1202 // NewJSObjectFromMap assumes a fast elements map. | |
1203 new_map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); | |
1204 result->set_elements(*elements); | |
1205 ASSERT(result->HasSloppyArgumentsElements()); | |
1206 native_context()->set_aliased_arguments_boilerplate(*result); | |
1207 } | 1186 } |
1208 | 1187 |
1209 { // --- strict mode arguments boilerplate | 1188 { // --- strict mode arguments map |
1210 const PropertyAttributes attributes = | 1189 const PropertyAttributes attributes = |
1211 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1190 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
1212 | 1191 |
1213 // Create the ThrowTypeError functions. | 1192 // Create the ThrowTypeError functions. |
1214 Handle<AccessorPair> callee = factory->NewAccessorPair(); | 1193 Handle<AccessorPair> callee = factory->NewAccessorPair(); |
1215 Handle<AccessorPair> caller = factory->NewAccessorPair(); | 1194 Handle<AccessorPair> caller = factory->NewAccessorPair(); |
1216 | 1195 |
1217 Handle<JSFunction> poison = GetStrictPoisonFunction(); | 1196 Handle<JSFunction> poison = GetStrictPoisonFunction(); |
1218 | 1197 |
1219 // Install the ThrowTypeError functions. | 1198 // Install the ThrowTypeError functions. |
1220 callee->set_getter(*poison); | 1199 callee->set_getter(*poison); |
1221 callee->set_setter(*poison); | 1200 callee->set_setter(*poison); |
1222 caller->set_getter(*poison); | 1201 caller->set_getter(*poison); |
1223 caller->set_setter(*poison); | 1202 caller->set_setter(*poison); |
1224 | 1203 |
1225 // Create the map. Allocate one in-object field for length. | 1204 // Create the map. Allocate one in-object field for length. |
1226 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, | 1205 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, |
1227 Heap::kStrictArgumentsObjectSize); | 1206 Heap::kStrictArgumentsObjectSize); |
1228 // Create the descriptor array for the arguments object. | 1207 // Create the descriptor array for the arguments object. |
1229 Map::EnsureDescriptorSlack(map, 3); | 1208 Map::EnsureDescriptorSlack(map, 3); |
1230 | 1209 |
1231 { // length | 1210 { // length |
1232 FieldDescriptor d( | 1211 FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, |
1233 factory->length_string(), 0, DONT_ENUM, Representation::Tagged()); | 1212 DONT_ENUM, Representation::Tagged()); |
1234 map->AppendDescriptor(&d); | 1213 map->AppendDescriptor(&d); |
1235 } | 1214 } |
1236 { // callee | 1215 { // callee |
1237 CallbacksDescriptor d(factory->callee_string(), | 1216 CallbacksDescriptor d(factory->callee_string(), callee, attributes); |
1238 callee, | |
1239 attributes); | |
1240 map->AppendDescriptor(&d); | 1217 map->AppendDescriptor(&d); |
1241 } | 1218 } |
1242 { // caller | 1219 { // caller |
1243 CallbacksDescriptor d(factory->caller_string(), | 1220 CallbacksDescriptor d(factory->caller_string(), caller, attributes); |
1244 caller, | |
1245 attributes); | |
1246 map->AppendDescriptor(&d); | 1221 map->AppendDescriptor(&d); |
1247 } | 1222 } |
1248 | 1223 |
1249 map->set_function_with_prototype(true); | 1224 map->set_function_with_prototype(true); |
1250 map->set_prototype(native_context()->object_function()->prototype()); | 1225 map->set_prototype(native_context()->object_function()->prototype()); |
1251 map->set_pre_allocated_property_fields(1); | 1226 map->set_pre_allocated_property_fields(1); |
1252 map->set_inobject_properties(1); | 1227 map->set_inobject_properties(1); |
1253 | 1228 |
1254 // Copy constructor from the sloppy arguments boilerplate. | 1229 // Copy constructor from the sloppy arguments boilerplate. |
1255 map->set_constructor( | 1230 map->set_constructor( |
1256 native_context()->sloppy_arguments_boilerplate()->map()->constructor()); | 1231 native_context()->sloppy_arguments_map()->constructor()); |
1257 | 1232 |
1258 // Allocate the arguments boilerplate object. | 1233 native_context()->set_strict_arguments_map(*map); |
1259 Handle<JSObject> result = factory->NewJSObjectFromMap(map); | |
1260 native_context()->set_strict_arguments_boilerplate(*result); | |
1261 | 1234 |
1262 #ifdef DEBUG | 1235 #ifdef DEBUG |
Igor Sheludko
2014/07/02 14:17:14
Same here.
| |
1263 LookupResult lookup(isolate); | 1236 ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
1264 result->LookupOwn(factory->length_string(), &lookup); | 1237 ASSERT(!map->is_dictionary_map()); |
1265 ASSERT(lookup.IsField()); | 1238 ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
1266 ASSERT(lookup.GetFieldIndex().property_index() == | |
1267 Heap::kArgumentsLengthIndex); | |
1268 | |
1269 Handle<Object> length_value = Object::GetProperty( | |
1270 result, factory->length_string()).ToHandleChecked(); | |
1271 ASSERT_EQ(heap->undefined_value(), *length_value); | |
1272 | |
1273 ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); | |
1274 | |
1275 // Check the state of the object. | |
1276 ASSERT(result->HasFastProperties()); | |
1277 ASSERT(result->HasFastObjectElements()); | |
1278 #endif | 1239 #endif |
1279 } | 1240 } |
1280 | 1241 |
1281 { // --- context extension | 1242 { // --- context extension |
1282 // Create a function for the context extension objects. | 1243 // Create a function for the context extension objects. |
1283 Handle<Code> code = Handle<Code>( | 1244 Handle<Code> code = Handle<Code>( |
1284 isolate->builtins()->builtin(Builtins::kIllegal)); | 1245 isolate->builtins()->builtin(Builtins::kIllegal)); |
1285 Handle<JSFunction> context_extension_fun = factory->NewFunction( | 1246 Handle<JSFunction> context_extension_fun = factory->NewFunction( |
1286 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, | 1247 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
1287 JSObject::kHeaderSize); | 1248 JSObject::kHeaderSize); |
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2729 return from + sizeof(NestingCounterType); | 2690 return from + sizeof(NestingCounterType); |
2730 } | 2691 } |
2731 | 2692 |
2732 | 2693 |
2733 // Called when the top-level V8 mutex is destroyed. | 2694 // Called when the top-level V8 mutex is destroyed. |
2734 void Bootstrapper::FreeThreadResources() { | 2695 void Bootstrapper::FreeThreadResources() { |
2735 ASSERT(!IsActive()); | 2696 ASSERT(!IsActive()); |
2736 } | 2697 } |
2737 | 2698 |
2738 } } // namespace v8::internal | 2699 } } // namespace v8::internal |
OLD | NEW |