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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/debug.h" | 9 #include "src/debug.h" |
10 #include "src/runtime/runtime.h" | 10 #include "src/runtime/runtime.h" |
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 // Get the property names. | 1003 // Get the property names. |
1004 int next_copy_index = 0; | 1004 int next_copy_index = 0; |
1005 int hidden_strings = 0; | 1005 int hidden_strings = 0; |
1006 { | 1006 { |
1007 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); | 1007 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); |
1008 for (int i = 0; i < length; i++) { | 1008 for (int i = 0; i < length; i++) { |
1009 DCHECK(!iter.IsAtEnd()); | 1009 DCHECK(!iter.IsAtEnd()); |
1010 Handle<JSObject> jsproto = | 1010 Handle<JSObject> jsproto = |
1011 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); | 1011 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); |
1012 jsproto->GetOwnPropertyNames(*names, next_copy_index, filter); | 1012 jsproto->GetOwnPropertyNames(*names, next_copy_index, filter); |
1013 if (i > 0) { | 1013 // Names from hidden prototypes may already have been added |
1014 // Names from hidden prototypes may already have been added | 1014 // for inherited function template instances. Count the duplicates |
1015 // for inherited function template instances. Count the duplicates | 1015 // and stub them out; the final copy pass at the end ignores holes. |
1016 // and stub them out; the final copy pass at the end ignores holes. | 1016 for (int j = next_copy_index; j < next_copy_index + own_property_count[i]; |
1017 for (int j = next_copy_index; | 1017 j++) { |
1018 j < next_copy_index + own_property_count[i]; j++) { | 1018 Object* name_from_hidden_proto = names->get(j); |
1019 Object* name_from_hidden_proto = names->get(j); | 1019 if (isolate->IsInternallyUsedPropertyName(name_from_hidden_proto)) { |
| 1020 hidden_strings++; |
| 1021 } else { |
1020 for (int k = 0; k < next_copy_index; k++) { | 1022 for (int k = 0; k < next_copy_index; k++) { |
1021 if (names->get(k) != isolate->heap()->hidden_string()) { | 1023 Object* name = names->get(k); |
1022 Object* name = names->get(k); | 1024 if (name_from_hidden_proto == name) { |
1023 if (name_from_hidden_proto == name) { | 1025 names->set(j, isolate->heap()->hidden_string()); |
1024 names->set(j, isolate->heap()->hidden_string()); | 1026 hidden_strings++; |
1025 hidden_strings++; | 1027 break; |
1026 break; | |
1027 } | |
1028 } | 1028 } |
1029 } | 1029 } |
1030 } | 1030 } |
1031 } | 1031 } |
1032 next_copy_index += own_property_count[i]; | 1032 next_copy_index += own_property_count[i]; |
1033 | 1033 |
1034 // Hidden properties only show up if the filter does not skip strings. | |
1035 if ((filter & STRING) == 0 && JSObject::HasHiddenProperties(jsproto)) { | |
1036 hidden_strings++; | |
1037 } | |
1038 iter.Advance(); | 1034 iter.Advance(); |
1039 } | 1035 } |
1040 } | 1036 } |
1041 | 1037 |
1042 // Filter out name of hidden properties object and | 1038 // Filter out name of hidden properties object and |
1043 // hidden prototype duplicates. | 1039 // hidden prototype duplicates. |
1044 if (hidden_strings > 0) { | 1040 if (hidden_strings > 0) { |
1045 Handle<FixedArray> old_names = names; | 1041 Handle<FixedArray> old_names = names; |
1046 names = isolate->factory()->NewFixedArray(names->length() - hidden_strings); | 1042 names = isolate->factory()->NewFixedArray(names->length() - hidden_strings); |
1047 int dest_pos = 0; | 1043 int dest_pos = 0; |
1048 for (int i = 0; i < total_property_count; i++) { | 1044 for (int i = 0; i < total_property_count; i++) { |
1049 Object* name = old_names->get(i); | 1045 Object* name = old_names->get(i); |
1050 if (name == isolate->heap()->hidden_string()) { | 1046 if (isolate->IsInternallyUsedPropertyName(name)) { |
1051 hidden_strings--; | 1047 hidden_strings--; |
1052 continue; | 1048 continue; |
1053 } | 1049 } |
1054 names->set(dest_pos++, name); | 1050 names->set(dest_pos++, name); |
1055 } | 1051 } |
1056 DCHECK_EQ(0, hidden_strings); | 1052 DCHECK_EQ(0, hidden_strings); |
1057 } | 1053 } |
1058 | 1054 |
1059 return *isolate->factory()->NewJSArrayWithElements(names); | 1055 return *isolate->factory()->NewJSArrayWithElements(names); |
1060 } | 1056 } |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1635 CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); | 1631 CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); |
1636 | 1632 |
1637 RETURN_FAILURE_ON_EXCEPTION( | 1633 RETURN_FAILURE_ON_EXCEPTION( |
1638 isolate, | 1634 isolate, |
1639 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), | 1635 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), |
1640 setter, NONE)); | 1636 setter, NONE)); |
1641 return isolate->heap()->undefined_value(); | 1637 return isolate->heap()->undefined_value(); |
1642 } | 1638 } |
1643 } | 1639 } |
1644 } // namespace v8::internal | 1640 } // namespace v8::internal |
OLD | NEW |