| OLD | NEW |
| 1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 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/builtins/builtins-utils-gen.h" | 5 #include "src/builtins/builtins-utils-gen.h" |
| 6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
| 7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 Branch(TaggedIsSmi(object), &return_false, &if_objectisnotsmi); | 61 Branch(TaggedIsSmi(object), &return_false, &if_objectisnotsmi); |
| 62 BIND(&if_objectisnotsmi); | 62 BIND(&if_objectisnotsmi); |
| 63 | 63 |
| 64 Node* map = LoadMap(object); | 64 Node* map = LoadMap(object); |
| 65 Node* instance_type = LoadMapInstanceType(map); | 65 Node* instance_type = LoadMapInstanceType(map); |
| 66 | 66 |
| 67 { | 67 { |
| 68 VARIABLE(var_index, MachineType::PointerRepresentation()); | 68 VARIABLE(var_index, MachineType::PointerRepresentation()); |
| 69 VARIABLE(var_unique, MachineRepresentation::kTagged); | 69 VARIABLE(var_unique, MachineRepresentation::kTagged); |
| 70 | 70 |
| 71 Label keyisindex(this), if_iskeyunique(this); | 71 Label if_index(this), if_unique_name(this), if_notunique_name(this); |
| 72 TryToName(key, &keyisindex, &var_index, &if_iskeyunique, &var_unique, | 72 TryToName(key, &if_index, &var_index, &if_unique_name, &var_unique, |
| 73 &call_runtime); | 73 &call_runtime, &if_notunique_name); |
| 74 | 74 |
| 75 BIND(&if_iskeyunique); | 75 BIND(&if_unique_name); |
| 76 TryHasOwnProperty(object, map, instance_type, var_unique.value(), | 76 TryHasOwnProperty(object, map, instance_type, var_unique.value(), |
| 77 &return_true, &return_false, &call_runtime); | 77 &return_true, &return_false, &call_runtime); |
| 78 | 78 |
| 79 BIND(&keyisindex); | 79 BIND(&if_index); |
| 80 // Handle negative keys in the runtime. | 80 { |
| 81 GotoIf(IntPtrLessThan(var_index.value(), IntPtrConstant(0)), &call_runtime); | 81 // Handle negative keys in the runtime. |
| 82 TryLookupElement(object, map, instance_type, var_index.value(), | 82 GotoIf(IntPtrLessThan(var_index.value(), IntPtrConstant(0)), |
| 83 &return_true, &return_false, &return_false, &call_runtime); | 83 &call_runtime); |
| 84 TryLookupElement(object, map, instance_type, var_index.value(), |
| 85 &return_true, &return_false, &return_false, |
| 86 &call_runtime); |
| 87 } |
| 88 |
| 89 BIND(&if_notunique_name); |
| 90 { |
| 91 Node* function = ExternalConstant( |
| 92 ExternalReference::try_internalize_string_function(isolate())); |
| 93 Node* result = CallCFunction1(MachineType::AnyTagged(), |
| 94 MachineType::AnyTagged(), function, key); |
| 95 // If internalization failed, then the string did not exist in the string |
| 96 // table yet, which implies that no existing object has a property with |
| 97 // that name. |
| 98 Label internalized(this); |
| 99 GotoIf(TaggedIsNotSmi(result), &internalized); |
| 100 Node* int_result = SmiUntag(result); |
| 101 GotoIf(WordEqual(int_result, IntPtrConstant(ResultSentinel::kNotFound)), |
| 102 &return_false); |
| 103 GotoIf( |
| 104 WordEqual(int_result, IntPtrConstant(ResultSentinel::kUnsupported)), |
| 105 &call_runtime); |
| 106 var_index.Bind(int_result); |
| 107 Goto(&if_index); |
| 108 |
| 109 BIND(&internalized); |
| 110 var_unique.Bind(result); |
| 111 Goto(&if_unique_name); |
| 112 } |
| 84 } | 113 } |
| 85 BIND(&return_true); | 114 BIND(&return_true); |
| 86 Return(BooleanConstant(true)); | 115 Return(BooleanConstant(true)); |
| 87 | 116 |
| 88 BIND(&return_false); | 117 BIND(&return_false); |
| 89 Return(BooleanConstant(false)); | 118 Return(BooleanConstant(false)); |
| 90 | 119 |
| 91 BIND(&call_runtime); | 120 BIND(&call_runtime); |
| 92 Return(CallRuntime(Runtime::kObjectHasOwnProperty, context, object, key)); | 121 Return(CallRuntime(Runtime::kObjectHasOwnProperty, context, object, key)); |
| 93 } | 122 } |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 | 424 |
| 396 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) { | 425 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) { |
| 397 Node* object = Parameter(Descriptor::kObject); | 426 Node* object = Parameter(Descriptor::kObject); |
| 398 Node* context = Parameter(Descriptor::kContext); | 427 Node* context = Parameter(Descriptor::kContext); |
| 399 | 428 |
| 400 Return(GetSuperConstructor(object, context)); | 429 Return(GetSuperConstructor(object, context)); |
| 401 } | 430 } |
| 402 | 431 |
| 403 } // namespace internal | 432 } // namespace internal |
| 404 } // namespace v8 | 433 } // namespace v8 |
| OLD | NEW |