OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/extensions/externalize-string-extension.h" | 9 #include "src/extensions/externalize-string-extension.h" |
10 #include "src/extensions/free-buffer-extension.h" | 10 #include "src/extensions/free-buffer-extension.h" |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 Handle<Map> map, FunctionMode function_mode) { | 411 Handle<Map> map, FunctionMode function_mode) { |
412 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; | 412 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
413 Map::EnsureDescriptorSlack(map, size); | 413 Map::EnsureDescriptorSlack(map, size); |
414 | 414 |
415 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 415 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
416 DONT_ENUM | DONT_DELETE | READ_ONLY); | 416 DONT_ENUM | DONT_DELETE | READ_ONLY); |
417 | 417 |
418 Handle<AccessorInfo> length = | 418 Handle<AccessorInfo> length = |
419 Accessors::FunctionLengthInfo(isolate(), attribs); | 419 Accessors::FunctionLengthInfo(isolate(), attribs); |
420 { // Add length. | 420 { // Add length. |
421 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), | 421 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())), |
422 length, attribs); | 422 length, attribs); |
423 map->AppendDescriptor(&d); | 423 map->AppendDescriptor(&d); |
424 } | 424 } |
425 Handle<AccessorInfo> name = | 425 Handle<AccessorInfo> name = |
426 Accessors::FunctionNameInfo(isolate(), attribs); | 426 Accessors::FunctionNameInfo(isolate(), attribs); |
427 { // Add name. | 427 { // Add name. |
428 CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), | 428 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, |
429 name, attribs); | 429 attribs); |
430 map->AppendDescriptor(&d); | 430 map->AppendDescriptor(&d); |
431 } | 431 } |
432 Handle<AccessorInfo> args = | 432 Handle<AccessorInfo> args = |
433 Accessors::FunctionArgumentsInfo(isolate(), attribs); | 433 Accessors::FunctionArgumentsInfo(isolate(), attribs); |
434 { // Add arguments. | 434 { // Add arguments. |
435 CallbacksDescriptor d(Handle<Name>(Name::cast(args->name())), | 435 AccessorConstantDescriptor d(Handle<Name>(Name::cast(args->name())), args, |
436 args, attribs); | 436 attribs); |
437 map->AppendDescriptor(&d); | 437 map->AppendDescriptor(&d); |
438 } | 438 } |
439 Handle<AccessorInfo> caller = | 439 Handle<AccessorInfo> caller = |
440 Accessors::FunctionCallerInfo(isolate(), attribs); | 440 Accessors::FunctionCallerInfo(isolate(), attribs); |
441 { // Add caller. | 441 { // Add caller. |
442 CallbacksDescriptor d(Handle<Name>(Name::cast(caller->name())), | 442 AccessorConstantDescriptor d(Handle<Name>(Name::cast(caller->name())), |
443 caller, attribs); | 443 caller, attribs); |
444 map->AppendDescriptor(&d); | 444 map->AppendDescriptor(&d); |
445 } | 445 } |
446 if (IsFunctionModeWithPrototype(function_mode)) { | 446 if (IsFunctionModeWithPrototype(function_mode)) { |
447 if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) { | 447 if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) { |
448 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); | 448 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); |
449 } | 449 } |
450 Handle<AccessorInfo> prototype = | 450 Handle<AccessorInfo> prototype = |
451 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 451 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
452 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), | 452 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), |
453 prototype, attribs); | 453 prototype, attribs); |
454 map->AppendDescriptor(&d); | 454 map->AppendDescriptor(&d); |
455 } | 455 } |
456 } | 456 } |
457 | 457 |
458 | 458 |
459 Handle<Map> Genesis::CreateFunctionMap(FunctionMode function_mode) { | 459 Handle<Map> Genesis::CreateFunctionMap(FunctionMode function_mode) { |
460 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 460 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
461 SetFunctionInstanceDescriptor(map, function_mode); | 461 SetFunctionInstanceDescriptor(map, function_mode); |
462 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); | 462 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); |
463 return map; | 463 return map; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | 567 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); |
568 Handle<AccessorPair> caller(factory()->NewAccessorPair()); | 568 Handle<AccessorPair> caller(factory()->NewAccessorPair()); |
569 PropertyAttributes rw_attribs = | 569 PropertyAttributes rw_attribs = |
570 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 570 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
571 PropertyAttributes ro_attribs = | 571 PropertyAttributes ro_attribs = |
572 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 572 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
573 | 573 |
574 // Add length. | 574 // Add length. |
575 if (function_mode == BOUND_FUNCTION) { | 575 if (function_mode == BOUND_FUNCTION) { |
576 Handle<String> length_string = isolate()->factory()->length_string(); | 576 Handle<String> length_string = isolate()->factory()->length_string(); |
577 FieldDescriptor d(length_string, 0, ro_attribs, Representation::Tagged()); | 577 DataDescriptor d(length_string, 0, ro_attribs, Representation::Tagged()); |
578 map->AppendDescriptor(&d); | 578 map->AppendDescriptor(&d); |
579 } else { | 579 } else { |
580 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || | 580 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || |
581 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || | 581 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || |
582 function_mode == FUNCTION_WITHOUT_PROTOTYPE); | 582 function_mode == FUNCTION_WITHOUT_PROTOTYPE); |
583 Handle<AccessorInfo> length = | 583 Handle<AccessorInfo> length = |
584 Accessors::FunctionLengthInfo(isolate(), ro_attribs); | 584 Accessors::FunctionLengthInfo(isolate(), ro_attribs); |
585 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), | 585 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())), |
586 length, ro_attribs); | 586 length, ro_attribs); |
587 map->AppendDescriptor(&d); | 587 map->AppendDescriptor(&d); |
588 } | 588 } |
589 Handle<AccessorInfo> name = | 589 Handle<AccessorInfo> name = |
590 Accessors::FunctionNameInfo(isolate(), ro_attribs); | 590 Accessors::FunctionNameInfo(isolate(), ro_attribs); |
591 { // Add name. | 591 { // Add name. |
592 CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), | 592 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, |
593 name, ro_attribs); | 593 ro_attribs); |
594 map->AppendDescriptor(&d); | 594 map->AppendDescriptor(&d); |
595 } | 595 } |
596 { // Add arguments. | 596 { // Add arguments. |
597 CallbacksDescriptor d(factory()->arguments_string(), arguments, | 597 AccessorConstantDescriptor d(factory()->arguments_string(), arguments, |
598 rw_attribs); | 598 rw_attribs); |
599 map->AppendDescriptor(&d); | 599 map->AppendDescriptor(&d); |
600 } | 600 } |
601 { // Add caller. | 601 { // Add caller. |
602 CallbacksDescriptor d(factory()->caller_string(), caller, rw_attribs); | 602 AccessorConstantDescriptor d(factory()->caller_string(), caller, |
| 603 rw_attribs); |
603 map->AppendDescriptor(&d); | 604 map->AppendDescriptor(&d); |
604 } | 605 } |
605 if (IsFunctionModeWithPrototype(function_mode)) { | 606 if (IsFunctionModeWithPrototype(function_mode)) { |
606 // Add prototype. | 607 // Add prototype. |
607 PropertyAttributes attribs = | 608 PropertyAttributes attribs = |
608 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs | 609 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs |
609 : ro_attribs; | 610 : ro_attribs; |
610 Handle<AccessorInfo> prototype = | 611 Handle<AccessorInfo> prototype = |
611 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 612 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
612 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), | 613 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), |
613 prototype, attribs); | 614 prototype, attribs); |
614 map->AppendDescriptor(&d); | 615 map->AppendDescriptor(&d); |
615 } | 616 } |
616 } | 617 } |
617 | 618 |
618 | 619 |
619 // ECMAScript 5th Edition, 13.2.3 | 620 // ECMAScript 5th Edition, 13.2.3 |
620 Handle<JSFunction> Genesis::GetStrictPoisonFunction() { | 621 Handle<JSFunction> Genesis::GetStrictPoisonFunction() { |
621 if (strict_poison_function.is_null()) { | 622 if (strict_poison_function.is_null()) { |
622 Handle<String> name = factory()->InternalizeOneByteString( | 623 Handle<String> name = factory()->InternalizeOneByteString( |
623 STATIC_CHAR_VECTOR("ThrowTypeError")); | 624 STATIC_CHAR_VECTOR("ThrowTypeError")); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 accessors->set_setter(*func); | 703 accessors->set_setter(*func); |
703 } | 704 } |
704 | 705 |
705 | 706 |
706 static void ReplaceAccessors(Handle<Map> map, | 707 static void ReplaceAccessors(Handle<Map> map, |
707 Handle<String> name, | 708 Handle<String> name, |
708 PropertyAttributes attributes, | 709 PropertyAttributes attributes, |
709 Handle<AccessorPair> accessor_pair) { | 710 Handle<AccessorPair> accessor_pair) { |
710 DescriptorArray* descriptors = map->instance_descriptors(); | 711 DescriptorArray* descriptors = map->instance_descriptors(); |
711 int idx = descriptors->SearchWithCache(*name, *map); | 712 int idx = descriptors->SearchWithCache(*name, *map); |
712 CallbacksDescriptor descriptor(name, accessor_pair, attributes); | 713 AccessorConstantDescriptor descriptor(name, accessor_pair, attributes); |
713 descriptors->Replace(idx, &descriptor); | 714 descriptors->Replace(idx, &descriptor); |
714 } | 715 } |
715 | 716 |
716 | 717 |
717 void Genesis::PoisonArgumentsAndCaller(Handle<Map> map) { | 718 void Genesis::PoisonArgumentsAndCaller(Handle<Map> map) { |
718 SetAccessors(map, factory()->arguments_string(), GetStrictPoisonFunction()); | 719 SetAccessors(map, factory()->arguments_string(), GetStrictPoisonFunction()); |
719 SetAccessors(map, factory()->caller_string(), GetStrictPoisonFunction()); | 720 SetAccessors(map, factory()->caller_string(), GetStrictPoisonFunction()); |
720 } | 721 } |
721 | 722 |
722 | 723 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 // HGraphBuilder::JSArrayBuilder::EmitMapCode() | 943 // HGraphBuilder::JSArrayBuilder::EmitMapCode() |
943 DCHECK(initial_map->elements_kind() == GetInitialFastElementsKind()); | 944 DCHECK(initial_map->elements_kind() == GetInitialFastElementsKind()); |
944 Map::EnsureDescriptorSlack(initial_map, 1); | 945 Map::EnsureDescriptorSlack(initial_map, 1); |
945 | 946 |
946 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 947 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
947 DONT_ENUM | DONT_DELETE); | 948 DONT_ENUM | DONT_DELETE); |
948 | 949 |
949 Handle<AccessorInfo> array_length = | 950 Handle<AccessorInfo> array_length = |
950 Accessors::ArrayLengthInfo(isolate, attribs); | 951 Accessors::ArrayLengthInfo(isolate, attribs); |
951 { // Add length. | 952 { // Add length. |
952 CallbacksDescriptor d( | 953 AccessorConstantDescriptor d( |
953 Handle<Name>(Name::cast(array_length->name())), | 954 Handle<Name>(Name::cast(array_length->name())), array_length, |
954 array_length, attribs); | 955 attribs); |
955 initial_map->AppendDescriptor(&d); | 956 initial_map->AppendDescriptor(&d); |
956 } | 957 } |
957 | 958 |
958 // array_function is used internally. JS code creating array object should | 959 // array_function is used internally. JS code creating array object should |
959 // search for the 'Array' property on the global object and use that one | 960 // search for the 'Array' property on the global object and use that one |
960 // as the constructor. 'Array' property on a global object can be | 961 // as the constructor. 'Array' property on a global object can be |
961 // overwritten by JS code. | 962 // overwritten by JS code. |
962 native_context()->set_array_function(*array_function); | 963 native_context()->set_array_function(*array_function); |
963 | 964 |
964 // Cache the array maps, needed by ArrayConstructorStub | 965 // Cache the array maps, needed by ArrayConstructorStub |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 Handle<Map> string_map = | 997 Handle<Map> string_map = |
997 Handle<Map>(native_context()->string_function()->initial_map()); | 998 Handle<Map>(native_context()->string_function()->initial_map()); |
998 Map::EnsureDescriptorSlack(string_map, 1); | 999 Map::EnsureDescriptorSlack(string_map, 1); |
999 | 1000 |
1000 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 1001 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
1001 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1002 DONT_ENUM | DONT_DELETE | READ_ONLY); |
1002 Handle<AccessorInfo> string_length( | 1003 Handle<AccessorInfo> string_length( |
1003 Accessors::StringLengthInfo(isolate, attribs)); | 1004 Accessors::StringLengthInfo(isolate, attribs)); |
1004 | 1005 |
1005 { // Add length. | 1006 { // Add length. |
1006 CallbacksDescriptor d(factory->length_string(), string_length, attribs); | 1007 AccessorConstantDescriptor d(factory->length_string(), string_length, |
| 1008 attribs); |
1007 string_map->AppendDescriptor(&d); | 1009 string_map->AppendDescriptor(&d); |
1008 } | 1010 } |
1009 } | 1011 } |
1010 | 1012 |
1011 { | 1013 { |
1012 // --- S y m b o l --- | 1014 // --- S y m b o l --- |
1013 Handle<JSFunction> symbol_fun = InstallFunction( | 1015 Handle<JSFunction> symbol_fun = InstallFunction( |
1014 global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, | 1016 global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, |
1015 isolate->initial_object_prototype(), Builtins::kIllegal); | 1017 isolate->initial_object_prototype(), Builtins::kIllegal); |
1016 native_context()->set_symbol_function(*symbol_fun); | 1018 native_context()->set_symbol_function(*symbol_fun); |
(...skipping 24 matching lines...) Expand all Loading... |
1041 DCHECK_EQ(0, initial_map->inobject_properties()); | 1043 DCHECK_EQ(0, initial_map->inobject_properties()); |
1042 | 1044 |
1043 PropertyAttributes final = | 1045 PropertyAttributes final = |
1044 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1046 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
1045 Map::EnsureDescriptorSlack(initial_map, 5); | 1047 Map::EnsureDescriptorSlack(initial_map, 5); |
1046 | 1048 |
1047 { | 1049 { |
1048 // ECMA-262, section 15.10.7.1. | 1050 // ECMA-262, section 15.10.7.1. |
1049 Handle<AccessorInfo> regexp_source( | 1051 Handle<AccessorInfo> regexp_source( |
1050 Accessors::RegExpSourceInfo(isolate, final)); | 1052 Accessors::RegExpSourceInfo(isolate, final)); |
1051 CallbacksDescriptor d(factory->source_string(), regexp_source, final); | 1053 AccessorConstantDescriptor d(factory->source_string(), regexp_source, |
| 1054 final); |
1052 initial_map->AppendDescriptor(&d); | 1055 initial_map->AppendDescriptor(&d); |
1053 } | 1056 } |
1054 { | 1057 { |
1055 // ECMA-262, section 15.10.7.2. | 1058 // ECMA-262, section 15.10.7.2. |
1056 FieldDescriptor field(factory->global_string(), | 1059 DataDescriptor field(factory->global_string(), |
1057 JSRegExp::kGlobalFieldIndex, | 1060 JSRegExp::kGlobalFieldIndex, final, |
1058 final, | 1061 Representation::Tagged()); |
1059 Representation::Tagged()); | |
1060 initial_map->AppendDescriptor(&field); | 1062 initial_map->AppendDescriptor(&field); |
1061 } | 1063 } |
1062 { | 1064 { |
1063 // ECMA-262, section 15.10.7.3. | 1065 // ECMA-262, section 15.10.7.3. |
1064 FieldDescriptor field(factory->ignore_case_string(), | 1066 DataDescriptor field(factory->ignore_case_string(), |
1065 JSRegExp::kIgnoreCaseFieldIndex, | 1067 JSRegExp::kIgnoreCaseFieldIndex, final, |
1066 final, | 1068 Representation::Tagged()); |
1067 Representation::Tagged()); | |
1068 initial_map->AppendDescriptor(&field); | 1069 initial_map->AppendDescriptor(&field); |
1069 } | 1070 } |
1070 { | 1071 { |
1071 // ECMA-262, section 15.10.7.4. | 1072 // ECMA-262, section 15.10.7.4. |
1072 FieldDescriptor field(factory->multiline_string(), | 1073 DataDescriptor field(factory->multiline_string(), |
1073 JSRegExp::kMultilineFieldIndex, | 1074 JSRegExp::kMultilineFieldIndex, final, |
1074 final, | 1075 Representation::Tagged()); |
1075 Representation::Tagged()); | |
1076 initial_map->AppendDescriptor(&field); | 1076 initial_map->AppendDescriptor(&field); |
1077 } | 1077 } |
1078 { | 1078 { |
1079 // ECMA-262, section 15.10.7.5. | 1079 // ECMA-262, section 15.10.7.5. |
1080 PropertyAttributes writable = | 1080 PropertyAttributes writable = |
1081 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 1081 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
1082 FieldDescriptor field(factory->last_index_string(), | 1082 DataDescriptor field(factory->last_index_string(), |
1083 JSRegExp::kLastIndexFieldIndex, | 1083 JSRegExp::kLastIndexFieldIndex, writable, |
1084 writable, | 1084 Representation::Tagged()); |
1085 Representation::Tagged()); | |
1086 initial_map->AppendDescriptor(&field); | 1085 initial_map->AppendDescriptor(&field); |
1087 } | 1086 } |
1088 | 1087 |
1089 static const int num_fields = JSRegExp::kInObjectFieldCount; | 1088 static const int num_fields = JSRegExp::kInObjectFieldCount; |
1090 initial_map->set_inobject_properties(num_fields); | 1089 initial_map->set_inobject_properties(num_fields); |
1091 initial_map->set_pre_allocated_property_fields(num_fields); | 1090 initial_map->set_pre_allocated_property_fields(num_fields); |
1092 initial_map->set_unused_property_fields(0); | 1091 initial_map->set_unused_property_fields(0); |
1093 initial_map->set_instance_size(initial_map->instance_size() + | 1092 initial_map->set_instance_size(initial_map->instance_size() + |
1094 num_fields * kPointerSize); | 1093 num_fields * kPointerSize); |
1095 | 1094 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 Handle<JSFunction> object_function(native_context()->object_function()); | 1171 Handle<JSFunction> object_function(native_context()->object_function()); |
1173 Handle<Map> iterator_result_map = | 1172 Handle<Map> iterator_result_map = |
1174 Map::Create(isolate, JSGeneratorObject::kResultPropertyCount); | 1173 Map::Create(isolate, JSGeneratorObject::kResultPropertyCount); |
1175 DCHECK_EQ(JSGeneratorObject::kResultSize, | 1174 DCHECK_EQ(JSGeneratorObject::kResultSize, |
1176 iterator_result_map->instance_size()); | 1175 iterator_result_map->instance_size()); |
1177 DCHECK_EQ(JSGeneratorObject::kResultPropertyCount, | 1176 DCHECK_EQ(JSGeneratorObject::kResultPropertyCount, |
1178 iterator_result_map->inobject_properties()); | 1177 iterator_result_map->inobject_properties()); |
1179 Map::EnsureDescriptorSlack(iterator_result_map, | 1178 Map::EnsureDescriptorSlack(iterator_result_map, |
1180 JSGeneratorObject::kResultPropertyCount); | 1179 JSGeneratorObject::kResultPropertyCount); |
1181 | 1180 |
1182 FieldDescriptor value_descr(factory->value_string(), | 1181 DataDescriptor value_descr(factory->value_string(), |
1183 JSGeneratorObject::kResultValuePropertyIndex, | 1182 JSGeneratorObject::kResultValuePropertyIndex, |
1184 NONE, Representation::Tagged()); | 1183 NONE, Representation::Tagged()); |
1185 iterator_result_map->AppendDescriptor(&value_descr); | 1184 iterator_result_map->AppendDescriptor(&value_descr); |
1186 | 1185 |
1187 FieldDescriptor done_descr(factory->done_string(), | 1186 DataDescriptor done_descr(factory->done_string(), |
1188 JSGeneratorObject::kResultDonePropertyIndex, | 1187 JSGeneratorObject::kResultDonePropertyIndex, NONE, |
1189 NONE, Representation::Tagged()); | 1188 Representation::Tagged()); |
1190 iterator_result_map->AppendDescriptor(&done_descr); | 1189 iterator_result_map->AppendDescriptor(&done_descr); |
1191 | 1190 |
1192 iterator_result_map->set_unused_property_fields(0); | 1191 iterator_result_map->set_unused_property_fields(0); |
1193 iterator_result_map->set_pre_allocated_property_fields( | 1192 iterator_result_map->set_pre_allocated_property_fields( |
1194 JSGeneratorObject::kResultPropertyCount); | 1193 JSGeneratorObject::kResultPropertyCount); |
1195 DCHECK_EQ(JSGeneratorObject::kResultSize, | 1194 DCHECK_EQ(JSGeneratorObject::kResultSize, |
1196 iterator_result_map->instance_size()); | 1195 iterator_result_map->instance_size()); |
1197 native_context()->set_iterator_result_map(*iterator_result_map); | 1196 native_context()->set_iterator_result_map(*iterator_result_map); |
1198 } | 1197 } |
1199 | 1198 |
(...skipping 13 matching lines...) Expand all Loading... |
1213 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( | 1212 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( |
1214 arguments_string, code); | 1213 arguments_string, code); |
1215 function->shared()->set_instance_class_name(*arguments_string); | 1214 function->shared()->set_instance_class_name(*arguments_string); |
1216 | 1215 |
1217 Handle<Map> map = | 1216 Handle<Map> map = |
1218 factory->NewMap(JS_OBJECT_TYPE, Heap::kSloppyArgumentsObjectSize); | 1217 factory->NewMap(JS_OBJECT_TYPE, Heap::kSloppyArgumentsObjectSize); |
1219 // Create the descriptor array for the arguments object. | 1218 // Create the descriptor array for the arguments object. |
1220 Map::EnsureDescriptorSlack(map, 2); | 1219 Map::EnsureDescriptorSlack(map, 2); |
1221 | 1220 |
1222 { // length | 1221 { // length |
1223 FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, | 1222 DataDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, |
1224 DONT_ENUM, Representation::Tagged()); | 1223 DONT_ENUM, Representation::Tagged()); |
1225 map->AppendDescriptor(&d); | 1224 map->AppendDescriptor(&d); |
1226 } | 1225 } |
1227 { // callee | 1226 { // callee |
1228 FieldDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, | 1227 DataDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, |
1229 DONT_ENUM, Representation::Tagged()); | 1228 DONT_ENUM, Representation::Tagged()); |
1230 map->AppendDescriptor(&d); | 1229 map->AppendDescriptor(&d); |
1231 } | 1230 } |
1232 // @@iterator method is added later. | 1231 // @@iterator method is added later. |
1233 | 1232 |
1234 map->set_function_with_prototype(true); | 1233 map->set_function_with_prototype(true); |
1235 map->set_pre_allocated_property_fields(2); | 1234 map->set_pre_allocated_property_fields(2); |
1236 map->set_inobject_properties(2); | 1235 map->set_inobject_properties(2); |
1237 native_context()->set_sloppy_arguments_map(*map); | 1236 native_context()->set_sloppy_arguments_map(*map); |
1238 | 1237 |
1239 DCHECK(!function->has_initial_map()); | 1238 DCHECK(!function->has_initial_map()); |
(...skipping 30 matching lines...) Expand all Loading... |
1270 caller->set_getter(*poison); | 1269 caller->set_getter(*poison); |
1271 caller->set_setter(*poison); | 1270 caller->set_setter(*poison); |
1272 | 1271 |
1273 // Create the map. Allocate one in-object field for length. | 1272 // Create the map. Allocate one in-object field for length. |
1274 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, | 1273 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, |
1275 Heap::kStrictArgumentsObjectSize); | 1274 Heap::kStrictArgumentsObjectSize); |
1276 // Create the descriptor array for the arguments object. | 1275 // Create the descriptor array for the arguments object. |
1277 Map::EnsureDescriptorSlack(map, 3); | 1276 Map::EnsureDescriptorSlack(map, 3); |
1278 | 1277 |
1279 { // length | 1278 { // length |
1280 FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, | 1279 DataDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, |
1281 DONT_ENUM, Representation::Tagged()); | 1280 DONT_ENUM, Representation::Tagged()); |
1282 map->AppendDescriptor(&d); | 1281 map->AppendDescriptor(&d); |
1283 } | 1282 } |
1284 { // callee | 1283 { // callee |
1285 CallbacksDescriptor d(factory->callee_string(), callee, attributes); | 1284 AccessorConstantDescriptor d(factory->callee_string(), callee, |
| 1285 attributes); |
1286 map->AppendDescriptor(&d); | 1286 map->AppendDescriptor(&d); |
1287 } | 1287 } |
1288 { // caller | 1288 { // caller |
1289 CallbacksDescriptor d(factory->caller_string(), caller, attributes); | 1289 AccessorConstantDescriptor d(factory->caller_string(), caller, |
| 1290 attributes); |
1290 map->AppendDescriptor(&d); | 1291 map->AppendDescriptor(&d); |
1291 } | 1292 } |
1292 // @@iterator method is added later. | 1293 // @@iterator method is added later. |
1293 | 1294 |
1294 map->set_function_with_prototype(true); | 1295 map->set_function_with_prototype(true); |
1295 DCHECK_EQ(native_context()->object_function()->prototype(), | 1296 DCHECK_EQ(native_context()->object_function()->prototype(), |
1296 *isolate->initial_object_prototype()); | 1297 *isolate->initial_object_prototype()); |
1297 map->SetPrototype(isolate->initial_object_prototype()); | 1298 map->SetPrototype(isolate->initial_object_prototype()); |
1298 map->set_pre_allocated_property_fields(1); | 1299 map->set_pre_allocated_property_fields(1); |
1299 map->set_inobject_properties(1); | 1300 map->set_inobject_properties(1); |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 | 1680 |
1680 // Make "length" magic on instances. | 1681 // Make "length" magic on instances. |
1681 Map::EnsureDescriptorSlack(initial_map, 1); | 1682 Map::EnsureDescriptorSlack(initial_map, 1); |
1682 | 1683 |
1683 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 1684 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
1684 DONT_ENUM | DONT_DELETE); | 1685 DONT_ENUM | DONT_DELETE); |
1685 | 1686 |
1686 Handle<AccessorInfo> array_length = | 1687 Handle<AccessorInfo> array_length = |
1687 Accessors::ArrayLengthInfo(isolate(), attribs); | 1688 Accessors::ArrayLengthInfo(isolate(), attribs); |
1688 { // Add length. | 1689 { // Add length. |
1689 CallbacksDescriptor d( | 1690 AccessorConstantDescriptor d(Handle<Name>(Name::cast(array_length->name())), |
1690 Handle<Name>(Name::cast(array_length->name())), array_length, attribs); | 1691 array_length, attribs); |
1691 initial_map->AppendDescriptor(&d); | 1692 initial_map->AppendDescriptor(&d); |
1692 } | 1693 } |
1693 | 1694 |
1694 return array_function; | 1695 return array_function; |
1695 } | 1696 } |
1696 | 1697 |
1697 | 1698 |
1698 bool Genesis::InstallNatives() { | 1699 bool Genesis::InstallNatives() { |
1699 HandleScope scope(isolate()); | 1700 HandleScope scope(isolate()); |
1700 | 1701 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 | 1763 |
1763 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); | 1764 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); |
1764 Map::EnsureDescriptorSlack(script_map, 14); | 1765 Map::EnsureDescriptorSlack(script_map, 14); |
1765 | 1766 |
1766 PropertyAttributes attribs = | 1767 PropertyAttributes attribs = |
1767 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1768 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
1768 | 1769 |
1769 Handle<AccessorInfo> script_column = | 1770 Handle<AccessorInfo> script_column = |
1770 Accessors::ScriptColumnOffsetInfo(isolate(), attribs); | 1771 Accessors::ScriptColumnOffsetInfo(isolate(), attribs); |
1771 { | 1772 { |
1772 CallbacksDescriptor d(Handle<Name>(Name::cast(script_column->name())), | 1773 AccessorConstantDescriptor d( |
1773 script_column, attribs); | 1774 Handle<Name>(Name::cast(script_column->name())), script_column, |
| 1775 attribs); |
1774 script_map->AppendDescriptor(&d); | 1776 script_map->AppendDescriptor(&d); |
1775 } | 1777 } |
1776 | 1778 |
1777 Handle<AccessorInfo> script_id = | 1779 Handle<AccessorInfo> script_id = |
1778 Accessors::ScriptIdInfo(isolate(), attribs); | 1780 Accessors::ScriptIdInfo(isolate(), attribs); |
1779 { | 1781 { |
1780 CallbacksDescriptor d(Handle<Name>(Name::cast(script_id->name())), | 1782 AccessorConstantDescriptor d(Handle<Name>(Name::cast(script_id->name())), |
1781 script_id, attribs); | 1783 script_id, attribs); |
1782 script_map->AppendDescriptor(&d); | 1784 script_map->AppendDescriptor(&d); |
1783 } | 1785 } |
1784 | 1786 |
1785 | 1787 |
1786 Handle<AccessorInfo> script_name = | 1788 Handle<AccessorInfo> script_name = |
1787 Accessors::ScriptNameInfo(isolate(), attribs); | 1789 Accessors::ScriptNameInfo(isolate(), attribs); |
1788 { | 1790 { |
1789 CallbacksDescriptor d(Handle<Name>(Name::cast(script_name->name())), | 1791 AccessorConstantDescriptor d( |
1790 script_name, attribs); | 1792 Handle<Name>(Name::cast(script_name->name())), script_name, attribs); |
1791 script_map->AppendDescriptor(&d); | 1793 script_map->AppendDescriptor(&d); |
1792 } | 1794 } |
1793 | 1795 |
1794 Handle<AccessorInfo> script_line = | 1796 Handle<AccessorInfo> script_line = |
1795 Accessors::ScriptLineOffsetInfo(isolate(), attribs); | 1797 Accessors::ScriptLineOffsetInfo(isolate(), attribs); |
1796 { | 1798 { |
1797 CallbacksDescriptor d(Handle<Name>(Name::cast(script_line->name())), | 1799 AccessorConstantDescriptor d( |
1798 script_line, attribs); | 1800 Handle<Name>(Name::cast(script_line->name())), script_line, attribs); |
1799 script_map->AppendDescriptor(&d); | 1801 script_map->AppendDescriptor(&d); |
1800 } | 1802 } |
1801 | 1803 |
1802 Handle<AccessorInfo> script_source = | 1804 Handle<AccessorInfo> script_source = |
1803 Accessors::ScriptSourceInfo(isolate(), attribs); | 1805 Accessors::ScriptSourceInfo(isolate(), attribs); |
1804 { | 1806 { |
1805 CallbacksDescriptor d(Handle<Name>(Name::cast(script_source->name())), | 1807 AccessorConstantDescriptor d( |
1806 script_source, attribs); | 1808 Handle<Name>(Name::cast(script_source->name())), script_source, |
| 1809 attribs); |
1807 script_map->AppendDescriptor(&d); | 1810 script_map->AppendDescriptor(&d); |
1808 } | 1811 } |
1809 | 1812 |
1810 Handle<AccessorInfo> script_type = | 1813 Handle<AccessorInfo> script_type = |
1811 Accessors::ScriptTypeInfo(isolate(), attribs); | 1814 Accessors::ScriptTypeInfo(isolate(), attribs); |
1812 { | 1815 { |
1813 CallbacksDescriptor d(Handle<Name>(Name::cast(script_type->name())), | 1816 AccessorConstantDescriptor d( |
1814 script_type, attribs); | 1817 Handle<Name>(Name::cast(script_type->name())), script_type, attribs); |
1815 script_map->AppendDescriptor(&d); | 1818 script_map->AppendDescriptor(&d); |
1816 } | 1819 } |
1817 | 1820 |
1818 Handle<AccessorInfo> script_compilation_type = | 1821 Handle<AccessorInfo> script_compilation_type = |
1819 Accessors::ScriptCompilationTypeInfo(isolate(), attribs); | 1822 Accessors::ScriptCompilationTypeInfo(isolate(), attribs); |
1820 { | 1823 { |
1821 CallbacksDescriptor d( | 1824 AccessorConstantDescriptor d( |
1822 Handle<Name>(Name::cast(script_compilation_type->name())), | 1825 Handle<Name>(Name::cast(script_compilation_type->name())), |
1823 script_compilation_type, attribs); | 1826 script_compilation_type, attribs); |
1824 script_map->AppendDescriptor(&d); | 1827 script_map->AppendDescriptor(&d); |
1825 } | 1828 } |
1826 | 1829 |
1827 Handle<AccessorInfo> script_line_ends = | 1830 Handle<AccessorInfo> script_line_ends = |
1828 Accessors::ScriptLineEndsInfo(isolate(), attribs); | 1831 Accessors::ScriptLineEndsInfo(isolate(), attribs); |
1829 { | 1832 { |
1830 CallbacksDescriptor d(Handle<Name>(Name::cast(script_line_ends->name())), | 1833 AccessorConstantDescriptor d( |
1831 script_line_ends, attribs); | 1834 Handle<Name>(Name::cast(script_line_ends->name())), script_line_ends, |
| 1835 attribs); |
1832 script_map->AppendDescriptor(&d); | 1836 script_map->AppendDescriptor(&d); |
1833 } | 1837 } |
1834 | 1838 |
1835 Handle<AccessorInfo> script_context_data = | 1839 Handle<AccessorInfo> script_context_data = |
1836 Accessors::ScriptContextDataInfo(isolate(), attribs); | 1840 Accessors::ScriptContextDataInfo(isolate(), attribs); |
1837 { | 1841 { |
1838 CallbacksDescriptor d( | 1842 AccessorConstantDescriptor d( |
1839 Handle<Name>(Name::cast(script_context_data->name())), | 1843 Handle<Name>(Name::cast(script_context_data->name())), |
1840 script_context_data, attribs); | 1844 script_context_data, attribs); |
1841 script_map->AppendDescriptor(&d); | 1845 script_map->AppendDescriptor(&d); |
1842 } | 1846 } |
1843 | 1847 |
1844 Handle<AccessorInfo> script_eval_from_script = | 1848 Handle<AccessorInfo> script_eval_from_script = |
1845 Accessors::ScriptEvalFromScriptInfo(isolate(), attribs); | 1849 Accessors::ScriptEvalFromScriptInfo(isolate(), attribs); |
1846 { | 1850 { |
1847 CallbacksDescriptor d( | 1851 AccessorConstantDescriptor d( |
1848 Handle<Name>(Name::cast(script_eval_from_script->name())), | 1852 Handle<Name>(Name::cast(script_eval_from_script->name())), |
1849 script_eval_from_script, attribs); | 1853 script_eval_from_script, attribs); |
1850 script_map->AppendDescriptor(&d); | 1854 script_map->AppendDescriptor(&d); |
1851 } | 1855 } |
1852 | 1856 |
1853 Handle<AccessorInfo> script_eval_from_script_position = | 1857 Handle<AccessorInfo> script_eval_from_script_position = |
1854 Accessors::ScriptEvalFromScriptPositionInfo(isolate(), attribs); | 1858 Accessors::ScriptEvalFromScriptPositionInfo(isolate(), attribs); |
1855 { | 1859 { |
1856 CallbacksDescriptor d( | 1860 AccessorConstantDescriptor d( |
1857 Handle<Name>(Name::cast(script_eval_from_script_position->name())), | 1861 Handle<Name>(Name::cast(script_eval_from_script_position->name())), |
1858 script_eval_from_script_position, attribs); | 1862 script_eval_from_script_position, attribs); |
1859 script_map->AppendDescriptor(&d); | 1863 script_map->AppendDescriptor(&d); |
1860 } | 1864 } |
1861 | 1865 |
1862 Handle<AccessorInfo> script_eval_from_function_name = | 1866 Handle<AccessorInfo> script_eval_from_function_name = |
1863 Accessors::ScriptEvalFromFunctionNameInfo(isolate(), attribs); | 1867 Accessors::ScriptEvalFromFunctionNameInfo(isolate(), attribs); |
1864 { | 1868 { |
1865 CallbacksDescriptor d( | 1869 AccessorConstantDescriptor d( |
1866 Handle<Name>(Name::cast(script_eval_from_function_name->name())), | 1870 Handle<Name>(Name::cast(script_eval_from_function_name->name())), |
1867 script_eval_from_function_name, attribs); | 1871 script_eval_from_function_name, attribs); |
1868 script_map->AppendDescriptor(&d); | 1872 script_map->AppendDescriptor(&d); |
1869 } | 1873 } |
1870 | 1874 |
1871 Handle<AccessorInfo> script_source_url = | 1875 Handle<AccessorInfo> script_source_url = |
1872 Accessors::ScriptSourceUrlInfo(isolate(), attribs); | 1876 Accessors::ScriptSourceUrlInfo(isolate(), attribs); |
1873 { | 1877 { |
1874 CallbacksDescriptor d(Handle<Name>(Name::cast(script_source_url->name())), | 1878 AccessorConstantDescriptor d( |
1875 script_source_url, attribs); | 1879 Handle<Name>(Name::cast(script_source_url->name())), |
| 1880 script_source_url, attribs); |
1876 script_map->AppendDescriptor(&d); | 1881 script_map->AppendDescriptor(&d); |
1877 } | 1882 } |
1878 | 1883 |
1879 Handle<AccessorInfo> script_source_mapping_url = | 1884 Handle<AccessorInfo> script_source_mapping_url = |
1880 Accessors::ScriptSourceMappingUrlInfo(isolate(), attribs); | 1885 Accessors::ScriptSourceMappingUrlInfo(isolate(), attribs); |
1881 { | 1886 { |
1882 CallbacksDescriptor d( | 1887 AccessorConstantDescriptor d( |
1883 Handle<Name>(Name::cast(script_source_mapping_url->name())), | 1888 Handle<Name>(Name::cast(script_source_mapping_url->name())), |
1884 script_source_mapping_url, attribs); | 1889 script_source_mapping_url, attribs); |
1885 script_map->AppendDescriptor(&d); | 1890 script_map->AppendDescriptor(&d); |
1886 } | 1891 } |
1887 | 1892 |
1888 // Allocate the empty script. | 1893 // Allocate the empty script. |
1889 Handle<Script> script = factory()->NewScript(factory()->empty_string()); | 1894 Handle<Script> script = factory()->NewScript(factory()->empty_string()); |
1890 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 1895 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
1891 heap()->public_set_empty_script(*script); | 1896 heap()->public_set_empty_script(*script); |
1892 } | 1897 } |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2097 Map::EnsureDescriptorSlack(initial_map, 3); | 2102 Map::EnsureDescriptorSlack(initial_map, 3); |
2098 | 2103 |
2099 { | 2104 { |
2100 JSFunction* array_function = native_context()->array_function(); | 2105 JSFunction* array_function = native_context()->array_function(); |
2101 Handle<DescriptorArray> array_descriptors( | 2106 Handle<DescriptorArray> array_descriptors( |
2102 array_function->initial_map()->instance_descriptors()); | 2107 array_function->initial_map()->instance_descriptors()); |
2103 Handle<String> length = factory()->length_string(); | 2108 Handle<String> length = factory()->length_string(); |
2104 int old = array_descriptors->SearchWithCache( | 2109 int old = array_descriptors->SearchWithCache( |
2105 *length, array_function->initial_map()); | 2110 *length, array_function->initial_map()); |
2106 DCHECK(old != DescriptorArray::kNotFound); | 2111 DCHECK(old != DescriptorArray::kNotFound); |
2107 CallbacksDescriptor desc(length, | 2112 AccessorConstantDescriptor desc( |
2108 handle(array_descriptors->GetValue(old), | 2113 length, handle(array_descriptors->GetValue(old), isolate()), |
2109 isolate()), | 2114 array_descriptors->GetDetails(old).attributes()); |
2110 array_descriptors->GetDetails(old).attributes()); | |
2111 initial_map->AppendDescriptor(&desc); | 2115 initial_map->AppendDescriptor(&desc); |
2112 } | 2116 } |
2113 { | 2117 { |
2114 FieldDescriptor index_field(factory()->index_string(), | 2118 DataDescriptor index_field(factory()->index_string(), |
2115 JSRegExpResult::kIndexIndex, | 2119 JSRegExpResult::kIndexIndex, NONE, |
2116 NONE, | 2120 Representation::Tagged()); |
2117 Representation::Tagged()); | |
2118 initial_map->AppendDescriptor(&index_field); | 2121 initial_map->AppendDescriptor(&index_field); |
2119 } | 2122 } |
2120 | 2123 |
2121 { | 2124 { |
2122 FieldDescriptor input_field(factory()->input_string(), | 2125 DataDescriptor input_field(factory()->input_string(), |
2123 JSRegExpResult::kInputIndex, | 2126 JSRegExpResult::kInputIndex, NONE, |
2124 NONE, | 2127 Representation::Tagged()); |
2125 Representation::Tagged()); | |
2126 initial_map->AppendDescriptor(&input_field); | 2128 initial_map->AppendDescriptor(&input_field); |
2127 } | 2129 } |
2128 | 2130 |
2129 initial_map->set_inobject_properties(2); | 2131 initial_map->set_inobject_properties(2); |
2130 initial_map->set_pre_allocated_property_fields(2); | 2132 initial_map->set_pre_allocated_property_fields(2); |
2131 initial_map->set_unused_property_fields(0); | 2133 initial_map->set_unused_property_fields(0); |
2132 | 2134 |
2133 native_context()->set_regexp_result_map(*initial_map); | 2135 native_context()->set_regexp_result_map(*initial_map); |
2134 } | 2136 } |
2135 | 2137 |
2136 // Add @@iterator method to the arguments object maps. | 2138 // Add @@iterator method to the arguments object maps. |
2137 { | 2139 { |
2138 PropertyAttributes attribs = DONT_ENUM; | 2140 PropertyAttributes attribs = DONT_ENUM; |
2139 Handle<AccessorInfo> arguments_iterator = | 2141 Handle<AccessorInfo> arguments_iterator = |
2140 Accessors::ArgumentsIteratorInfo(isolate(), attribs); | 2142 Accessors::ArgumentsIteratorInfo(isolate(), attribs); |
2141 { | 2143 { |
2142 CallbacksDescriptor d(factory()->iterator_symbol(), arguments_iterator, | 2144 AccessorConstantDescriptor d(factory()->iterator_symbol(), |
2143 attribs); | 2145 arguments_iterator, attribs); |
2144 Handle<Map> map(native_context()->sloppy_arguments_map()); | 2146 Handle<Map> map(native_context()->sloppy_arguments_map()); |
2145 Map::EnsureDescriptorSlack(map, 1); | 2147 Map::EnsureDescriptorSlack(map, 1); |
2146 map->AppendDescriptor(&d); | 2148 map->AppendDescriptor(&d); |
2147 } | 2149 } |
2148 { | 2150 { |
2149 CallbacksDescriptor d(factory()->iterator_symbol(), arguments_iterator, | 2151 AccessorConstantDescriptor d(factory()->iterator_symbol(), |
2150 attribs); | 2152 arguments_iterator, attribs); |
2151 Handle<Map> map(native_context()->aliased_arguments_map()); | 2153 Handle<Map> map(native_context()->aliased_arguments_map()); |
2152 Map::EnsureDescriptorSlack(map, 1); | 2154 Map::EnsureDescriptorSlack(map, 1); |
2153 map->AppendDescriptor(&d); | 2155 map->AppendDescriptor(&d); |
2154 } | 2156 } |
2155 { | 2157 { |
2156 CallbacksDescriptor d(factory()->iterator_symbol(), arguments_iterator, | 2158 AccessorConstantDescriptor d(factory()->iterator_symbol(), |
2157 attribs); | 2159 arguments_iterator, attribs); |
2158 Handle<Map> map(native_context()->strict_arguments_map()); | 2160 Handle<Map> map(native_context()->strict_arguments_map()); |
2159 Map::EnsureDescriptorSlack(map, 1); | 2161 Map::EnsureDescriptorSlack(map, 1); |
2160 map->AppendDescriptor(&d); | 2162 map->AppendDescriptor(&d); |
2161 } | 2163 } |
2162 } | 2164 } |
2163 | 2165 |
2164 #ifdef VERIFY_HEAP | 2166 #ifdef VERIFY_HEAP |
2165 builtins->ObjectVerify(); | 2167 builtins->ObjectVerify(); |
2166 #endif | 2168 #endif |
2167 | 2169 |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2574 // it is likely due to both global objects sharing property name(s). | 2576 // it is likely due to both global objects sharing property name(s). |
2575 // Merging those two global objects is impossible. | 2577 // Merging those two global objects is impossible. |
2576 // The global template must not create properties that already exist | 2578 // The global template must not create properties that already exist |
2577 // in the snapshotted global object. | 2579 // in the snapshotted global object. |
2578 if (from->HasFastProperties()) { | 2580 if (from->HasFastProperties()) { |
2579 Handle<DescriptorArray> descs = | 2581 Handle<DescriptorArray> descs = |
2580 Handle<DescriptorArray>(from->map()->instance_descriptors()); | 2582 Handle<DescriptorArray>(from->map()->instance_descriptors()); |
2581 for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) { | 2583 for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) { |
2582 PropertyDetails details = descs->GetDetails(i); | 2584 PropertyDetails details = descs->GetDetails(i); |
2583 switch (details.type()) { | 2585 switch (details.type()) { |
2584 case FIELD: { | 2586 case DATA: { |
2585 HandleScope inner(isolate()); | 2587 HandleScope inner(isolate()); |
2586 Handle<Name> key = Handle<Name>(descs->GetKey(i)); | 2588 Handle<Name> key = Handle<Name>(descs->GetKey(i)); |
2587 FieldIndex index = FieldIndex::ForDescriptor(from->map(), i); | 2589 FieldIndex index = FieldIndex::ForDescriptor(from->map(), i); |
2588 DCHECK(!descs->GetDetails(i).representation().IsDouble()); | 2590 DCHECK(!descs->GetDetails(i).representation().IsDouble()); |
2589 Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index), | 2591 Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index), |
2590 isolate()); | 2592 isolate()); |
2591 JSObject::AddProperty(to, key, value, details.attributes()); | 2593 JSObject::AddProperty(to, key, value, details.attributes()); |
2592 break; | 2594 break; |
2593 } | 2595 } |
2594 case CONSTANT: { | 2596 case DATA_CONSTANT: { |
2595 HandleScope inner(isolate()); | 2597 HandleScope inner(isolate()); |
2596 Handle<Name> key = Handle<Name>(descs->GetKey(i)); | 2598 Handle<Name> key = Handle<Name>(descs->GetKey(i)); |
2597 Handle<Object> constant(descs->GetConstant(i), isolate()); | 2599 Handle<Object> constant(descs->GetConstant(i), isolate()); |
2598 JSObject::AddProperty(to, key, constant, details.attributes()); | 2600 JSObject::AddProperty(to, key, constant, details.attributes()); |
2599 break; | 2601 break; |
2600 } | 2602 } |
2601 case ACCESSOR_FIELD: | 2603 case ACCESSOR: |
2602 UNREACHABLE(); | 2604 UNREACHABLE(); |
2603 case CALLBACKS: { | 2605 case ACCESSOR_CONSTANT: { |
2604 Handle<Name> key(descs->GetKey(i)); | 2606 Handle<Name> key(descs->GetKey(i)); |
2605 LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR); | 2607 LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR); |
2606 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); | 2608 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
2607 // If the property is already there we skip it | 2609 // If the property is already there we skip it |
2608 if (it.IsFound()) continue; | 2610 if (it.IsFound()) continue; |
2609 HandleScope inner(isolate()); | 2611 HandleScope inner(isolate()); |
2610 DCHECK(!to->HasFastProperties()); | 2612 DCHECK(!to->HasFastProperties()); |
2611 // Add to dictionary. | 2613 // Add to dictionary. |
2612 Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate()); | 2614 Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate()); |
2613 PropertyDetails d(details.attributes(), CALLBACKS, i + 1); | 2615 PropertyDetails d(details.attributes(), ACCESSOR_CONSTANT, i + 1); |
2614 JSObject::SetNormalizedProperty(to, key, callbacks, d); | 2616 JSObject::SetNormalizedProperty(to, key, callbacks, d); |
2615 break; | 2617 break; |
2616 } | 2618 } |
2617 } | 2619 } |
2618 } | 2620 } |
2619 } else { | 2621 } else { |
2620 Handle<NameDictionary> properties = | 2622 Handle<NameDictionary> properties = |
2621 Handle<NameDictionary>(from->property_dictionary()); | 2623 Handle<NameDictionary>(from->property_dictionary()); |
2622 int capacity = properties->Capacity(); | 2624 int capacity = properties->Capacity(); |
2623 for (int i = 0; i < capacity; i++) { | 2625 for (int i = 0; i < capacity; i++) { |
2624 Object* raw_key(properties->KeyAt(i)); | 2626 Object* raw_key(properties->KeyAt(i)); |
2625 if (properties->IsKey(raw_key)) { | 2627 if (properties->IsKey(raw_key)) { |
2626 DCHECK(raw_key->IsName()); | 2628 DCHECK(raw_key->IsName()); |
2627 // If the property is already there we skip it. | 2629 // If the property is already there we skip it. |
2628 Handle<Name> key(Name::cast(raw_key)); | 2630 Handle<Name> key(Name::cast(raw_key)); |
2629 LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR); | 2631 LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR); |
2630 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); | 2632 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
2631 if (it.IsFound()) continue; | 2633 if (it.IsFound()) continue; |
2632 // Set the property. | 2634 // Set the property. |
2633 Handle<Object> value = Handle<Object>(properties->ValueAt(i), | 2635 Handle<Object> value = Handle<Object>(properties->ValueAt(i), |
2634 isolate()); | 2636 isolate()); |
2635 DCHECK(!value->IsCell()); | 2637 DCHECK(!value->IsCell()); |
2636 if (value->IsPropertyCell()) { | 2638 if (value->IsPropertyCell()) { |
2637 value = Handle<Object>(PropertyCell::cast(*value)->value(), | 2639 value = Handle<Object>(PropertyCell::cast(*value)->value(), |
2638 isolate()); | 2640 isolate()); |
2639 } | 2641 } |
2640 PropertyDetails details = properties->DetailsAt(i); | 2642 PropertyDetails details = properties->DetailsAt(i); |
2641 DCHECK_EQ(DATA, details.kind()); | 2643 DCHECK_EQ(kData, details.kind()); |
2642 JSObject::AddProperty(to, key, value, details.attributes()); | 2644 JSObject::AddProperty(to, key, value, details.attributes()); |
2643 } | 2645 } |
2644 } | 2646 } |
2645 } | 2647 } |
2646 } | 2648 } |
2647 | 2649 |
2648 | 2650 |
2649 void Genesis::TransferIndexedProperties(Handle<JSObject> from, | 2651 void Genesis::TransferIndexedProperties(Handle<JSObject> from, |
2650 Handle<JSObject> to) { | 2652 Handle<JSObject> to) { |
2651 // Cloning the elements array is sufficient. | 2653 // Cloning the elements array is sufficient. |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2855 return from + sizeof(NestingCounterType); | 2857 return from + sizeof(NestingCounterType); |
2856 } | 2858 } |
2857 | 2859 |
2858 | 2860 |
2859 // Called when the top-level V8 mutex is destroyed. | 2861 // Called when the top-level V8 mutex is destroyed. |
2860 void Bootstrapper::FreeThreadResources() { | 2862 void Bootstrapper::FreeThreadResources() { |
2861 DCHECK(!IsActive()); | 2863 DCHECK(!IsActive()); |
2862 } | 2864 } |
2863 | 2865 |
2864 } } // namespace v8::internal | 2866 } } // namespace v8::internal |
OLD | NEW |