Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Side by Side Diff: src/bootstrapper.cc

Issue 265763007: Merge NewFunction and NewFunctionWithPrototype (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "bootstrapper.h" 5 #include "bootstrapper.h"
6 6
7 #include "accessors.h" 7 #include "accessors.h"
8 #include "isolate-inl.h" 8 #include "isolate-inl.h"
9 #include "natives.h" 9 #include "natives.h"
10 #include "snapshot.h" 10 #include "snapshot.h"
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); 343 Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy()));
344 global_proxy->set_native_context(*factory->null_value()); 344 global_proxy->set_native_context(*factory->null_value());
345 SetObjectPrototype(global_proxy, factory->null_value()); 345 SetObjectPrototype(global_proxy, factory->null_value());
346 } 346 }
347 347
348 348
349 static Handle<JSFunction> InstallFunction(Handle<JSObject> target, 349 static Handle<JSFunction> InstallFunction(Handle<JSObject> target,
350 const char* name, 350 const char* name,
351 InstanceType type, 351 InstanceType type,
352 int instance_size, 352 int instance_size,
353 Handle<JSObject> prototype, 353 MaybeHandle<JSObject> maybe_prototype,
354 Builtins::Name call, 354 Builtins::Name call,
355 bool install_initial_map,
356 bool set_instance_class_name) { 355 bool set_instance_class_name) {
357 Isolate* isolate = target->GetIsolate(); 356 Isolate* isolate = target->GetIsolate();
358 Factory* factory = isolate->factory(); 357 Factory* factory = isolate->factory();
359 Handle<String> internalized_name = factory->InternalizeUtf8String(name); 358 Handle<String> internalized_name = factory->InternalizeUtf8String(name);
360 Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); 359 Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call));
361 Handle<JSFunction> function = prototype.is_null() 360 Handle<JSFunction> function = factory->NewFunction(
362 ? factory->NewFunction(internalized_name, call_code) 361 maybe_prototype, internalized_name, type, instance_size, call_code,
363 : factory->NewFunctionWithPrototype(internalized_name, 362 !maybe_prototype.is_null());
364 type,
365 instance_size,
366 prototype,
367 call_code,
368 install_initial_map);
369 PropertyAttributes attributes; 363 PropertyAttributes attributes;
370 if (target->IsJSBuiltinsObject()) { 364 if (target->IsJSBuiltinsObject()) {
371 attributes = 365 attributes =
372 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 366 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
373 } else { 367 } else {
374 attributes = DONT_ENUM; 368 attributes = DONT_ENUM;
375 } 369 }
376 JSObject::SetLocalPropertyIgnoreAttributes( 370 JSObject::SetLocalPropertyIgnoreAttributes(
377 target, internalized_name, function, attributes).Check(); 371 target, internalized_name, function, attributes).Check();
378 if (set_instance_class_name) { 372 if (set_instance_class_name) {
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 832
839 Handle<String> object_name = factory->Object_string(); 833 Handle<String> object_name = factory->Object_string();
840 JSObject::SetLocalPropertyIgnoreAttributes( 834 JSObject::SetLocalPropertyIgnoreAttributes(
841 inner_global, object_name, 835 inner_global, object_name,
842 isolate->object_function(), DONT_ENUM).Check(); 836 isolate->object_function(), DONT_ENUM).Check();
843 837
844 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 838 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
845 839
846 // Install global Function object 840 // Install global Function object
847 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, 841 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
848 empty_function, Builtins::kIllegal, true, true); 842 empty_function, Builtins::kIllegal, true);
849 843
850 { // --- A r r a y --- 844 { // --- A r r a y ---
851 Handle<JSFunction> array_function = 845 Handle<JSFunction> array_function =
852 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, 846 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
853 isolate->initial_object_prototype(), 847 isolate->initial_object_prototype(),
854 Builtins::kArrayCode, true, true); 848 Builtins::kArrayCode, true);
855 array_function->shared()->DontAdaptArguments(); 849 array_function->shared()->DontAdaptArguments();
856 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); 850 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode));
857 851
858 // This seems a bit hackish, but we need to make sure Array.length 852 // This seems a bit hackish, but we need to make sure Array.length
859 // is 1. 853 // is 1.
860 array_function->shared()->set_length(1); 854 array_function->shared()->set_length(1);
861 855
862 Handle<Map> initial_map(array_function->initial_map()); 856 Handle<Map> initial_map(array_function->initial_map());
863 857
864 // This assert protects an optimization in 858 // This assert protects an optimization in
(...skipping 23 matching lines...) Expand all
888 CacheInitialJSArrayMaps(native_context(), initial_map); 882 CacheInitialJSArrayMaps(native_context(), initial_map);
889 ArrayConstructorStub array_constructor_stub(isolate); 883 ArrayConstructorStub array_constructor_stub(isolate);
890 Handle<Code> code = array_constructor_stub.GetCode(); 884 Handle<Code> code = array_constructor_stub.GetCode();
891 array_function->shared()->set_construct_stub(*code); 885 array_function->shared()->set_construct_stub(*code);
892 } 886 }
893 887
894 { // --- N u m b e r --- 888 { // --- N u m b e r ---
895 Handle<JSFunction> number_fun = 889 Handle<JSFunction> number_fun =
896 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, 890 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
897 isolate->initial_object_prototype(), 891 isolate->initial_object_prototype(),
898 Builtins::kIllegal, true, true); 892 Builtins::kIllegal, true);
899 native_context()->set_number_function(*number_fun); 893 native_context()->set_number_function(*number_fun);
900 } 894 }
901 895
902 { // --- B o o l e a n --- 896 { // --- B o o l e a n ---
903 Handle<JSFunction> boolean_fun = 897 Handle<JSFunction> boolean_fun =
904 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, 898 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
905 isolate->initial_object_prototype(), 899 isolate->initial_object_prototype(),
906 Builtins::kIllegal, true, true); 900 Builtins::kIllegal, true);
907 native_context()->set_boolean_function(*boolean_fun); 901 native_context()->set_boolean_function(*boolean_fun);
908 } 902 }
909 903
910 { // --- S t r i n g --- 904 { // --- S t r i n g ---
911 Handle<JSFunction> string_fun = 905 Handle<JSFunction> string_fun =
912 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, 906 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
913 isolate->initial_object_prototype(), 907 isolate->initial_object_prototype(),
914 Builtins::kIllegal, true, true); 908 Builtins::kIllegal, true);
915 string_fun->shared()->set_construct_stub( 909 string_fun->shared()->set_construct_stub(
916 isolate->builtins()->builtin(Builtins::kStringConstructCode)); 910 isolate->builtins()->builtin(Builtins::kStringConstructCode));
917 native_context()->set_string_function(*string_fun); 911 native_context()->set_string_function(*string_fun);
918 912
919 Handle<Map> string_map = 913 Handle<Map> string_map =
920 Handle<Map>(native_context()->string_function()->initial_map()); 914 Handle<Map>(native_context()->string_function()->initial_map());
921 Map::EnsureDescriptorSlack(string_map, 1); 915 Map::EnsureDescriptorSlack(string_map, 1);
922 916
923 PropertyAttributes attribs = static_cast<PropertyAttributes>( 917 PropertyAttributes attribs = static_cast<PropertyAttributes>(
924 DONT_ENUM | DONT_DELETE | READ_ONLY); 918 DONT_ENUM | DONT_DELETE | READ_ONLY);
925 Handle<AccessorInfo> string_length( 919 Handle<AccessorInfo> string_length(
926 Accessors::StringLengthInfo(isolate, attribs)); 920 Accessors::StringLengthInfo(isolate, attribs));
927 921
928 { // Add length. 922 { // Add length.
929 CallbacksDescriptor d(factory->length_string(), string_length, attribs); 923 CallbacksDescriptor d(factory->length_string(), string_length, attribs);
930 string_map->AppendDescriptor(&d); 924 string_map->AppendDescriptor(&d);
931 } 925 }
932 } 926 }
933 927
934 { // --- D a t e --- 928 { // --- D a t e ---
935 // Builtin functions for Date.prototype. 929 // Builtin functions for Date.prototype.
936 Handle<JSFunction> date_fun = 930 Handle<JSFunction> date_fun =
937 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, 931 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize,
938 isolate->initial_object_prototype(), 932 isolate->initial_object_prototype(),
939 Builtins::kIllegal, true, true); 933 Builtins::kIllegal, true);
940 934
941 native_context()->set_date_function(*date_fun); 935 native_context()->set_date_function(*date_fun);
942 } 936 }
943 937
944 938
945 { // -- R e g E x p 939 { // -- R e g E x p
946 // Builtin functions for RegExp.prototype. 940 // Builtin functions for RegExp.prototype.
947 Handle<JSFunction> regexp_fun = 941 Handle<JSFunction> regexp_fun =
948 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, 942 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
949 isolate->initial_object_prototype(), 943 isolate->initial_object_prototype(),
950 Builtins::kIllegal, true, true); 944 Builtins::kIllegal, true);
951 native_context()->set_regexp_function(*regexp_fun); 945 native_context()->set_regexp_function(*regexp_fun);
952 946
953 ASSERT(regexp_fun->has_initial_map()); 947 ASSERT(regexp_fun->has_initial_map());
954 Handle<Map> initial_map(regexp_fun->initial_map()); 948 Handle<Map> initial_map(regexp_fun->initial_map());
955 949
956 ASSERT_EQ(0, initial_map->inobject_properties()); 950 ASSERT_EQ(0, initial_map->inobject_properties());
957 951
958 PropertyAttributes final = 952 PropertyAttributes final =
959 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 953 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
960 Map::EnsureDescriptorSlack(initial_map, 5); 954 Map::EnsureDescriptorSlack(initial_map, 5);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 global, name, json_object, DONT_ENUM).Check(); 1037 global, name, json_object, DONT_ENUM).Check();
1044 native_context()->set_json_object(*json_object); 1038 native_context()->set_json_object(*json_object);
1045 } 1039 }
1046 1040
1047 { // -- A r r a y B u f f e r 1041 { // -- A r r a y B u f f e r
1048 Handle<JSFunction> array_buffer_fun = 1042 Handle<JSFunction> array_buffer_fun =
1049 InstallFunction( 1043 InstallFunction(
1050 global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE, 1044 global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE,
1051 JSArrayBuffer::kSizeWithInternalFields, 1045 JSArrayBuffer::kSizeWithInternalFields,
1052 isolate->initial_object_prototype(), 1046 isolate->initial_object_prototype(),
1053 Builtins::kIllegal, true, true); 1047 Builtins::kIllegal, true);
1054 native_context()->set_array_buffer_fun(*array_buffer_fun); 1048 native_context()->set_array_buffer_fun(*array_buffer_fun);
1055 } 1049 }
1056 1050
1057 { // -- T y p e d A r r a y s 1051 { // -- T y p e d A r r a y s
1058 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ 1052 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \
1059 { \ 1053 { \
1060 Handle<JSFunction> fun; \ 1054 Handle<JSFunction> fun; \
1061 Handle<Map> external_map; \ 1055 Handle<Map> external_map; \
1062 InstallTypedArray(#Type "Array", \ 1056 InstallTypedArray(#Type "Array", \
1063 TYPE##_ELEMENTS, \ 1057 TYPE##_ELEMENTS, \
1064 &fun, \ 1058 &fun, \
1065 &external_map); \ 1059 &external_map); \
1066 native_context()->set_##type##_array_fun(*fun); \ 1060 native_context()->set_##type##_array_fun(*fun); \
1067 native_context()->set_##type##_array_external_map(*external_map); \ 1061 native_context()->set_##type##_array_external_map(*external_map); \
1068 } 1062 }
1069 TYPED_ARRAYS(INSTALL_TYPED_ARRAY) 1063 TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
1070 #undef INSTALL_TYPED_ARRAY 1064 #undef INSTALL_TYPED_ARRAY
1071 1065
1072 Handle<JSFunction> data_view_fun = 1066 Handle<JSFunction> data_view_fun =
1073 InstallFunction( 1067 InstallFunction(
1074 global, "DataView", JS_DATA_VIEW_TYPE, 1068 global, "DataView", JS_DATA_VIEW_TYPE,
1075 JSDataView::kSizeWithInternalFields, 1069 JSDataView::kSizeWithInternalFields,
1076 isolate->initial_object_prototype(), 1070 isolate->initial_object_prototype(),
1077 Builtins::kIllegal, true, true); 1071 Builtins::kIllegal, true);
1078 native_context()->set_data_view_fun(*data_view_fun); 1072 native_context()->set_data_view_fun(*data_view_fun);
1079 } 1073 }
1080 1074
1081 { // --- arguments_boilerplate_ 1075 { // --- arguments_boilerplate_
1082 // Make sure we can recognize argument objects at runtime. 1076 // Make sure we can recognize argument objects at runtime.
1083 // This is done by introducing an anonymous function with 1077 // This is done by introducing an anonymous function with
1084 // class_name equals 'Arguments'. 1078 // class_name equals 'Arguments'.
1085 Handle<String> arguments_string = factory->InternalizeOneByteString( 1079 Handle<String> arguments_string = factory->InternalizeOneByteString(
1086 STATIC_ASCII_VECTOR("Arguments")); 1080 STATIC_ASCII_VECTOR("Arguments"));
1087 Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); 1081 Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal));
1088 Handle<JSObject> prototype(
1089 JSObject::cast(native_context()->object_function()->prototype()));
1090 1082
1091 Handle<JSFunction> function = 1083 Handle<JSFunction> function = factory->NewFunction(
1092 factory->NewFunctionWithPrototype(arguments_string, 1084 MaybeHandle<Object>(), arguments_string, JS_OBJECT_TYPE,
1093 JS_OBJECT_TYPE, 1085 JSObject::kHeaderSize, code, false);
1094 JSObject::kHeaderSize,
1095 prototype,
1096 code,
1097 false);
1098 ASSERT(!function->has_initial_map()); 1086 ASSERT(!function->has_initial_map());
1099 function->shared()->set_instance_class_name(*arguments_string); 1087 function->shared()->set_instance_class_name(*arguments_string);
1100 function->shared()->set_expected_nof_properties(2); 1088 function->shared()->set_expected_nof_properties(2);
1089 function->set_prototype_or_initial_map(
1090 native_context()->object_function()->prototype());
1101 Handle<JSObject> result = factory->NewJSObject(function); 1091 Handle<JSObject> result = factory->NewJSObject(function);
1102 1092
1103 native_context()->set_sloppy_arguments_boilerplate(*result); 1093 native_context()->set_sloppy_arguments_boilerplate(*result);
1104 // Note: length must be added as the first property and 1094 // Note: length must be added as the first property and
1105 // callee must be added as the second property. 1095 // callee must be added as the second property.
1106 JSObject::SetLocalPropertyIgnoreAttributes( 1096 JSObject::SetLocalPropertyIgnoreAttributes(
1107 result, factory->length_string(), 1097 result, factory->length_string(),
1108 factory->undefined_value(), DONT_ENUM, 1098 factory->undefined_value(), DONT_ENUM,
1109 Object::FORCE_TAGGED, FORCE_FIELD).Check(); 1099 Object::FORCE_TAGGED, FORCE_FIELD).Check();
1110 JSObject::SetLocalPropertyIgnoreAttributes( 1100 JSObject::SetLocalPropertyIgnoreAttributes(
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 1266
1277 1267
1278 void Genesis::InstallTypedArray( 1268 void Genesis::InstallTypedArray(
1279 const char* name, 1269 const char* name,
1280 ElementsKind elements_kind, 1270 ElementsKind elements_kind,
1281 Handle<JSFunction>* fun, 1271 Handle<JSFunction>* fun,
1282 Handle<Map>* external_map) { 1272 Handle<Map>* external_map) {
1283 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 1273 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1284 Handle<JSFunction> result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, 1274 Handle<JSFunction> result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE,
1285 JSTypedArray::kSize, isolate()->initial_object_prototype(), 1275 JSTypedArray::kSize, isolate()->initial_object_prototype(),
1286 Builtins::kIllegal, false, true); 1276 Builtins::kIllegal, true);
1287 1277
1288 Handle<Map> initial_map = isolate()->factory()->NewMap( 1278 Handle<Map> initial_map = isolate()->factory()->NewMap(
1289 JS_TYPED_ARRAY_TYPE, 1279 JS_TYPED_ARRAY_TYPE,
1290 JSTypedArray::kSizeWithInternalFields, 1280 JSTypedArray::kSizeWithInternalFields,
1291 elements_kind); 1281 elements_kind);
1292 result->set_initial_map(*initial_map); 1282 result->set_initial_map(*initial_map);
1293 initial_map->set_constructor(*result); 1283 initial_map->set_constructor(*result);
1294 *fun = result; 1284 *fun = result;
1295 1285
1296 ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); 1286 ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind);
1297 *external_map = Map::AsElementsKind(initial_map, external_kind); 1287 *external_map = Map::AsElementsKind(initial_map, external_kind);
1298 } 1288 }
1299 1289
1300 1290
1301 void Genesis::InitializeExperimentalGlobal() { 1291 void Genesis::InitializeExperimentalGlobal() {
1302 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 1292 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1303 1293
1304 // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no 1294 // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no
1305 // longer need to live behind flags, so functions get added to the snapshot. 1295 // longer need to live behind flags, so functions get added to the snapshot.
1306 1296
1307 if (FLAG_harmony_symbols) { 1297 if (FLAG_harmony_symbols) {
1308 // --- S y m b o l --- 1298 // --- S y m b o l ---
1309 Handle<JSFunction> symbol_fun = 1299 Handle<JSFunction> symbol_fun =
1310 InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, 1300 InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
1311 isolate()->initial_object_prototype(), 1301 isolate()->initial_object_prototype(),
1312 Builtins::kIllegal, true, true); 1302 Builtins::kIllegal, true);
1313 native_context()->set_symbol_function(*symbol_fun); 1303 native_context()->set_symbol_function(*symbol_fun);
1314 } 1304 }
1315 1305
1316 if (FLAG_harmony_collections) { 1306 if (FLAG_harmony_collections) {
1317 { // -- M a p 1307 // -- M a p
1318 InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize, 1308 InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize,
1319 isolate()->initial_object_prototype(), 1309 isolate()->initial_object_prototype(),
1320 Builtins::kIllegal, true, true); 1310 Builtins::kIllegal, true);
1321 } 1311 // -- S e t
1322 { // -- S e t 1312 InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize,
1323 InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize, 1313 isolate()->initial_object_prototype(),
1324 isolate()->initial_object_prototype(), 1314 Builtins::kIllegal, true);
1325 Builtins::kIllegal, true, true);
1326 }
1327 { // -- S e t I t e r a t o r 1315 { // -- S e t I t e r a t o r
1328 Handle<Map> map = isolate()->factory()->NewMap( 1316 Handle<Map> map = isolate()->factory()->NewMap(
1329 JS_SET_ITERATOR_TYPE, JSSetIterator::kSize); 1317 JS_SET_ITERATOR_TYPE, JSSetIterator::kSize);
1330 native_context()->set_set_iterator_map(*map); 1318 native_context()->set_set_iterator_map(*map);
1331 } 1319 }
1332 { // -- M a p I t e r a t o r 1320 { // -- M a p I t e r a t o r
1333 Handle<Map> map = isolate()->factory()->NewMap( 1321 Handle<Map> map = isolate()->factory()->NewMap(
1334 JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize); 1322 JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize);
1335 native_context()->set_map_iterator_map(*map); 1323 native_context()->set_map_iterator_map(*map);
1336 } 1324 }
1337 } 1325 }
1338 1326
1339 if (FLAG_harmony_weak_collections) { 1327 if (FLAG_harmony_weak_collections) {
1340 { // -- W e a k M a p 1328 // -- W e a k M a p
1341 InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, 1329 InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
1342 isolate()->initial_object_prototype(), 1330 isolate()->initial_object_prototype(),
1343 Builtins::kIllegal, true, true); 1331 Builtins::kIllegal, true);
1344 } 1332 // -- W e a k S e t
1345 { // -- W e a k S e t 1333 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
1346 InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, 1334 isolate()->initial_object_prototype(),
1347 isolate()->initial_object_prototype(), 1335 Builtins::kIllegal, true);
1348 Builtins::kIllegal, true, true);
1349 }
1350 } 1336 }
1351 1337
1352 if (FLAG_harmony_generators) { 1338 if (FLAG_harmony_generators) {
1353 // Create generator meta-objects and install them on the builtins object. 1339 // Create generator meta-objects and install them on the builtins object.
1354 Handle<JSObject> builtins(native_context()->builtins()); 1340 Handle<JSObject> builtins(native_context()->builtins());
1355 Handle<JSObject> generator_object_prototype = 1341 Handle<JSObject> generator_object_prototype =
1356 factory()->NewJSObject(isolate()->object_function(), TENURED); 1342 factory()->NewJSObject(isolate()->object_function(), TENURED);
1357 Handle<JSFunction> generator_function_prototype = 1343 Handle<JSFunction> generator_function_prototype =
1358 InstallFunction(builtins, "GeneratorFunctionPrototype", 1344 InstallFunction(builtins, "GeneratorFunctionPrototype",
1359 JS_FUNCTION_TYPE, JSFunction::kHeaderSize, 1345 JS_FUNCTION_TYPE, JSFunction::kHeaderSize,
1360 generator_object_prototype, Builtins::kIllegal, 1346 generator_object_prototype, Builtins::kIllegal, false);
1361 false, false);
1362 InstallFunction(builtins, "GeneratorFunction", 1347 InstallFunction(builtins, "GeneratorFunction",
1363 JS_FUNCTION_TYPE, JSFunction::kSize, 1348 JS_FUNCTION_TYPE, JSFunction::kSize,
1364 generator_function_prototype, Builtins::kIllegal, 1349 generator_function_prototype, Builtins::kIllegal, false);
1365 false, false);
1366 1350
1367 // Create maps for generator functions and their prototypes. Store those 1351 // Create maps for generator functions and their prototypes. Store those
1368 // maps in the native context. 1352 // maps in the native context.
1369 Handle<Map> function_map(native_context()->sloppy_function_map()); 1353 Handle<Map> function_map(native_context()->sloppy_function_map());
1370 Handle<Map> generator_function_map = Map::Copy(function_map); 1354 Handle<Map> generator_function_map = Map::Copy(function_map);
1371 generator_function_map->set_prototype(*generator_function_prototype); 1355 generator_function_map->set_prototype(*generator_function_prototype);
1372 native_context()->set_sloppy_generator_function_map( 1356 native_context()->set_sloppy_generator_function_map(
1373 *generator_function_map); 1357 *generator_function_map);
1374 1358
1375 Handle<Map> strict_mode_function_map( 1359 Handle<Map> strict_mode_function_map(
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1593 Handle<JSFunction> Genesis::InstallInternalArray( 1577 Handle<JSFunction> Genesis::InstallInternalArray(
1594 Handle<JSBuiltinsObject> builtins, 1578 Handle<JSBuiltinsObject> builtins,
1595 const char* name, 1579 const char* name,
1596 ElementsKind elements_kind) { 1580 ElementsKind elements_kind) {
1597 // --- I n t e r n a l A r r a y --- 1581 // --- I n t e r n a l A r r a y ---
1598 // An array constructor on the builtins object that works like 1582 // An array constructor on the builtins object that works like
1599 // the public Array constructor, except that its prototype 1583 // the public Array constructor, except that its prototype
1600 // doesn't inherit from Object.prototype. 1584 // doesn't inherit from Object.prototype.
1601 // To be used only for internal work by builtins. Instances 1585 // To be used only for internal work by builtins. Instances
1602 // must not be leaked to user code. 1586 // must not be leaked to user code.
1603 Handle<JSFunction> array_function = 1587 Handle<JSFunction> array_function = InstallFunction(
1604 InstallFunction(builtins, 1588 builtins, name, JS_ARRAY_TYPE, JSArray::kSize,
1605 name, 1589 isolate()->initial_object_prototype(), Builtins::kInternalArrayCode,
1606 JS_ARRAY_TYPE, 1590 true);
1607 JSArray::kSize,
1608 isolate()->initial_object_prototype(),
1609 Builtins::kInternalArrayCode,
1610 true, true);
1611 Handle<JSObject> prototype = 1591 Handle<JSObject> prototype =
1612 factory()->NewJSObject(isolate()->object_function(), TENURED); 1592 factory()->NewJSObject(isolate()->object_function(), TENURED);
1613 Accessors::FunctionSetPrototype(array_function, prototype); 1593 Accessors::FunctionSetPrototype(array_function, prototype);
1614 1594
1615 InternalArrayConstructorStub internal_array_constructor_stub(isolate()); 1595 InternalArrayConstructorStub internal_array_constructor_stub(isolate());
1616 Handle<Code> code = internal_array_constructor_stub.GetCode(); 1596 Handle<Code> code = internal_array_constructor_stub.GetCode();
1617 array_function->shared()->set_construct_stub(*code); 1597 array_function->shared()->set_construct_stub(*code);
1618 array_function->shared()->DontAdaptArguments(); 1598 array_function->shared()->DontAdaptArguments();
1619 1599
1620 Handle<Map> original_map(array_function->initial_map()); 1600 Handle<Map> original_map(array_function->initial_map());
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 1676
1697 // Allocate the builtins context. 1677 // Allocate the builtins context.
1698 Handle<Context> context = 1678 Handle<Context> context =
1699 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); 1679 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge);
1700 context->set_global_object(*builtins); // override builtins global object 1680 context->set_global_object(*builtins); // override builtins global object
1701 1681
1702 native_context()->set_runtime_context(*context); 1682 native_context()->set_runtime_context(*context);
1703 1683
1704 { // -- S c r i p t 1684 { // -- S c r i p t
1705 // Builtin functions for Script. 1685 // Builtin functions for Script.
1706 Handle<JSFunction> script_fun = 1686 Handle<JSFunction> script_fun = InstallFunction(
1707 InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, 1687 builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
1708 isolate()->initial_object_prototype(), 1688 isolate()->initial_object_prototype(), Builtins::kIllegal, false);
1709 Builtins::kIllegal, false, false);
1710 Handle<JSObject> prototype = 1689 Handle<JSObject> prototype =
1711 factory()->NewJSObject(isolate()->object_function(), TENURED); 1690 factory()->NewJSObject(isolate()->object_function(), TENURED);
1712 Accessors::FunctionSetPrototype(script_fun, prototype); 1691 Accessors::FunctionSetPrototype(script_fun, prototype);
1713 native_context()->set_script_function(*script_fun); 1692 native_context()->set_script_function(*script_fun);
1714 1693
1715 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); 1694 Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
1716 Map::EnsureDescriptorSlack(script_map, 13); 1695 Map::EnsureDescriptorSlack(script_map, 13);
1717 1696
1718 PropertyAttributes attribs = 1697 PropertyAttributes attribs =
1719 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 1698 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1822 1801
1823 // Allocate the empty script. 1802 // Allocate the empty script.
1824 Handle<Script> script = factory()->NewScript(factory()->empty_string()); 1803 Handle<Script> script = factory()->NewScript(factory()->empty_string());
1825 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 1804 script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
1826 heap()->public_set_empty_script(*script); 1805 heap()->public_set_empty_script(*script);
1827 } 1806 }
1828 { 1807 {
1829 // Builtin function for OpaqueReference -- a JSValue-based object, 1808 // Builtin function for OpaqueReference -- a JSValue-based object,
1830 // that keeps its field isolated from JavaScript code. It may store 1809 // that keeps its field isolated from JavaScript code. It may store
1831 // objects, that JavaScript code may not access. 1810 // objects, that JavaScript code may not access.
1832 Handle<JSFunction> opaque_reference_fun = 1811 Handle<JSFunction> opaque_reference_fun = InstallFunction(
1833 InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE, 1812 builtins, "OpaqueReference", JS_VALUE_TYPE, JSValue::kSize,
1834 JSValue::kSize, 1813 isolate()->initial_object_prototype(), Builtins::kIllegal, false);
1835 isolate()->initial_object_prototype(),
1836 Builtins::kIllegal, false, false);
1837 Handle<JSObject> prototype = 1814 Handle<JSObject> prototype =
1838 factory()->NewJSObject(isolate()->object_function(), TENURED); 1815 factory()->NewJSObject(isolate()->object_function(), TENURED);
1839 Accessors::FunctionSetPrototype(opaque_reference_fun, prototype); 1816 Accessors::FunctionSetPrototype(opaque_reference_fun, prototype);
1840 native_context()->set_opaque_reference_function(*opaque_reference_fun); 1817 native_context()->set_opaque_reference_function(*opaque_reference_fun);
1841 } 1818 }
1842 1819
1843 // InternalArrays should not use Smi-Only array optimizations. There are too 1820 // InternalArrays should not use Smi-Only array optimizations. There are too
1844 // many places in the C++ runtime code (e.g. RegEx) that assume that 1821 // many places in the C++ runtime code (e.g. RegEx) that assume that
1845 // elements in InternalArrays can be set to non-Smi values without going 1822 // elements in InternalArrays can be set to non-Smi values without going
1846 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT 1823 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 { Handle<String> key = factory()->function_class_string(); 1862 { Handle<String> key = factory()->function_class_string();
1886 Handle<JSFunction> function = 1863 Handle<JSFunction> function =
1887 Handle<JSFunction>::cast(Object::GetProperty( 1864 Handle<JSFunction>::cast(Object::GetProperty(
1888 isolate()->global_object(), key).ToHandleChecked()); 1865 isolate()->global_object(), key).ToHandleChecked());
1889 Handle<JSObject> proto = 1866 Handle<JSObject> proto =
1890 Handle<JSObject>(JSObject::cast(function->instance_prototype())); 1867 Handle<JSObject>(JSObject::cast(function->instance_prototype()));
1891 1868
1892 // Install the call and the apply functions. 1869 // Install the call and the apply functions.
1893 Handle<JSFunction> call = 1870 Handle<JSFunction> call =
1894 InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize, 1871 InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1895 Handle<JSObject>::null(), 1872 MaybeHandle<JSObject>(),
1896 Builtins::kFunctionCall, 1873 Builtins::kFunctionCall, false);
1897 false, false);
1898 Handle<JSFunction> apply = 1874 Handle<JSFunction> apply =
1899 InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize, 1875 InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1900 Handle<JSObject>::null(), 1876 MaybeHandle<JSObject>(),
1901 Builtins::kFunctionApply, 1877 Builtins::kFunctionApply, false);
1902 false, false);
1903 1878
1904 // Make sure that Function.prototype.call appears to be compiled. 1879 // Make sure that Function.prototype.call appears to be compiled.
1905 // The code will never be called, but inline caching for call will 1880 // The code will never be called, but inline caching for call will
1906 // only work if it appears to be compiled. 1881 // only work if it appears to be compiled.
1907 call->shared()->DontAdaptArguments(); 1882 call->shared()->DontAdaptArguments();
1908 ASSERT(call->is_compiled()); 1883 ASSERT(call->is_compiled());
1909 1884
1910 // Set the expected parameters for apply to 2; required by builtin. 1885 // Set the expected parameters for apply to 2; required by builtin.
1911 apply->shared()->set_formal_parameter_count(2); 1886 apply->shared()->set_formal_parameter_count(2);
1912 1887
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
2698 return from + sizeof(NestingCounterType); 2673 return from + sizeof(NestingCounterType);
2699 } 2674 }
2700 2675
2701 2676
2702 // Called when the top-level V8 mutex is destroyed. 2677 // Called when the top-level V8 mutex is destroyed.
2703 void Bootstrapper::FreeThreadResources() { 2678 void Bootstrapper::FreeThreadResources() {
2704 ASSERT(!IsActive()); 2679 ASSERT(!IsActive());
2705 } 2680 }
2706 2681
2707 } } // namespace v8::internal 2682 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698