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/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/extensions/externalize-string-extension.h" | 10 #include "src/extensions/externalize-string-extension.h" |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 | 388 |
389 Handle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name, | 389 Handle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name, |
390 InstanceType type, int instance_size, | 390 InstanceType type, int instance_size, |
391 MaybeHandle<JSObject> maybe_prototype, | 391 MaybeHandle<JSObject> maybe_prototype, |
392 Builtins::Name call, | 392 Builtins::Name call, |
393 PropertyAttributes attributes, | 393 PropertyAttributes attributes, |
394 bool strict_function_map = false) { | 394 bool strict_function_map = false) { |
395 Isolate* isolate = target->GetIsolate(); | 395 Isolate* isolate = target->GetIsolate(); |
396 Factory* factory = isolate->factory(); | 396 Factory* factory = isolate->factory(); |
397 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); | 397 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); |
398 Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); | 398 Handle<Code> call_code(isolate->builtins()->builtin(call)); |
399 Handle<JSObject> prototype; | 399 Handle<JSObject> prototype; |
400 static const bool kReadOnlyPrototype = false; | 400 static const bool kReadOnlyPrototype = false; |
401 static const bool kInstallConstructor = false; | 401 static const bool kInstallConstructor = false; |
402 Handle<JSFunction> function = | 402 Handle<JSFunction> function = |
403 maybe_prototype.ToHandle(&prototype) | 403 maybe_prototype.ToHandle(&prototype) |
404 ? factory->NewFunction(name_string, call_code, prototype, type, | 404 ? factory->NewFunction(name_string, call_code, prototype, type, |
405 instance_size, kReadOnlyPrototype, | 405 instance_size, kReadOnlyPrototype, |
406 kInstallConstructor, strict_function_map) | 406 kInstallConstructor, strict_function_map) |
407 : factory->NewFunctionWithoutPrototype(name_string, call_code, | 407 : factory->NewFunctionWithoutPrototype(name_string, call_code, |
408 strict_function_map); | 408 strict_function_map); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 .Assert(); | 550 .Assert(); |
551 | 551 |
552 // Allocate initial strong object map. | 552 // Allocate initial strong object map. |
553 Handle<Map> strong_object_map = | 553 Handle<Map> strong_object_map = |
554 Map::Copy(Handle<Map>(object_fun->initial_map()), "EmptyStrongObject"); | 554 Map::Copy(Handle<Map>(object_fun->initial_map()), "EmptyStrongObject"); |
555 strong_object_map->set_is_strong(); | 555 strong_object_map->set_is_strong(); |
556 native_context()->set_js_object_strong_map(*strong_object_map); | 556 native_context()->set_js_object_strong_map(*strong_object_map); |
557 } | 557 } |
558 | 558 |
559 // Allocate the empty function as the prototype for function - ES6 19.2.3 | 559 // Allocate the empty function as the prototype for function - ES6 19.2.3 |
560 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); | 560 Handle<Code> code(isolate->builtins()->EmptyFunction()); |
561 Handle<JSFunction> empty_function = | 561 Handle<JSFunction> empty_function = |
562 factory->NewFunctionWithoutPrototype(factory->empty_string(), code); | 562 factory->NewFunctionWithoutPrototype(factory->empty_string(), code); |
563 | 563 |
564 // Allocate the function map first and then patch the prototype later | 564 // Allocate the function map first and then patch the prototype later |
565 Handle<Map> empty_function_map = | 565 Handle<Map> empty_function_map = |
566 CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); | 566 CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
567 DCHECK(!empty_function_map->is_dictionary_map()); | 567 DCHECK(!empty_function_map->is_dictionary_map()); |
568 Map::SetPrototype(empty_function_map, object_function_prototype); | 568 Map::SetPrototype(empty_function_map, object_function_prototype); |
569 empty_function_map->set_is_prototype_map(true); | 569 empty_function_map->set_is_prototype_map(true); |
570 | 570 |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 Handle<Object> proto_template(global_constructor->prototype_template(), | 966 Handle<Object> proto_template(global_constructor->prototype_template(), |
967 isolate()); | 967 isolate()); |
968 if (!proto_template->IsUndefined()) { | 968 if (!proto_template->IsUndefined()) { |
969 js_global_object_template = | 969 js_global_object_template = |
970 Handle<ObjectTemplateInfo>::cast(proto_template); | 970 Handle<ObjectTemplateInfo>::cast(proto_template); |
971 } | 971 } |
972 } | 972 } |
973 | 973 |
974 if (js_global_object_template.is_null()) { | 974 if (js_global_object_template.is_null()) { |
975 Handle<String> name = Handle<String>(heap()->empty_string()); | 975 Handle<String> name = Handle<String>(heap()->empty_string()); |
976 Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( | 976 Handle<Code> code = isolate()->builtins()->Illegal(); |
977 Builtins::kIllegal)); | |
978 Handle<JSObject> prototype = | 977 Handle<JSObject> prototype = |
979 factory()->NewFunctionPrototype(isolate()->object_function()); | 978 factory()->NewFunctionPrototype(isolate()->object_function()); |
980 js_global_object_function = factory()->NewFunction( | 979 js_global_object_function = factory()->NewFunction( |
981 name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize); | 980 name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize); |
982 #ifdef DEBUG | 981 #ifdef DEBUG |
983 LookupIterator it(prototype, factory()->constructor_string(), | 982 LookupIterator it(prototype, factory()->constructor_string(), |
984 LookupIterator::OWN_SKIP_INTERCEPTOR); | 983 LookupIterator::OWN_SKIP_INTERCEPTOR); |
985 Handle<Object> value = JSReceiver::GetProperty(&it).ToHandleChecked(); | 984 Handle<Object> value = JSReceiver::GetProperty(&it).ToHandleChecked(); |
986 DCHECK(it.IsFound()); | 985 DCHECK(it.IsFound()); |
987 DCHECK_EQ(*isolate()->object_function(), *value); | 986 DCHECK_EQ(*isolate()->object_function(), *value); |
988 #endif | 987 #endif |
989 } else { | 988 } else { |
990 Handle<FunctionTemplateInfo> js_global_object_constructor( | 989 Handle<FunctionTemplateInfo> js_global_object_constructor( |
991 FunctionTemplateInfo::cast(js_global_object_template->constructor())); | 990 FunctionTemplateInfo::cast(js_global_object_template->constructor())); |
992 js_global_object_function = ApiNatives::CreateApiFunction( | 991 js_global_object_function = ApiNatives::CreateApiFunction( |
993 isolate(), js_global_object_constructor, factory()->the_hole_value(), | 992 isolate(), js_global_object_constructor, factory()->the_hole_value(), |
994 ApiNatives::GlobalObjectType); | 993 ApiNatives::GlobalObjectType); |
995 } | 994 } |
996 | 995 |
997 js_global_object_function->initial_map()->set_is_prototype_map(true); | 996 js_global_object_function->initial_map()->set_is_prototype_map(true); |
998 js_global_object_function->initial_map()->set_is_hidden_prototype(); | 997 js_global_object_function->initial_map()->set_is_hidden_prototype(); |
999 js_global_object_function->initial_map()->set_dictionary_map(true); | 998 js_global_object_function->initial_map()->set_dictionary_map(true); |
1000 Handle<JSGlobalObject> global_object = | 999 Handle<JSGlobalObject> global_object = |
1001 factory()->NewJSGlobalObject(js_global_object_function); | 1000 factory()->NewJSGlobalObject(js_global_object_function); |
1002 | 1001 |
1003 // Step 2: (re)initialize the global proxy object. | 1002 // Step 2: (re)initialize the global proxy object. |
1004 Handle<JSFunction> global_proxy_function; | 1003 Handle<JSFunction> global_proxy_function; |
1005 if (global_proxy_template.IsEmpty()) { | 1004 if (global_proxy_template.IsEmpty()) { |
1006 Handle<String> name = Handle<String>(heap()->empty_string()); | 1005 Handle<String> name = Handle<String>(heap()->empty_string()); |
1007 Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( | 1006 Handle<Code> code = isolate()->builtins()->Illegal(); |
1008 Builtins::kIllegal)); | |
1009 global_proxy_function = factory()->NewFunction( | 1007 global_proxy_function = factory()->NewFunction( |
1010 name, code, JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize); | 1008 name, code, JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize); |
1011 } else { | 1009 } else { |
1012 Handle<ObjectTemplateInfo> data = | 1010 Handle<ObjectTemplateInfo> data = |
1013 v8::Utils::OpenHandle(*global_proxy_template); | 1011 v8::Utils::OpenHandle(*global_proxy_template); |
1014 Handle<FunctionTemplateInfo> global_constructor( | 1012 Handle<FunctionTemplateInfo> global_constructor( |
1015 FunctionTemplateInfo::cast(data->constructor())); | 1013 FunctionTemplateInfo::cast(data->constructor())); |
1016 global_proxy_function = ApiNatives::CreateApiFunction( | 1014 global_proxy_function = ApiNatives::CreateApiFunction( |
1017 isolate(), global_constructor, factory()->the_hole_value(), | 1015 isolate(), global_constructor, factory()->the_hole_value(), |
1018 ApiNatives::GlobalProxyType); | 1016 ApiNatives::GlobalProxyType); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 | 1094 |
1097 Handle<JSObject> global(native_context()->global_object()); | 1095 Handle<JSObject> global(native_context()->global_object()); |
1098 | 1096 |
1099 // Install global Function object | 1097 // Install global Function object |
1100 Handle<JSFunction> function_function = | 1098 Handle<JSFunction> function_function = |
1101 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, | 1099 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, |
1102 empty_function, Builtins::kIllegal); | 1100 empty_function, Builtins::kIllegal); |
1103 function_function->initial_map()->set_is_callable(); | 1101 function_function->initial_map()->set_is_callable(); |
1104 function_function->initial_map()->set_is_constructor(true); | 1102 function_function->initial_map()->set_is_constructor(true); |
1105 function_function->shared()->set_construct_stub( | 1103 function_function->shared()->set_construct_stub( |
1106 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1104 *isolate->builtins()->JSBuiltinsConstructStub()); |
1107 | 1105 |
1108 { // --- A r r a y --- | 1106 { // --- A r r a y --- |
1109 Handle<JSFunction> array_function = | 1107 Handle<JSFunction> array_function = |
1110 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, | 1108 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, |
1111 isolate->initial_object_prototype(), | 1109 isolate->initial_object_prototype(), |
1112 Builtins::kArrayCode); | 1110 Builtins::kArrayCode); |
1113 array_function->shared()->DontAdaptArguments(); | 1111 array_function->shared()->DontAdaptArguments(); |
1114 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); | 1112 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); |
1115 | 1113 |
1116 // This seems a bit hackish, but we need to make sure Array.length | 1114 // This seems a bit hackish, but we need to make sure Array.length |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 CacheInitialJSArrayMaps(native_context(), initial_strong_map); | 1152 CacheInitialJSArrayMaps(native_context(), initial_strong_map); |
1155 } | 1153 } |
1156 | 1154 |
1157 { // --- N u m b e r --- | 1155 { // --- N u m b e r --- |
1158 Handle<JSFunction> number_fun = | 1156 Handle<JSFunction> number_fun = |
1159 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, | 1157 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, |
1160 isolate->initial_object_prototype(), | 1158 isolate->initial_object_prototype(), |
1161 Builtins::kIllegal); | 1159 Builtins::kIllegal); |
1162 native_context()->set_number_function(*number_fun); | 1160 native_context()->set_number_function(*number_fun); |
1163 number_fun->shared()->set_construct_stub( | 1161 number_fun->shared()->set_construct_stub( |
1164 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1162 *isolate->builtins()->JSBuiltinsConstructStub()); |
1165 } | 1163 } |
1166 | 1164 |
1167 { // --- B o o l e a n --- | 1165 { // --- B o o l e a n --- |
1168 Handle<JSFunction> boolean_fun = | 1166 Handle<JSFunction> boolean_fun = |
1169 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, | 1167 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, |
1170 isolate->initial_object_prototype(), | 1168 isolate->initial_object_prototype(), |
1171 Builtins::kIllegal); | 1169 Builtins::kIllegal); |
1172 native_context()->set_boolean_function(*boolean_fun); | 1170 native_context()->set_boolean_function(*boolean_fun); |
1173 } | 1171 } |
1174 | 1172 |
1175 { // --- S t r i n g --- | 1173 { // --- S t r i n g --- |
1176 Handle<JSFunction> string_fun = InstallFunction( | 1174 Handle<JSFunction> string_fun = InstallFunction( |
1177 global, "String", JS_VALUE_TYPE, JSValue::kSize, | 1175 global, "String", JS_VALUE_TYPE, JSValue::kSize, |
1178 isolate->initial_object_prototype(), Builtins::kStringConstructor); | 1176 isolate->initial_object_prototype(), Builtins::kStringConstructor); |
1179 string_fun->shared()->set_construct_stub(isolate->builtins()->builtin( | 1177 string_fun->shared()->set_construct_stub( |
1180 Builtins::kStringConstructor_ConstructStub)); | 1178 *isolate->builtins()->StringConstructor_ConstructStub()); |
1181 string_fun->shared()->DontAdaptArguments(); | 1179 string_fun->shared()->DontAdaptArguments(); |
1182 string_fun->shared()->set_length(1); | 1180 string_fun->shared()->set_length(1); |
1183 native_context()->set_string_function(*string_fun); | 1181 native_context()->set_string_function(*string_fun); |
1184 | 1182 |
1185 Handle<Map> string_map = | 1183 Handle<Map> string_map = |
1186 Handle<Map>(native_context()->string_function()->initial_map()); | 1184 Handle<Map>(native_context()->string_function()->initial_map()); |
1187 Map::EnsureDescriptorSlack(string_map, 1); | 1185 Map::EnsureDescriptorSlack(string_map, 1); |
1188 | 1186 |
1189 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 1187 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
1190 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1188 DONT_ENUM | DONT_DELETE | READ_ONLY); |
1191 Handle<AccessorInfo> string_length( | 1189 Handle<AccessorInfo> string_length( |
1192 Accessors::StringLengthInfo(isolate, attribs)); | 1190 Accessors::StringLengthInfo(isolate, attribs)); |
1193 | 1191 |
1194 { // Add length. | 1192 { // Add length. |
1195 AccessorConstantDescriptor d(factory->length_string(), string_length, | 1193 AccessorConstantDescriptor d(factory->length_string(), string_length, |
1196 attribs); | 1194 attribs); |
1197 string_map->AppendDescriptor(&d); | 1195 string_map->AppendDescriptor(&d); |
1198 } | 1196 } |
1199 } | 1197 } |
1200 | 1198 |
1201 { | 1199 { |
1202 // --- S y m b o l --- | 1200 // --- S y m b o l --- |
1203 Handle<JSFunction> symbol_fun = InstallFunction( | 1201 Handle<JSFunction> symbol_fun = InstallFunction( |
1204 global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, | 1202 global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, |
1205 isolate->initial_object_prototype(), Builtins::kSymbolConstructor); | 1203 isolate->initial_object_prototype(), Builtins::kSymbolConstructor); |
1206 symbol_fun->shared()->set_construct_stub(isolate->builtins()->builtin( | 1204 symbol_fun->shared()->set_construct_stub( |
1207 Builtins::kSymbolConstructor_ConstructStub)); | 1205 *isolate->builtins()->SymbolConstructor_ConstructStub()); |
1208 symbol_fun->shared()->set_internal_formal_parameter_count(1); | 1206 symbol_fun->shared()->set_internal_formal_parameter_count(1); |
1209 symbol_fun->shared()->set_length(1); | 1207 symbol_fun->shared()->set_length(1); |
1210 native_context()->set_symbol_function(*symbol_fun); | 1208 native_context()->set_symbol_function(*symbol_fun); |
1211 } | 1209 } |
1212 | 1210 |
1213 { // --- D a t e --- | 1211 { // --- D a t e --- |
1214 // Builtin functions for Date.prototype. | 1212 // Builtin functions for Date.prototype. |
1215 Handle<JSFunction> date_fun = InstallFunction( | 1213 Handle<JSFunction> date_fun = InstallFunction( |
1216 global, "Date", JS_DATE_TYPE, JSDate::kSize, | 1214 global, "Date", JS_DATE_TYPE, JSDate::kSize, |
1217 isolate->initial_object_prototype(), Builtins::kIllegal); | 1215 isolate->initial_object_prototype(), Builtins::kIllegal); |
1218 date_fun->shared()->set_construct_stub( | 1216 date_fun->shared()->set_construct_stub( |
1219 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1217 *isolate->builtins()->JSBuiltinsConstructStub()); |
1220 } | 1218 } |
1221 | 1219 |
1222 { // -- R e g E x p | 1220 { // -- R e g E x p |
1223 // Builtin functions for RegExp.prototype. | 1221 // Builtin functions for RegExp.prototype. |
1224 Handle<JSFunction> regexp_fun = | 1222 Handle<JSFunction> regexp_fun = |
1225 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, | 1223 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, |
1226 isolate->initial_object_prototype(), | 1224 isolate->initial_object_prototype(), |
1227 Builtins::kIllegal); | 1225 Builtins::kIllegal); |
1228 native_context()->set_regexp_function(*regexp_fun); | 1226 native_context()->set_regexp_function(*regexp_fun); |
1229 regexp_fun->shared()->set_construct_stub( | 1227 regexp_fun->shared()->set_construct_stub( |
1230 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1228 *isolate->builtins()->JSBuiltinsConstructStub()); |
1231 | 1229 |
1232 DCHECK(regexp_fun->has_initial_map()); | 1230 DCHECK(regexp_fun->has_initial_map()); |
1233 Handle<Map> initial_map(regexp_fun->initial_map()); | 1231 Handle<Map> initial_map(regexp_fun->initial_map()); |
1234 | 1232 |
1235 DCHECK_EQ(0, initial_map->GetInObjectProperties()); | 1233 DCHECK_EQ(0, initial_map->GetInObjectProperties()); |
1236 | 1234 |
1237 Map::EnsureDescriptorSlack(initial_map, 1); | 1235 Map::EnsureDescriptorSlack(initial_map, 1); |
1238 | 1236 |
1239 // ECMA-262, section 15.10.7.5. | 1237 // ECMA-262, section 15.10.7.5. |
1240 PropertyAttributes writable = | 1238 PropertyAttributes writable = |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1301 #undef INSTALL_TYPED_ARRAY | 1299 #undef INSTALL_TYPED_ARRAY |
1302 | 1300 |
1303 Handle<JSFunction> data_view_fun = | 1301 Handle<JSFunction> data_view_fun = |
1304 InstallFunction( | 1302 InstallFunction( |
1305 global, "DataView", JS_DATA_VIEW_TYPE, | 1303 global, "DataView", JS_DATA_VIEW_TYPE, |
1306 JSDataView::kSizeWithInternalFields, | 1304 JSDataView::kSizeWithInternalFields, |
1307 isolate->initial_object_prototype(), | 1305 isolate->initial_object_prototype(), |
1308 Builtins::kIllegal); | 1306 Builtins::kIllegal); |
1309 native_context()->set_data_view_fun(*data_view_fun); | 1307 native_context()->set_data_view_fun(*data_view_fun); |
1310 data_view_fun->shared()->set_construct_stub( | 1308 data_view_fun->shared()->set_construct_stub( |
1311 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1309 *isolate->builtins()->JSBuiltinsConstructStub()); |
1312 } | 1310 } |
1313 | 1311 |
1314 { // -- M a p | 1312 { // -- M a p |
1315 Handle<JSFunction> js_map_fun = InstallFunction( | 1313 Handle<JSFunction> js_map_fun = InstallFunction( |
1316 global, "Map", JS_MAP_TYPE, JSMap::kSize, | 1314 global, "Map", JS_MAP_TYPE, JSMap::kSize, |
1317 isolate->initial_object_prototype(), Builtins::kIllegal); | 1315 isolate->initial_object_prototype(), Builtins::kIllegal); |
1318 native_context()->set_js_map_fun(*js_map_fun); | 1316 native_context()->set_js_map_fun(*js_map_fun); |
1319 } | 1317 } |
1320 | 1318 |
1321 { // -- S e t | 1319 { // -- S e t |
(...skipping 30 matching lines...) Expand all Loading... |
1352 isolate->initial_object_prototype(), Builtins::kIllegal); | 1350 isolate->initial_object_prototype(), Builtins::kIllegal); |
1353 // -- W e a k S e t | 1351 // -- W e a k S e t |
1354 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, | 1352 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, |
1355 isolate->initial_object_prototype(), Builtins::kIllegal); | 1353 isolate->initial_object_prototype(), Builtins::kIllegal); |
1356 | 1354 |
1357 { // --- sloppy arguments map | 1355 { // --- sloppy arguments map |
1358 // Make sure we can recognize argument objects at runtime. | 1356 // Make sure we can recognize argument objects at runtime. |
1359 // This is done by introducing an anonymous function with | 1357 // This is done by introducing an anonymous function with |
1360 // class_name equals 'Arguments'. | 1358 // class_name equals 'Arguments'. |
1361 Handle<String> arguments_string = factory->Arguments_string(); | 1359 Handle<String> arguments_string = factory->Arguments_string(); |
1362 Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); | 1360 Handle<Code> code = isolate->builtins()->Illegal(); |
1363 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( | 1361 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( |
1364 arguments_string, code); | 1362 arguments_string, code); |
1365 function->shared()->set_instance_class_name(*arguments_string); | 1363 function->shared()->set_instance_class_name(*arguments_string); |
1366 | 1364 |
1367 Handle<Map> map = factory->NewMap( | 1365 Handle<Map> map = factory->NewMap( |
1368 JS_OBJECT_TYPE, Heap::kSloppyArgumentsObjectSize, FAST_ELEMENTS); | 1366 JS_OBJECT_TYPE, Heap::kSloppyArgumentsObjectSize, FAST_ELEMENTS); |
1369 // Create the descriptor array for the arguments object. | 1367 // Create the descriptor array for the arguments object. |
1370 Map::EnsureDescriptorSlack(map, 2); | 1368 Map::EnsureDescriptorSlack(map, 2); |
1371 | 1369 |
1372 { // length | 1370 { // length |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 | 1455 |
1458 native_context()->set_strict_arguments_map(*map); | 1456 native_context()->set_strict_arguments_map(*map); |
1459 | 1457 |
1460 DCHECK(map->GetInObjectProperties() > Heap::kArgumentsLengthIndex); | 1458 DCHECK(map->GetInObjectProperties() > Heap::kArgumentsLengthIndex); |
1461 DCHECK(!map->is_dictionary_map()); | 1459 DCHECK(!map->is_dictionary_map()); |
1462 DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 1460 DCHECK(IsFastObjectElementsKind(map->elements_kind())); |
1463 } | 1461 } |
1464 | 1462 |
1465 { // --- context extension | 1463 { // --- context extension |
1466 // Create a function for the context extension objects. | 1464 // Create a function for the context extension objects. |
1467 Handle<Code> code = Handle<Code>( | 1465 Handle<Code> code = isolate->builtins()->Illegal(); |
1468 isolate->builtins()->builtin(Builtins::kIllegal)); | |
1469 Handle<JSFunction> context_extension_fun = factory->NewFunction( | 1466 Handle<JSFunction> context_extension_fun = factory->NewFunction( |
1470 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, | 1467 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
1471 JSObject::kHeaderSize); | 1468 JSObject::kHeaderSize); |
1472 | 1469 |
1473 Handle<String> name = factory->InternalizeOneByteString( | 1470 Handle<String> name = factory->InternalizeOneByteString( |
1474 STATIC_CHAR_VECTOR("context_extension")); | 1471 STATIC_CHAR_VECTOR("context_extension")); |
1475 context_extension_fun->shared()->set_instance_class_name(*name); | 1472 context_extension_fun->shared()->set_instance_class_name(*name); |
1476 native_context()->set_context_extension_function(*context_extension_fun); | 1473 native_context()->set_context_extension_function(*context_extension_fun); |
1477 } | 1474 } |
1478 | 1475 |
1479 | 1476 |
1480 { | 1477 { |
1481 // Set up the call-as-function delegate. | 1478 // Set up the call-as-function delegate. |
1482 Handle<Code> code = | 1479 Handle<Code> code = isolate->builtins()->HandleApiCallAsFunction(); |
1483 Handle<Code>(isolate->builtins()->builtin( | |
1484 Builtins::kHandleApiCallAsFunction)); | |
1485 Handle<JSFunction> delegate = factory->NewFunction( | 1480 Handle<JSFunction> delegate = factory->NewFunction( |
1486 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); | 1481 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); |
1487 native_context()->set_call_as_function_delegate(*delegate); | 1482 native_context()->set_call_as_function_delegate(*delegate); |
1488 delegate->shared()->DontAdaptArguments(); | 1483 delegate->shared()->DontAdaptArguments(); |
1489 } | 1484 } |
1490 | 1485 |
1491 { | 1486 { |
1492 // Set up the call-as-constructor delegate. | 1487 // Set up the call-as-constructor delegate. |
1493 Handle<Code> code = | 1488 Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor(); |
1494 Handle<Code>(isolate->builtins()->builtin( | |
1495 Builtins::kHandleApiCallAsConstructor)); | |
1496 Handle<JSFunction> delegate = factory->NewFunction( | 1489 Handle<JSFunction> delegate = factory->NewFunction( |
1497 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); | 1490 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); |
1498 native_context()->set_call_as_constructor_delegate(*delegate); | 1491 native_context()->set_call_as_constructor_delegate(*delegate); |
1499 delegate->shared()->DontAdaptArguments(); | 1492 delegate->shared()->DontAdaptArguments(); |
1500 } | 1493 } |
1501 } | 1494 } |
1502 | 1495 |
1503 | 1496 |
1504 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, | 1497 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, |
1505 Handle<JSFunction>* fun) { | 1498 Handle<JSFunction>* fun) { |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1846 generator_function_prototype, NONE); | 1839 generator_function_prototype, NONE); |
1847 | 1840 |
1848 static const bool kUseStrictFunctionMap = true; | 1841 static const bool kUseStrictFunctionMap = true; |
1849 Handle<JSFunction> generator_function_function = | 1842 Handle<JSFunction> generator_function_function = |
1850 InstallFunction(container, "GeneratorFunction", JS_FUNCTION_TYPE, | 1843 InstallFunction(container, "GeneratorFunction", JS_FUNCTION_TYPE, |
1851 JSFunction::kSize, generator_function_prototype, | 1844 JSFunction::kSize, generator_function_prototype, |
1852 Builtins::kIllegal, kUseStrictFunctionMap); | 1845 Builtins::kIllegal, kUseStrictFunctionMap); |
1853 generator_function_function->initial_map()->set_is_callable(); | 1846 generator_function_function->initial_map()->set_is_callable(); |
1854 generator_function_function->initial_map()->set_is_constructor(true); | 1847 generator_function_function->initial_map()->set_is_constructor(true); |
1855 generator_function_function->shared()->set_construct_stub( | 1848 generator_function_function->shared()->set_construct_stub( |
1856 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 1849 *isolate->builtins()->JSBuiltinsConstructStub()); |
1857 } | 1850 } |
1858 | 1851 |
1859 { // -- S e t I t e r a t o r | 1852 { // -- S e t I t e r a t o r |
1860 Handle<JSObject> set_iterator_prototype = | 1853 Handle<JSObject> set_iterator_prototype = |
1861 isolate->factory()->NewJSObject(isolate->object_function(), TENURED); | 1854 isolate->factory()->NewJSObject(isolate->object_function(), TENURED); |
1862 SetObjectPrototype(set_iterator_prototype, iterator_prototype); | 1855 SetObjectPrototype(set_iterator_prototype, iterator_prototype); |
1863 Handle<JSFunction> set_iterator_function = InstallFunction( | 1856 Handle<JSFunction> set_iterator_function = InstallFunction( |
1864 container, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize, | 1857 container, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize, |
1865 set_iterator_prototype, Builtins::kIllegal); | 1858 set_iterator_prototype, Builtins::kIllegal); |
1866 native_context->set_set_iterator_map(set_iterator_function->initial_map()); | 1859 native_context->set_set_iterator_map(set_iterator_function->initial_map()); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2205 if (!FLAG_harmony_proxies) return; | 2198 if (!FLAG_harmony_proxies) return; |
2206 Handle<JSGlobalObject> global( | 2199 Handle<JSGlobalObject> global( |
2207 JSGlobalObject::cast(native_context()->global_object())); | 2200 JSGlobalObject::cast(native_context()->global_object())); |
2208 Isolate* isolate = global->GetIsolate(); | 2201 Isolate* isolate = global->GetIsolate(); |
2209 Handle<JSFunction> proxy_fun = | 2202 Handle<JSFunction> proxy_fun = |
2210 InstallFunction(global, "Proxy", JS_PROXY_TYPE, JSProxy::kSize, | 2203 InstallFunction(global, "Proxy", JS_PROXY_TYPE, JSProxy::kSize, |
2211 isolate->initial_object_prototype(), Builtins::kIllegal); | 2204 isolate->initial_object_prototype(), Builtins::kIllegal); |
2212 // TODO(verwaest): Set to null in InstallFunction. | 2205 // TODO(verwaest): Set to null in InstallFunction. |
2213 proxy_fun->initial_map()->set_prototype(isolate->heap()->null_value()); | 2206 proxy_fun->initial_map()->set_prototype(isolate->heap()->null_value()); |
2214 proxy_fun->shared()->set_construct_stub( | 2207 proxy_fun->shared()->set_construct_stub( |
2215 isolate->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 2208 *isolate->builtins()->JSBuiltinsConstructStub()); |
2216 native_context()->set_proxy_function(*proxy_fun); | 2209 native_context()->set_proxy_function(*proxy_fun); |
2217 } | 2210 } |
2218 | 2211 |
2219 | 2212 |
2220 Handle<JSFunction> Genesis::InstallInternalArray(Handle<JSObject> target, | 2213 Handle<JSFunction> Genesis::InstallInternalArray(Handle<JSObject> target, |
2221 const char* name, | 2214 const char* name, |
2222 ElementsKind elements_kind) { | 2215 ElementsKind elements_kind) { |
2223 // --- I n t e r n a l A r r a y --- | 2216 // --- I n t e r n a l A r r a y --- |
2224 // An array constructor on the builtins object that works like | 2217 // An array constructor on the builtins object that works like |
2225 // the public Array constructor, except that its prototype | 2218 // the public Array constructor, except that its prototype |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2461 | 2454 |
2462 // Set up the Promise constructor. | 2455 // Set up the Promise constructor. |
2463 { | 2456 { |
2464 Handle<String> key = factory()->Promise_string(); | 2457 Handle<String> key = factory()->Promise_string(); |
2465 Handle<JSFunction> function = Handle<JSFunction>::cast( | 2458 Handle<JSFunction> function = Handle<JSFunction>::cast( |
2466 Object::GetProperty(handle(native_context()->global_object()), key) | 2459 Object::GetProperty(handle(native_context()->global_object()), key) |
2467 .ToHandleChecked()); | 2460 .ToHandleChecked()); |
2468 JSFunction::EnsureHasInitialMap(function); | 2461 JSFunction::EnsureHasInitialMap(function); |
2469 function->initial_map()->set_instance_type(JS_PROMISE_TYPE); | 2462 function->initial_map()->set_instance_type(JS_PROMISE_TYPE); |
2470 function->shared()->set_construct_stub( | 2463 function->shared()->set_construct_stub( |
2471 isolate()->builtins()->builtin(Builtins::kJSBuiltinsConstructStub)); | 2464 *isolate()->builtins()->JSBuiltinsConstructStub()); |
2472 } | 2465 } |
2473 | 2466 |
2474 InstallBuiltinFunctionIds(); | 2467 InstallBuiltinFunctionIds(); |
2475 | 2468 |
2476 // Create a constructor for RegExp results (a variant of Array that | 2469 // Create a constructor for RegExp results (a variant of Array that |
2477 // predefines the two properties index and match). | 2470 // predefines the two properties index and match). |
2478 { | 2471 { |
2479 // RegExpResult initial map. | 2472 // RegExpResult initial map. |
2480 | 2473 |
2481 // Find global.Array.prototype to inherit from. | 2474 // Find global.Array.prototype to inherit from. |
(...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3277 } | 3270 } |
3278 | 3271 |
3279 | 3272 |
3280 // Called when the top-level V8 mutex is destroyed. | 3273 // Called when the top-level V8 mutex is destroyed. |
3281 void Bootstrapper::FreeThreadResources() { | 3274 void Bootstrapper::FreeThreadResources() { |
3282 DCHECK(!IsActive()); | 3275 DCHECK(!IsActive()); |
3283 } | 3276 } |
3284 | 3277 |
3285 } // namespace internal | 3278 } // namespace internal |
3286 } // namespace v8 | 3279 } // namespace v8 |
OLD | NEW |