OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 | 369 |
370 Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( | 370 Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( |
371 PrototypePropertyMode prototypeMode) { | 371 PrototypePropertyMode prototypeMode) { |
372 Handle<DescriptorArray> descriptors = | 372 Handle<DescriptorArray> descriptors = |
373 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE | 373 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE |
374 ? 4 | 374 ? 4 |
375 : 5); | 375 : 5); |
376 PropertyAttributes attributes = | 376 PropertyAttributes attributes = |
377 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 377 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
378 | 378 |
| 379 DescriptorArray::WhitenessWitness witness(*descriptors); |
| 380 |
379 { // Add length. | 381 { // Add length. |
380 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); | 382 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); |
381 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); | 383 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); |
382 descriptors->Set(0, &d); | 384 descriptors->Set(0, &d, witness); |
383 } | 385 } |
384 { // Add name. | 386 { // Add name. |
385 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); | 387 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); |
386 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); | 388 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); |
387 descriptors->Set(1, &d); | 389 descriptors->Set(1, &d, witness); |
388 } | 390 } |
389 { // Add arguments. | 391 { // Add arguments. |
390 Handle<Foreign> foreign = | 392 Handle<Foreign> foreign = |
391 factory()->NewForeign(&Accessors::FunctionArguments); | 393 factory()->NewForeign(&Accessors::FunctionArguments); |
392 CallbacksDescriptor d(*factory()->arguments_symbol(), *foreign, attributes); | 394 CallbacksDescriptor d(*factory()->arguments_symbol(), *foreign, attributes); |
393 descriptors->Set(2, &d); | 395 descriptors->Set(2, &d, witness); |
394 } | 396 } |
395 { // Add caller. | 397 { // Add caller. |
396 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionCaller); | 398 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionCaller); |
397 CallbacksDescriptor d(*factory()->caller_symbol(), *foreign, attributes); | 399 CallbacksDescriptor d(*factory()->caller_symbol(), *foreign, attributes); |
398 descriptors->Set(3, &d); | 400 descriptors->Set(3, &d, witness); |
399 } | 401 } |
400 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 402 if (prototypeMode != DONT_ADD_PROTOTYPE) { |
401 // Add prototype. | 403 // Add prototype. |
402 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | 404 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { |
403 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); | 405 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); |
404 } | 406 } |
405 Handle<Foreign> foreign = | 407 Handle<Foreign> foreign = |
406 factory()->NewForeign(&Accessors::FunctionPrototype); | 408 factory()->NewForeign(&Accessors::FunctionPrototype); |
407 CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes); | 409 CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes); |
408 descriptors->Set(4, &d); | 410 descriptors->Set(4, &d, witness); |
409 } | 411 } |
410 descriptors->Sort(); | 412 descriptors->Sort(witness); |
411 return descriptors; | 413 return descriptors; |
412 } | 414 } |
413 | 415 |
414 | 416 |
415 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { | 417 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { |
416 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 418 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
417 Handle<DescriptorArray> descriptors = | 419 Handle<DescriptorArray> descriptors = |
418 ComputeFunctionInstanceDescriptor(prototype_mode); | 420 ComputeFunctionInstanceDescriptor(prototype_mode); |
419 map->set_instance_descriptors(*descriptors); | 421 map->set_instance_descriptors(*descriptors); |
420 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 422 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 PrototypePropertyMode prototypeMode, | 520 PrototypePropertyMode prototypeMode, |
519 Handle<FixedArray> arguments, | 521 Handle<FixedArray> arguments, |
520 Handle<FixedArray> caller) { | 522 Handle<FixedArray> caller) { |
521 Handle<DescriptorArray> descriptors = | 523 Handle<DescriptorArray> descriptors = |
522 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE | 524 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE |
523 ? 4 | 525 ? 4 |
524 : 5); | 526 : 5); |
525 PropertyAttributes attributes = static_cast<PropertyAttributes>( | 527 PropertyAttributes attributes = static_cast<PropertyAttributes>( |
526 DONT_ENUM | DONT_DELETE); | 528 DONT_ENUM | DONT_DELETE); |
527 | 529 |
| 530 DescriptorArray::WhitenessWitness witness(*descriptors); |
| 531 |
528 { // length | 532 { // length |
529 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); | 533 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); |
530 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); | 534 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); |
531 descriptors->Set(0, &d); | 535 descriptors->Set(0, &d, witness); |
532 } | 536 } |
533 { // name | 537 { // name |
534 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); | 538 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); |
535 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); | 539 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); |
536 descriptors->Set(1, &d); | 540 descriptors->Set(1, &d, witness); |
537 } | 541 } |
538 { // arguments | 542 { // arguments |
539 CallbacksDescriptor d(*factory()->arguments_symbol(), | 543 CallbacksDescriptor d(*factory()->arguments_symbol(), |
540 *arguments, | 544 *arguments, |
541 attributes); | 545 attributes); |
542 descriptors->Set(2, &d); | 546 descriptors->Set(2, &d, witness); |
543 } | 547 } |
544 { // caller | 548 { // caller |
545 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); | 549 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); |
546 descriptors->Set(3, &d); | 550 descriptors->Set(3, &d, witness); |
547 } | 551 } |
548 | 552 |
549 // prototype | 553 // prototype |
550 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 554 if (prototypeMode != DONT_ADD_PROTOTYPE) { |
551 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { | 555 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { |
552 attributes = static_cast<PropertyAttributes>(attributes | READ_ONLY); | 556 attributes = static_cast<PropertyAttributes>(attributes | READ_ONLY); |
553 } | 557 } |
554 Handle<Foreign> foreign = | 558 Handle<Foreign> foreign = |
555 factory()->NewForeign(&Accessors::FunctionPrototype); | 559 factory()->NewForeign(&Accessors::FunctionPrototype); |
556 CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes); | 560 CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes); |
557 descriptors->Set(4, &d); | 561 descriptors->Set(4, &d, witness); |
558 } | 562 } |
559 | 563 |
560 descriptors->Sort(); | 564 descriptors->Sort(witness); |
561 return descriptors; | 565 return descriptors; |
562 } | 566 } |
563 | 567 |
564 | 568 |
565 // ECMAScript 5th Edition, 13.2.3 | 569 // ECMAScript 5th Edition, 13.2.3 |
566 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { | 570 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { |
567 if (throw_type_error_function.is_null()) { | 571 if (throw_type_error_function.is_null()) { |
568 Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); | 572 Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); |
569 throw_type_error_function = | 573 throw_type_error_function = |
570 factory()->NewFunctionWithoutPrototype(name, kNonStrictMode); | 574 factory()->NewFunctionWithoutPrototype(name, kNonStrictMode); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 isolate->initial_object_prototype(), | 939 isolate->initial_object_prototype(), |
936 Builtins::kIllegal, true); | 940 Builtins::kIllegal, true); |
937 global_context()->set_regexp_function(*regexp_fun); | 941 global_context()->set_regexp_function(*regexp_fun); |
938 | 942 |
939 ASSERT(regexp_fun->has_initial_map()); | 943 ASSERT(regexp_fun->has_initial_map()); |
940 Handle<Map> initial_map(regexp_fun->initial_map()); | 944 Handle<Map> initial_map(regexp_fun->initial_map()); |
941 | 945 |
942 ASSERT_EQ(0, initial_map->inobject_properties()); | 946 ASSERT_EQ(0, initial_map->inobject_properties()); |
943 | 947 |
944 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5); | 948 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5); |
| 949 DescriptorArray::WhitenessWitness witness(*descriptors); |
945 PropertyAttributes final = | 950 PropertyAttributes final = |
946 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 951 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
947 int enum_index = 0; | 952 int enum_index = 0; |
948 { | 953 { |
949 // ECMA-262, section 15.10.7.1. | 954 // ECMA-262, section 15.10.7.1. |
950 FieldDescriptor field(heap->source_symbol(), | 955 FieldDescriptor field(heap->source_symbol(), |
951 JSRegExp::kSourceFieldIndex, | 956 JSRegExp::kSourceFieldIndex, |
952 final, | 957 final, |
953 enum_index++); | 958 enum_index++); |
954 descriptors->Set(0, &field); | 959 descriptors->Set(0, &field, witness); |
955 } | 960 } |
956 { | 961 { |
957 // ECMA-262, section 15.10.7.2. | 962 // ECMA-262, section 15.10.7.2. |
958 FieldDescriptor field(heap->global_symbol(), | 963 FieldDescriptor field(heap->global_symbol(), |
959 JSRegExp::kGlobalFieldIndex, | 964 JSRegExp::kGlobalFieldIndex, |
960 final, | 965 final, |
961 enum_index++); | 966 enum_index++); |
962 descriptors->Set(1, &field); | 967 descriptors->Set(1, &field, witness); |
963 } | 968 } |
964 { | 969 { |
965 // ECMA-262, section 15.10.7.3. | 970 // ECMA-262, section 15.10.7.3. |
966 FieldDescriptor field(heap->ignore_case_symbol(), | 971 FieldDescriptor field(heap->ignore_case_symbol(), |
967 JSRegExp::kIgnoreCaseFieldIndex, | 972 JSRegExp::kIgnoreCaseFieldIndex, |
968 final, | 973 final, |
969 enum_index++); | 974 enum_index++); |
970 descriptors->Set(2, &field); | 975 descriptors->Set(2, &field, witness); |
971 } | 976 } |
972 { | 977 { |
973 // ECMA-262, section 15.10.7.4. | 978 // ECMA-262, section 15.10.7.4. |
974 FieldDescriptor field(heap->multiline_symbol(), | 979 FieldDescriptor field(heap->multiline_symbol(), |
975 JSRegExp::kMultilineFieldIndex, | 980 JSRegExp::kMultilineFieldIndex, |
976 final, | 981 final, |
977 enum_index++); | 982 enum_index++); |
978 descriptors->Set(3, &field); | 983 descriptors->Set(3, &field, witness); |
979 } | 984 } |
980 { | 985 { |
981 // ECMA-262, section 15.10.7.5. | 986 // ECMA-262, section 15.10.7.5. |
982 PropertyAttributes writable = | 987 PropertyAttributes writable = |
983 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 988 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
984 FieldDescriptor field(heap->last_index_symbol(), | 989 FieldDescriptor field(heap->last_index_symbol(), |
985 JSRegExp::kLastIndexFieldIndex, | 990 JSRegExp::kLastIndexFieldIndex, |
986 writable, | 991 writable, |
987 enum_index++); | 992 enum_index++); |
988 descriptors->Set(4, &field); | 993 descriptors->Set(4, &field, witness); |
989 } | 994 } |
990 descriptors->SetNextEnumerationIndex(enum_index); | 995 descriptors->SetNextEnumerationIndex(enum_index); |
991 descriptors->Sort(); | 996 descriptors->Sort(witness); |
992 | 997 |
993 initial_map->set_inobject_properties(5); | 998 initial_map->set_inobject_properties(5); |
994 initial_map->set_pre_allocated_property_fields(5); | 999 initial_map->set_pre_allocated_property_fields(5); |
995 initial_map->set_unused_property_fields(0); | 1000 initial_map->set_unused_property_fields(0); |
996 initial_map->set_instance_size( | 1001 initial_map->set_instance_size( |
997 initial_map->instance_size() + 5 * kPointerSize); | 1002 initial_map->instance_size() + 5 * kPointerSize); |
998 initial_map->set_instance_descriptors(*descriptors); | 1003 initial_map->set_instance_descriptors(*descriptors); |
999 initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); | 1004 initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); |
1000 | 1005 |
1001 // RegExp prototype object is itself a RegExp. | 1006 // RegExp prototype object is itself a RegExp. |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 GetThrowTypeErrorFunction(); | 1123 GetThrowTypeErrorFunction(); |
1119 | 1124 |
1120 // Install the ThrowTypeError functions. | 1125 // Install the ThrowTypeError functions. |
1121 callee->set(0, *throw_function); | 1126 callee->set(0, *throw_function); |
1122 callee->set(1, *throw_function); | 1127 callee->set(1, *throw_function); |
1123 caller->set(0, *throw_function); | 1128 caller->set(0, *throw_function); |
1124 caller->set(1, *throw_function); | 1129 caller->set(1, *throw_function); |
1125 | 1130 |
1126 // Create the descriptor array for the arguments object. | 1131 // Create the descriptor array for the arguments object. |
1127 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3); | 1132 Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3); |
| 1133 DescriptorArray::WhitenessWitness witness(*descriptors); |
1128 { // length | 1134 { // length |
1129 FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM); | 1135 FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM); |
1130 descriptors->Set(0, &d); | 1136 descriptors->Set(0, &d, witness); |
1131 } | 1137 } |
1132 { // callee | 1138 { // callee |
1133 CallbacksDescriptor d(*factory->callee_symbol(), *callee, attributes); | 1139 CallbacksDescriptor d(*factory->callee_symbol(), *callee, attributes); |
1134 descriptors->Set(1, &d); | 1140 descriptors->Set(1, &d, witness); |
1135 } | 1141 } |
1136 { // caller | 1142 { // caller |
1137 CallbacksDescriptor d(*factory->caller_symbol(), *caller, attributes); | 1143 CallbacksDescriptor d(*factory->caller_symbol(), *caller, attributes); |
1138 descriptors->Set(2, &d); | 1144 descriptors->Set(2, &d, witness); |
1139 } | 1145 } |
1140 descriptors->Sort(); | 1146 descriptors->Sort(witness); |
1141 | 1147 |
1142 // Create the map. Allocate one in-object field for length. | 1148 // Create the map. Allocate one in-object field for length. |
1143 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, | 1149 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, |
1144 Heap::kArgumentsObjectSizeStrict); | 1150 Heap::kArgumentsObjectSizeStrict); |
1145 map->set_instance_descriptors(*descriptors); | 1151 map->set_instance_descriptors(*descriptors); |
1146 map->set_function_with_prototype(true); | 1152 map->set_function_with_prototype(true); |
1147 map->set_prototype(global_context()->object_function()->prototype()); | 1153 map->set_prototype(global_context()->object_function()->prototype()); |
1148 map->set_pre_allocated_property_fields(1); | 1154 map->set_pre_allocated_property_fields(1); |
1149 map->set_inobject_properties(1); | 1155 map->set_inobject_properties(1); |
1150 | 1156 |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 | 1695 |
1690 // Update map with length accessor from Array and add "index" and "input". | 1696 // Update map with length accessor from Array and add "index" and "input". |
1691 Handle<Map> array_map(global_context()->js_array_map()); | 1697 Handle<Map> array_map(global_context()->js_array_map()); |
1692 Handle<DescriptorArray> array_descriptors( | 1698 Handle<DescriptorArray> array_descriptors( |
1693 array_map->instance_descriptors()); | 1699 array_map->instance_descriptors()); |
1694 ASSERT_EQ(1, array_descriptors->number_of_descriptors()); | 1700 ASSERT_EQ(1, array_descriptors->number_of_descriptors()); |
1695 | 1701 |
1696 Handle<DescriptorArray> reresult_descriptors = | 1702 Handle<DescriptorArray> reresult_descriptors = |
1697 factory()->NewDescriptorArray(3); | 1703 factory()->NewDescriptorArray(3); |
1698 | 1704 |
1699 reresult_descriptors->CopyFrom(0, *array_descriptors, 0); | 1705 DescriptorArray::WhitenessWitness witness(*reresult_descriptors); |
| 1706 |
| 1707 reresult_descriptors->CopyFrom(0, *array_descriptors, 0, witness); |
1700 | 1708 |
1701 int enum_index = 0; | 1709 int enum_index = 0; |
1702 { | 1710 { |
1703 FieldDescriptor index_field(heap()->index_symbol(), | 1711 FieldDescriptor index_field(heap()->index_symbol(), |
1704 JSRegExpResult::kIndexIndex, | 1712 JSRegExpResult::kIndexIndex, |
1705 NONE, | 1713 NONE, |
1706 enum_index++); | 1714 enum_index++); |
1707 reresult_descriptors->Set(1, &index_field); | 1715 reresult_descriptors->Set(1, &index_field, witness); |
1708 } | 1716 } |
1709 | 1717 |
1710 { | 1718 { |
1711 FieldDescriptor input_field(heap()->input_symbol(), | 1719 FieldDescriptor input_field(heap()->input_symbol(), |
1712 JSRegExpResult::kInputIndex, | 1720 JSRegExpResult::kInputIndex, |
1713 NONE, | 1721 NONE, |
1714 enum_index++); | 1722 enum_index++); |
1715 reresult_descriptors->Set(2, &input_field); | 1723 reresult_descriptors->Set(2, &input_field, witness); |
1716 } | 1724 } |
1717 reresult_descriptors->Sort(); | 1725 reresult_descriptors->Sort(witness); |
1718 | 1726 |
1719 initial_map->set_inobject_properties(2); | 1727 initial_map->set_inobject_properties(2); |
1720 initial_map->set_pre_allocated_property_fields(2); | 1728 initial_map->set_pre_allocated_property_fields(2); |
1721 initial_map->set_unused_property_fields(0); | 1729 initial_map->set_unused_property_fields(0); |
1722 initial_map->set_instance_descriptors(*reresult_descriptors); | 1730 initial_map->set_instance_descriptors(*reresult_descriptors); |
1723 | 1731 |
1724 global_context()->set_regexp_result_map(*initial_map); | 1732 global_context()->set_regexp_result_map(*initial_map); |
1725 } | 1733 } |
1726 | 1734 |
1727 #ifdef DEBUG | 1735 #ifdef DEBUG |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2268 return from + sizeof(NestingCounterType); | 2276 return from + sizeof(NestingCounterType); |
2269 } | 2277 } |
2270 | 2278 |
2271 | 2279 |
2272 // Called when the top-level V8 mutex is destroyed. | 2280 // Called when the top-level V8 mutex is destroyed. |
2273 void Bootstrapper::FreeThreadResources() { | 2281 void Bootstrapper::FreeThreadResources() { |
2274 ASSERT(!IsActive()); | 2282 ASSERT(!IsActive()); |
2275 } | 2283 } |
2276 | 2284 |
2277 } } // namespace v8::internal | 2285 } } // namespace v8::internal |
OLD | NEW |