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

Side by Side Diff: src/bootstrapper.cc

Issue 10800033: Append to descriptors over map. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 5 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.cc » ('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 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 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 384
385 385
386 void Genesis::SetFunctionInstanceDescriptor( 386 void Genesis::SetFunctionInstanceDescriptor(
387 Handle<Map> map, PrototypePropertyMode prototypeMode) { 387 Handle<Map> map, PrototypePropertyMode prototypeMode) {
388 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; 388 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5;
389 Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size)); 389 Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size));
390 PropertyAttributes attribs = static_cast<PropertyAttributes>( 390 PropertyAttributes attribs = static_cast<PropertyAttributes>(
391 DONT_ENUM | DONT_DELETE | READ_ONLY); 391 DONT_ENUM | DONT_DELETE | READ_ONLY);
392 392
393 DescriptorArray::WhitenessWitness witness(*descriptors); 393 DescriptorArray::WhitenessWitness witness(*descriptors);
394 map->set_instance_descriptors(*descriptors);
394 395
395 { // Add length. 396 { // Add length.
396 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength)); 397 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength));
397 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); 398 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
398 descriptors->Append(&d, witness); 399 map->AppendDescriptor(&d, witness);
399 } 400 }
400 { // Add name. 401 { // Add name.
401 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName)); 402 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName));
402 CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs); 403 CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs);
403 descriptors->Append(&d, witness); 404 map->AppendDescriptor(&d, witness);
404 } 405 }
405 { // Add arguments. 406 { // Add arguments.
406 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionArguments)); 407 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionArguments));
407 CallbacksDescriptor d(*factory()->arguments_symbol(), *f, attribs); 408 CallbacksDescriptor d(*factory()->arguments_symbol(), *f, attribs);
408 descriptors->Append(&d, witness); 409 map->AppendDescriptor(&d, witness);
409 } 410 }
410 { // Add caller. 411 { // Add caller.
411 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionCaller)); 412 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionCaller));
412 CallbacksDescriptor d(*factory()->caller_symbol(), *f, attribs); 413 CallbacksDescriptor d(*factory()->caller_symbol(), *f, attribs);
413 descriptors->Append(&d, witness); 414 map->AppendDescriptor(&d, witness);
414 } 415 }
415 if (prototypeMode != DONT_ADD_PROTOTYPE) { 416 if (prototypeMode != DONT_ADD_PROTOTYPE) {
416 // Add prototype. 417 // Add prototype.
417 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { 418 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) {
418 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); 419 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY);
419 } 420 }
420 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); 421 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype));
421 CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); 422 CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs);
422 descriptors->Append(&d, witness); 423 map->AppendDescriptor(&d, witness);
423 } 424 }
424
425 map->set_instance_descriptors(*descriptors);
426 } 425 }
427 426
428 427
429 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { 428 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) {
430 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 429 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
431 SetFunctionInstanceDescriptor(map, prototype_mode); 430 SetFunctionInstanceDescriptor(map, prototype_mode);
432 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); 431 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE);
433 return map; 432 return map;
434 } 433 }
435 434
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 522
524 523
525 void Genesis::SetStrictFunctionInstanceDescriptor( 524 void Genesis::SetStrictFunctionInstanceDescriptor(
526 Handle<Map> map, PrototypePropertyMode prototypeMode) { 525 Handle<Map> map, PrototypePropertyMode prototypeMode) {
527 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; 526 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5;
528 Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size)); 527 Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size));
529 PropertyAttributes attribs = static_cast<PropertyAttributes>( 528 PropertyAttributes attribs = static_cast<PropertyAttributes>(
530 DONT_ENUM | DONT_DELETE); 529 DONT_ENUM | DONT_DELETE);
531 530
532 DescriptorArray::WhitenessWitness witness(*descriptors); 531 DescriptorArray::WhitenessWitness witness(*descriptors);
532 map->set_instance_descriptors(*descriptors);
533 533
534 { // Add length. 534 { // Add length.
535 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength)); 535 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength));
536 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); 536 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
537 descriptors->Append(&d, witness); 537 map->AppendDescriptor(&d, witness);
538 } 538 }
539 { // Add name. 539 { // Add name.
540 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName)); 540 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName));
541 CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs); 541 CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs);
542 descriptors->Append(&d, witness); 542 map->AppendDescriptor(&d, witness);
543 } 543 }
544 { // Add arguments. 544 { // Add arguments.
545 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); 545 Handle<AccessorPair> arguments(factory()->NewAccessorPair());
546 CallbacksDescriptor d(*factory()->arguments_symbol(), *arguments, attribs); 546 CallbacksDescriptor d(*factory()->arguments_symbol(), *arguments, attribs);
547 descriptors->Append(&d, witness); 547 map->AppendDescriptor(&d, witness);
548 } 548 }
549 { // Add caller. 549 { // Add caller.
550 Handle<AccessorPair> caller(factory()->NewAccessorPair()); 550 Handle<AccessorPair> caller(factory()->NewAccessorPair());
551 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attribs); 551 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attribs);
552 descriptors->Append(&d, witness); 552 map->AppendDescriptor(&d, witness);
553 } 553 }
554 554
555 if (prototypeMode != DONT_ADD_PROTOTYPE) { 555 if (prototypeMode != DONT_ADD_PROTOTYPE) {
556 // Add prototype. 556 // Add prototype.
557 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { 557 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) {
558 attribs = static_cast<PropertyAttributes>(attribs | READ_ONLY); 558 attribs = static_cast<PropertyAttributes>(attribs | READ_ONLY);
559 } 559 }
560 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); 560 Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype));
561 CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); 561 CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs);
562 descriptors->Append(&d, witness); 562 map->AppendDescriptor(&d, witness);
563 } 563 }
564
565 map->set_instance_descriptors(*descriptors);
566 } 564 }
567 565
568 566
569 // ECMAScript 5th Edition, 13.2.3 567 // ECMAScript 5th Edition, 13.2.3
570 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { 568 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() {
571 if (throw_type_error_function.is_null()) { 569 if (throw_type_error_function.is_null()) {
572 Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); 570 Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError");
573 throw_type_error_function = 571 throw_type_error_function =
574 factory()->NewFunctionWithoutPrototype(name, CLASSIC_MODE); 572 factory()->NewFunctionWithoutPrototype(name, CLASSIC_MODE);
575 Handle<Code> code(isolate()->builtins()->builtin( 573 Handle<Code> code(isolate()->builtins()->builtin(
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 861
864 // This seems a bit hackish, but we need to make sure Array.length 862 // This seems a bit hackish, but we need to make sure Array.length
865 // is 1. 863 // is 1.
866 array_function->shared()->set_length(1); 864 array_function->shared()->set_length(1);
867 865
868 Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1)); 866 Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1));
869 PropertyAttributes attribs = static_cast<PropertyAttributes>( 867 PropertyAttributes attribs = static_cast<PropertyAttributes>(
870 DONT_ENUM | DONT_DELETE); 868 DONT_ENUM | DONT_DELETE);
871 869
872 DescriptorArray::WhitenessWitness witness(*array_descriptors); 870 DescriptorArray::WhitenessWitness witness(*array_descriptors);
871 array_function->initial_map()->set_instance_descriptors(*array_descriptors);
873 872
874 { // Add length. 873 { // Add length.
875 Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength)); 874 Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength));
876 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); 875 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
877 array_descriptors->Append(&d, witness); 876 array_function->initial_map()->AppendDescriptor(&d, witness);
878 } 877 }
879 878
880 // array_function is used internally. JS code creating array object should 879 // array_function is used internally. JS code creating array object should
881 // search for the 'Array' property on the global object and use that one 880 // search for the 'Array' property on the global object and use that one
882 // as the constructor. 'Array' property on a global object can be 881 // as the constructor. 'Array' property on a global object can be
883 // overwritten by JS code. 882 // overwritten by JS code.
884 global_context()->set_array_function(*array_function); 883 global_context()->set_array_function(*array_function);
885 array_function->initial_map()->set_instance_descriptors(*array_descriptors);
886 } 884 }
887 885
888 { // --- N u m b e r --- 886 { // --- N u m b e r ---
889 Handle<JSFunction> number_fun = 887 Handle<JSFunction> number_fun =
890 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, 888 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
891 isolate->initial_object_prototype(), 889 isolate->initial_object_prototype(),
892 Builtins::kIllegal, true); 890 Builtins::kIllegal, true);
893 global_context()->set_number_function(*number_fun); 891 global_context()->set_number_function(*number_fun);
894 } 892 }
895 893
896 { // --- B o o l e a n --- 894 { // --- B o o l e a n ---
897 Handle<JSFunction> boolean_fun = 895 Handle<JSFunction> boolean_fun =
898 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, 896 InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
899 isolate->initial_object_prototype(), 897 isolate->initial_object_prototype(),
900 Builtins::kIllegal, true); 898 Builtins::kIllegal, true);
901 global_context()->set_boolean_function(*boolean_fun); 899 global_context()->set_boolean_function(*boolean_fun);
902 } 900 }
903 901
904 { // --- S t r i n g --- 902 { // --- S t r i n g ---
905 Handle<JSFunction> string_fun = 903 Handle<JSFunction> string_fun =
906 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, 904 InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
907 isolate->initial_object_prototype(), 905 isolate->initial_object_prototype(),
908 Builtins::kIllegal, true); 906 Builtins::kIllegal, true);
909 string_fun->shared()->set_construct_stub( 907 string_fun->shared()->set_construct_stub(
910 isolate->builtins()->builtin(Builtins::kStringConstructCode)); 908 isolate->builtins()->builtin(Builtins::kStringConstructCode));
911 global_context()->set_string_function(*string_fun); 909 global_context()->set_string_function(*string_fun);
912 910
911 Handle<Map> string_map =
912 Handle<Map>(global_context()->string_function()->initial_map());
913 Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1)); 913 Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1));
914 PropertyAttributes attribs = static_cast<PropertyAttributes>( 914 PropertyAttributes attribs = static_cast<PropertyAttributes>(
915 DONT_ENUM | DONT_DELETE | READ_ONLY); 915 DONT_ENUM | DONT_DELETE | READ_ONLY);
916 916
917 DescriptorArray::WhitenessWitness witness(*string_descriptors); 917 DescriptorArray::WhitenessWitness witness(*string_descriptors);
918 string_map->set_instance_descriptors(*string_descriptors);
918 919
919 { // Add length. 920 { // Add length.
920 Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength)); 921 Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength));
921 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); 922 CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
922 string_descriptors->Append(&d, witness); 923 string_map->AppendDescriptor(&d, witness);
923 } 924 }
924
925 Handle<Map> string_map =
926 Handle<Map>(global_context()->string_function()->initial_map());
927 string_map->set_instance_descriptors(*string_descriptors);
928 } 925 }
929 926
930 { // --- D a t e --- 927 { // --- D a t e ---
931 // Builtin functions for Date.prototype. 928 // Builtin functions for Date.prototype.
932 Handle<JSFunction> date_fun = 929 Handle<JSFunction> date_fun =
933 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, 930 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize,
934 isolate->initial_object_prototype(), 931 isolate->initial_object_prototype(),
935 Builtins::kIllegal, true); 932 Builtins::kIllegal, true);
936 933
937 global_context()->set_date_function(*date_fun); 934 global_context()->set_date_function(*date_fun);
938 } 935 }
939 936
940 937
941 { // -- R e g E x p 938 { // -- R e g E x p
942 // Builtin functions for RegExp.prototype. 939 // Builtin functions for RegExp.prototype.
943 Handle<JSFunction> regexp_fun = 940 Handle<JSFunction> regexp_fun =
944 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, 941 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
945 isolate->initial_object_prototype(), 942 isolate->initial_object_prototype(),
946 Builtins::kIllegal, true); 943 Builtins::kIllegal, true);
947 global_context()->set_regexp_function(*regexp_fun); 944 global_context()->set_regexp_function(*regexp_fun);
948 945
949 ASSERT(regexp_fun->has_initial_map()); 946 ASSERT(regexp_fun->has_initial_map());
950 Handle<Map> initial_map(regexp_fun->initial_map()); 947 Handle<Map> initial_map(regexp_fun->initial_map());
951 948
952 ASSERT_EQ(0, initial_map->inobject_properties()); 949 ASSERT_EQ(0, initial_map->inobject_properties());
953 950
951 PropertyAttributes final =
952 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
954 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5); 953 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5);
955 DescriptorArray::WhitenessWitness witness(*descriptors); 954 DescriptorArray::WhitenessWitness witness(*descriptors);
956 PropertyAttributes final = 955 initial_map->set_instance_descriptors(*descriptors);
957 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 956
958 { 957 {
959 // ECMA-262, section 15.10.7.1. 958 // ECMA-262, section 15.10.7.1.
960 FieldDescriptor field(heap->source_symbol(), 959 FieldDescriptor field(heap->source_symbol(),
961 JSRegExp::kSourceFieldIndex, 960 JSRegExp::kSourceFieldIndex,
962 final); 961 final);
963 descriptors->Append(&field, witness); 962 initial_map->AppendDescriptor(&field, witness);
964 } 963 }
965 { 964 {
966 // ECMA-262, section 15.10.7.2. 965 // ECMA-262, section 15.10.7.2.
967 FieldDescriptor field(heap->global_symbol(), 966 FieldDescriptor field(heap->global_symbol(),
968 JSRegExp::kGlobalFieldIndex, 967 JSRegExp::kGlobalFieldIndex,
969 final); 968 final);
970 descriptors->Append(&field, witness); 969 initial_map->AppendDescriptor(&field, witness);
971 } 970 }
972 { 971 {
973 // ECMA-262, section 15.10.7.3. 972 // ECMA-262, section 15.10.7.3.
974 FieldDescriptor field(heap->ignore_case_symbol(), 973 FieldDescriptor field(heap->ignore_case_symbol(),
975 JSRegExp::kIgnoreCaseFieldIndex, 974 JSRegExp::kIgnoreCaseFieldIndex,
976 final); 975 final);
977 descriptors->Append(&field, witness); 976 initial_map->AppendDescriptor(&field, witness);
978 } 977 }
979 { 978 {
980 // ECMA-262, section 15.10.7.4. 979 // ECMA-262, section 15.10.7.4.
981 FieldDescriptor field(heap->multiline_symbol(), 980 FieldDescriptor field(heap->multiline_symbol(),
982 JSRegExp::kMultilineFieldIndex, 981 JSRegExp::kMultilineFieldIndex,
983 final); 982 final);
984 descriptors->Append(&field, witness); 983 initial_map->AppendDescriptor(&field, witness);
985 } 984 }
986 { 985 {
987 // ECMA-262, section 15.10.7.5. 986 // ECMA-262, section 15.10.7.5.
988 PropertyAttributes writable = 987 PropertyAttributes writable =
989 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 988 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
990 FieldDescriptor field(heap->last_index_symbol(), 989 FieldDescriptor field(heap->last_index_symbol(),
991 JSRegExp::kLastIndexFieldIndex, 990 JSRegExp::kLastIndexFieldIndex,
992 writable); 991 writable);
993 descriptors->Append(&field, witness); 992 initial_map->AppendDescriptor(&field, witness);
994 } 993 }
995 initial_map->set_instance_descriptors(*descriptors);
996 994
997 initial_map->set_inobject_properties(5); 995 initial_map->set_inobject_properties(5);
998 initial_map->set_pre_allocated_property_fields(5); 996 initial_map->set_pre_allocated_property_fields(5);
999 initial_map->set_unused_property_fields(0); 997 initial_map->set_unused_property_fields(0);
1000 initial_map->set_instance_size( 998 initial_map->set_instance_size(
1001 initial_map->instance_size() + 5 * kPointerSize); 999 initial_map->instance_size() + 5 * kPointerSize);
1002 initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); 1000 initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map));
1003 1001
1004 // RegExp prototype object is itself a RegExp. 1002 // RegExp prototype object is itself a RegExp.
1005 Handle<Map> proto_map = factory->CopyMap(initial_map); 1003 Handle<Map> proto_map = factory->CopyMap(initial_map);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 callee->set_setter(*throw_function); 1129 callee->set_setter(*throw_function);
1132 caller->set_getter(*throw_function); 1130 caller->set_getter(*throw_function);
1133 caller->set_setter(*throw_function); 1131 caller->set_setter(*throw_function);
1134 1132
1135 // Create the map. Allocate one in-object field for length. 1133 // Create the map. Allocate one in-object field for length.
1136 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, 1134 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE,
1137 Heap::kArgumentsObjectSizeStrict); 1135 Heap::kArgumentsObjectSizeStrict);
1138 // Create the descriptor array for the arguments object. 1136 // Create the descriptor array for the arguments object.
1139 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3); 1137 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3);
1140 DescriptorArray::WhitenessWitness witness(*descriptors); 1138 DescriptorArray::WhitenessWitness witness(*descriptors);
1139 map->set_instance_descriptors(*descriptors);
1140
1141 { // length 1141 { // length
1142 FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM); 1142 FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM);
1143 descriptors->Append(&d, witness); 1143 map->AppendDescriptor(&d, witness);
1144 } 1144 }
1145 { // callee 1145 { // callee
1146 CallbacksDescriptor d(*factory->callee_symbol(), 1146 CallbacksDescriptor d(*factory->callee_symbol(),
1147 *callee, 1147 *callee,
1148 attributes); 1148 attributes);
1149 descriptors->Append(&d, witness); 1149 map->AppendDescriptor(&d, witness);
1150 } 1150 }
1151 { // caller 1151 { // caller
1152 CallbacksDescriptor d(*factory->caller_symbol(), 1152 CallbacksDescriptor d(*factory->caller_symbol(),
1153 *caller, 1153 *caller,
1154 attributes); 1154 attributes);
1155 descriptors->Append(&d, witness); 1155 map->AppendDescriptor(&d, witness);
1156 } 1156 }
1157 map->set_instance_descriptors(*descriptors);
1158 1157
1159 map->set_function_with_prototype(true); 1158 map->set_function_with_prototype(true);
1160 map->set_prototype(global_context()->object_function()->prototype()); 1159 map->set_prototype(global_context()->object_function()->prototype());
1161 map->set_pre_allocated_property_fields(1); 1160 map->set_pre_allocated_property_fields(1);
1162 map->set_inobject_properties(1); 1161 map->set_inobject_properties(1);
1163 1162
1164 // Copy constructor from the non-strict arguments boilerplate. 1163 // Copy constructor from the non-strict arguments boilerplate.
1165 map->set_constructor( 1164 map->set_constructor(
1166 global_context()->arguments_boilerplate()->map()->constructor()); 1165 global_context()->arguments_boilerplate()->map()->constructor());
1167 1166
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 1475
1477 PropertyAttributes attribs = 1476 PropertyAttributes attribs =
1478 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 1477 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
1479 1478
1480 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); 1479 Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
1481 1480
1482 Handle<DescriptorArray> script_descriptors( 1481 Handle<DescriptorArray> script_descriptors(
1483 factory()->NewDescriptorArray(13)); 1482 factory()->NewDescriptorArray(13));
1484 1483
1485 DescriptorArray::WhitenessWitness witness(*script_descriptors); 1484 DescriptorArray::WhitenessWitness witness(*script_descriptors);
1485 script_map->set_instance_descriptors(*script_descriptors);
1486 1486
1487 { 1487 {
1488 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource)); 1488 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource));
1489 CallbacksDescriptor d( 1489 CallbacksDescriptor d(
1490 *factory()->LookupAsciiSymbol("source"), *f, attribs); 1490 *factory()->LookupAsciiSymbol("source"), *f, attribs);
1491 script_descriptors->Append(&d, witness); 1491 script_map->AppendDescriptor(&d, witness);
1492 } 1492 }
1493 1493
1494 { 1494 {
1495 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName)); 1495 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName));
1496 CallbacksDescriptor d( 1496 CallbacksDescriptor d(
1497 *factory()->LookupAsciiSymbol("name"), *f, attribs); 1497 *factory()->LookupAsciiSymbol("name"), *f, attribs);
1498 script_descriptors->Append(&d, witness); 1498 script_map->AppendDescriptor(&d, witness);
1499 } 1499 }
1500 1500
1501 { 1501 {
1502 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId)); 1502 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId));
1503 CallbacksDescriptor d( 1503 CallbacksDescriptor d(
1504 *factory()->LookupAsciiSymbol("id"), *f, attribs); 1504 *factory()->LookupAsciiSymbol("id"), *f, attribs);
1505 script_descriptors->Append(&d, witness); 1505 script_map->AppendDescriptor(&d, witness);
1506 } 1506 }
1507 1507
1508 { 1508 {
1509 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset)); 1509 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset));
1510 CallbacksDescriptor d( 1510 CallbacksDescriptor d(
1511 *factory()->LookupAsciiSymbol("line_offset"), *f, attribs); 1511 *factory()->LookupAsciiSymbol("line_offset"), *f, attribs);
1512 script_descriptors->Append(&d, witness); 1512 script_map->AppendDescriptor(&d, witness);
1513 } 1513 }
1514 1514
1515 { 1515 {
1516 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset)); 1516 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset));
1517 CallbacksDescriptor d( 1517 CallbacksDescriptor d(
1518 *factory()->LookupAsciiSymbol("column_offset"), *f, attribs); 1518 *factory()->LookupAsciiSymbol("column_offset"), *f, attribs);
1519 script_descriptors->Append(&d, witness); 1519 script_map->AppendDescriptor(&d, witness);
1520 } 1520 }
1521 1521
1522 { 1522 {
1523 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData)); 1523 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData));
1524 CallbacksDescriptor d( 1524 CallbacksDescriptor d(
1525 *factory()->LookupAsciiSymbol("data"), *f, attribs); 1525 *factory()->LookupAsciiSymbol("data"), *f, attribs);
1526 script_descriptors->Append(&d, witness); 1526 script_map->AppendDescriptor(&d, witness);
1527 } 1527 }
1528 1528
1529 { 1529 {
1530 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType)); 1530 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType));
1531 CallbacksDescriptor d( 1531 CallbacksDescriptor d(
1532 *factory()->LookupAsciiSymbol("type"), *f, attribs); 1532 *factory()->LookupAsciiSymbol("type"), *f, attribs);
1533 script_descriptors->Append(&d, witness); 1533 script_map->AppendDescriptor(&d, witness);
1534 } 1534 }
1535 1535
1536 { 1536 {
1537 Handle<Foreign> f(factory()->NewForeign( 1537 Handle<Foreign> f(factory()->NewForeign(
1538 &Accessors::ScriptCompilationType)); 1538 &Accessors::ScriptCompilationType));
1539 CallbacksDescriptor d( 1539 CallbacksDescriptor d(
1540 *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs); 1540 *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs);
1541 script_descriptors->Append(&d, witness); 1541 script_map->AppendDescriptor(&d, witness);
1542 } 1542 }
1543 1543
1544 { 1544 {
1545 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds)); 1545 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds));
1546 CallbacksDescriptor d( 1546 CallbacksDescriptor d(
1547 *factory()->LookupAsciiSymbol("line_ends"), *f, attribs); 1547 *factory()->LookupAsciiSymbol("line_ends"), *f, attribs);
1548 script_descriptors->Append(&d, witness); 1548 script_map->AppendDescriptor(&d, witness);
1549 } 1549 }
1550 1550
1551 { 1551 {
1552 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData)); 1552 Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData));
1553 CallbacksDescriptor d( 1553 CallbacksDescriptor d(
1554 *factory()->LookupAsciiSymbol("context_data"), *f, attribs); 1554 *factory()->LookupAsciiSymbol("context_data"), *f, attribs);
1555 script_descriptors->Append(&d, witness); 1555 script_map->AppendDescriptor(&d, witness);
1556 } 1556 }
1557 1557
1558 { 1558 {
1559 Handle<Foreign> f(factory()->NewForeign( 1559 Handle<Foreign> f(factory()->NewForeign(
1560 &Accessors::ScriptEvalFromScript)); 1560 &Accessors::ScriptEvalFromScript));
1561 CallbacksDescriptor d( 1561 CallbacksDescriptor d(
1562 *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs); 1562 *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs);
1563 script_descriptors->Append(&d, witness); 1563 script_map->AppendDescriptor(&d, witness);
1564 } 1564 }
1565 1565
1566 { 1566 {
1567 Handle<Foreign> f(factory()->NewForeign( 1567 Handle<Foreign> f(factory()->NewForeign(
1568 &Accessors::ScriptEvalFromScriptPosition)); 1568 &Accessors::ScriptEvalFromScriptPosition));
1569 CallbacksDescriptor d( 1569 CallbacksDescriptor d(
1570 *factory()->LookupAsciiSymbol("eval_from_script_position"), 1570 *factory()->LookupAsciiSymbol("eval_from_script_position"),
1571 *f, 1571 *f,
1572 attribs); 1572 attribs);
1573 script_descriptors->Append(&d, witness); 1573 script_map->AppendDescriptor(&d, witness);
1574 } 1574 }
1575 1575
1576 { 1576 {
1577 Handle<Foreign> f(factory()->NewForeign( 1577 Handle<Foreign> f(factory()->NewForeign(
1578 &Accessors::ScriptEvalFromFunctionName)); 1578 &Accessors::ScriptEvalFromFunctionName));
1579 CallbacksDescriptor d( 1579 CallbacksDescriptor d(
1580 *factory()->LookupAsciiSymbol("eval_from_function_name"), 1580 *factory()->LookupAsciiSymbol("eval_from_function_name"),
1581 *f, 1581 *f,
1582 attribs); 1582 attribs);
1583 script_descriptors->Append(&d, witness); 1583 script_map->AppendDescriptor(&d, witness);
1584 } 1584 }
1585 1585
1586 script_map->set_instance_descriptors(*script_descriptors);
1587
1588 // Allocate the empty script. 1586 // Allocate the empty script.
1589 Handle<Script> script = factory()->NewScript(factory()->empty_string()); 1587 Handle<Script> script = factory()->NewScript(factory()->empty_string());
1590 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 1588 script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
1591 heap()->public_set_empty_script(*script); 1589 heap()->public_set_empty_script(*script);
1592 } 1590 }
1593 { 1591 {
1594 // Builtin function for OpaqueReference -- a JSValue-based object, 1592 // Builtin function for OpaqueReference -- a JSValue-based object,
1595 // that keeps its field isolated from JavaScript code. It may store 1593 // that keeps its field isolated from JavaScript code. It may store
1596 // objects, that JavaScript code may not access. 1594 // objects, that JavaScript code may not access.
1597 Handle<JSFunction> opaque_reference_fun = 1595 Handle<JSFunction> opaque_reference_fun =
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 if (!maybe_map->To(&new_map)) return false; 1636 if (!maybe_map->To(&new_map)) return false;
1639 new_map->set_elements_kind(FAST_HOLEY_ELEMENTS); 1637 new_map->set_elements_kind(FAST_HOLEY_ELEMENTS);
1640 array_function->set_initial_map(new_map); 1638 array_function->set_initial_map(new_map);
1641 1639
1642 // Make "length" magic on instances. 1640 // Make "length" magic on instances.
1643 Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1)); 1641 Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1));
1644 PropertyAttributes attribs = static_cast<PropertyAttributes>( 1642 PropertyAttributes attribs = static_cast<PropertyAttributes>(
1645 DONT_ENUM | DONT_DELETE); 1643 DONT_ENUM | DONT_DELETE);
1646 1644
1647 DescriptorArray::WhitenessWitness witness(*array_descriptors); 1645 DescriptorArray::WhitenessWitness witness(*array_descriptors);
1646 array_function->initial_map()->set_instance_descriptors(*array_descriptors);
1648 1647
1649 { // Add length. 1648 { // Add length.
1650 Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength)); 1649 Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength));
1651 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); 1650 CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
1652 array_descriptors->Append(&d, witness); 1651 array_function->initial_map()->AppendDescriptor(&d, witness);
1653 } 1652 }
1654 1653
1655 array_function->initial_map()->set_instance_descriptors(*array_descriptors);
1656
1657 global_context()->set_internal_array_function(*array_function); 1654 global_context()->set_internal_array_function(*array_function);
1658 } 1655 }
1659 1656
1660 if (FLAG_disable_native_files) { 1657 if (FLAG_disable_native_files) {
1661 PrintF("Warning: Running without installed natives!\n"); 1658 PrintF("Warning: Running without installed natives!\n");
1662 return true; 1659 return true;
1663 } 1660 }
1664 1661
1665 // Install natives. 1662 // Install natives.
1666 for (int i = Natives::GetDebuggerCount(); 1663 for (int i = Natives::GetDebuggerCount();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 initial_map->set_constructor(*array_constructor); 1731 initial_map->set_constructor(*array_constructor);
1735 1732
1736 // Set prototype on map. 1733 // Set prototype on map.
1737 initial_map->set_non_instance_prototype(false); 1734 initial_map->set_non_instance_prototype(false);
1738 initial_map->set_prototype(*array_prototype); 1735 initial_map->set_prototype(*array_prototype);
1739 1736
1740 // 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".
1741 Handle<DescriptorArray> reresult_descriptors = 1738 Handle<DescriptorArray> reresult_descriptors =
1742 factory()->NewDescriptorArray(3); 1739 factory()->NewDescriptorArray(3);
1743 DescriptorArray::WhitenessWitness witness(*reresult_descriptors); 1740 DescriptorArray::WhitenessWitness witness(*reresult_descriptors);
1741 initial_map->set_instance_descriptors(*reresult_descriptors);
1744 1742
1745 JSFunction* array_function = global_context()->array_function(); 1743 {
1746 Handle<DescriptorArray> array_descriptors( 1744 JSFunction* array_function = global_context()->array_function();
1747 array_function->initial_map()->instance_descriptors()); 1745 Handle<DescriptorArray> array_descriptors(
1748 int old = array_descriptors->SearchWithCache(heap()->length_symbol()); 1746 array_function->initial_map()->instance_descriptors());
1749 reresult_descriptors->CopyFrom(0, *array_descriptors, old, witness); 1747 String* length = heap()->length_symbol();
1750 1748 int old = array_descriptors->SearchWithCache(length);
1751 reresult_descriptors->SetLastAdded(0); 1749 ASSERT(old != DescriptorArray::kNotFound);
1752 1750 CallbacksDescriptor desc(length,
1751 array_descriptors->GetValue(old),
1752 array_descriptors->GetDetails(old).attributes());
1753 initial_map->AppendDescriptor(&desc, witness);
1754 }
1753 { 1755 {
1754 FieldDescriptor index_field(heap()->index_symbol(), 1756 FieldDescriptor index_field(heap()->index_symbol(),
1755 JSRegExpResult::kIndexIndex, 1757 JSRegExpResult::kIndexIndex,
1756 NONE); 1758 NONE);
1757 reresult_descriptors->Append(&index_field, witness); 1759 initial_map->AppendDescriptor(&index_field, witness);
1758 } 1760 }
1759 1761
1760 { 1762 {
1761 FieldDescriptor input_field(heap()->input_symbol(), 1763 FieldDescriptor input_field(heap()->input_symbol(),
1762 JSRegExpResult::kInputIndex, 1764 JSRegExpResult::kInputIndex,
1763 NONE); 1765 NONE);
1764 reresult_descriptors->Append(&input_field, witness); 1766 initial_map->AppendDescriptor(&input_field, witness);
1765 } 1767 }
1766 initial_map->set_instance_descriptors(*reresult_descriptors);
1767 1768
1768 initial_map->set_inobject_properties(2); 1769 initial_map->set_inobject_properties(2);
1769 initial_map->set_pre_allocated_property_fields(2); 1770 initial_map->set_pre_allocated_property_fields(2);
1770 initial_map->set_unused_property_fields(0); 1771 initial_map->set_unused_property_fields(0);
1771 1772
1772 global_context()->set_regexp_result_map(*initial_map); 1773 global_context()->set_regexp_result_map(*initial_map);
1773 } 1774 }
1774 1775
1775 #ifdef DEBUG 1776 #ifdef DEBUG
1776 builtins->Verify(); 1777 builtins->Verify();
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
2362 return from + sizeof(NestingCounterType); 2363 return from + sizeof(NestingCounterType);
2363 } 2364 }
2364 2365
2365 2366
2366 // Called when the top-level V8 mutex is destroyed. 2367 // Called when the top-level V8 mutex is destroyed.
2367 void Bootstrapper::FreeThreadResources() { 2368 void Bootstrapper::FreeThreadResources() {
2368 ASSERT(!IsActive()); 2369 ASSERT(!IsActive());
2369 } 2370 }
2370 2371
2371 } } // namespace v8::internal 2372 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698