Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index 53523bb70be910619baffdfeb3f9af84bc21e120..c60cc344166060cbc745f70b4cfbd07b4c403306 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -4300,102 +4300,27 @@ compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, |
Label call_runtime(assembler, Label::kDeferred), return_true(assembler), |
return_false(assembler), end(assembler); |
- // Ensure object is JSReceiver, otherwise call runtime to throw error. |
- Label if_objectisnotsmi(assembler); |
- assembler->Branch(assembler->WordIsSmi(object), &call_runtime, |
- &if_objectisnotsmi); |
- assembler->Bind(&if_objectisnotsmi); |
- |
- Node* map = assembler->LoadMap(object); |
- Node* instance_type = assembler->LoadMapInstanceType(map); |
- { |
- Label if_objectisreceiver(assembler); |
- STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
- assembler->Branch( |
- assembler->Int32GreaterThanOrEqual( |
- instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), |
- &if_objectisreceiver, &call_runtime); |
- assembler->Bind(&if_objectisreceiver); |
- } |
- |
- Variable var_index(assembler, MachineRepresentation::kWord32); |
- |
- Label keyisindex(assembler), if_iskeyunique(assembler); |
- assembler->TryToName(key, &keyisindex, &var_index, &if_iskeyunique, |
- &call_runtime); |
- |
- assembler->Bind(&if_iskeyunique); |
- { |
- Variable var_object(assembler, MachineRepresentation::kTagged); |
- Variable var_map(assembler, MachineRepresentation::kTagged); |
- Variable var_instance_type(assembler, MachineRepresentation::kWord8); |
- |
- Variable* merged_variables[] = {&var_object, &var_map, &var_instance_type}; |
- Label loop(assembler, arraysize(merged_variables), merged_variables); |
- var_object.Bind(object); |
- var_map.Bind(map); |
- var_instance_type.Bind(instance_type); |
- assembler->Goto(&loop); |
- assembler->Bind(&loop); |
- { |
- Label next_proto(assembler); |
- assembler->TryHasOwnProperty(var_object.value(), var_map.value(), |
- var_instance_type.value(), key, &return_true, |
- &next_proto, &call_runtime); |
- assembler->Bind(&next_proto); |
- |
- Node* proto = assembler->LoadMapPrototype(var_map.value()); |
- |
- Label if_not_null(assembler); |
- assembler->Branch(assembler->WordEqual(proto, assembler->NullConstant()), |
- &return_false, &if_not_null); |
- assembler->Bind(&if_not_null); |
- |
- Node* map = assembler->LoadMap(proto); |
- Node* instance_type = assembler->LoadMapInstanceType(map); |
- |
- var_object.Bind(proto); |
- var_map.Bind(map); |
- var_instance_type.Bind(instance_type); |
- assembler->Goto(&loop); |
- } |
- } |
- assembler->Bind(&keyisindex); |
- { |
- Variable var_object(assembler, MachineRepresentation::kTagged); |
- Variable var_map(assembler, MachineRepresentation::kTagged); |
- Variable var_instance_type(assembler, MachineRepresentation::kWord8); |
- |
- Variable* merged_variables[] = {&var_object, &var_map, &var_instance_type}; |
- Label loop(assembler, arraysize(merged_variables), merged_variables); |
- var_object.Bind(object); |
- var_map.Bind(map); |
- var_instance_type.Bind(instance_type); |
- assembler->Goto(&loop); |
- assembler->Bind(&loop); |
- { |
- Label next_proto(assembler); |
- assembler->TryLookupElement(var_object.value(), var_map.value(), |
- var_instance_type.value(), var_index.value(), |
- &return_true, &next_proto, &call_runtime); |
- assembler->Bind(&next_proto); |
- |
- Node* proto = assembler->LoadMapPrototype(var_map.value()); |
- |
- Label if_not_null(assembler); |
- assembler->Branch(assembler->WordEqual(proto, assembler->NullConstant()), |
- &return_false, &if_not_null); |
- assembler->Bind(&if_not_null); |
- |
- Node* map = assembler->LoadMap(proto); |
- Node* instance_type = assembler->LoadMapInstanceType(map); |
- |
- var_object.Bind(proto); |
- var_map.Bind(map); |
- var_instance_type.Bind(instance_type); |
- assembler->Goto(&loop); |
- } |
- } |
+ CodeStubAssembler::LookupInHolder lookup_property_in_holder = |
+ [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map, |
+ Node* holder_instance_type, Node* unique_name, |
+ Label* next_holder, Label* if_bailout) { |
+ assembler->TryHasOwnProperty(holder, holder_map, holder_instance_type, |
+ unique_name, &return_true, next_holder, |
+ if_bailout); |
+ }; |
+ |
+ CodeStubAssembler::LookupInHolder lookup_element_in_holder = |
+ [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map, |
+ Node* holder_instance_type, Node* index, |
+ Label* next_holder, Label* if_bailout) { |
+ assembler->TryLookupElement(holder, holder_map, holder_instance_type, |
+ index, &return_true, next_holder, |
+ if_bailout); |
+ }; |
+ |
+ assembler->TryPrototypeChainLookup(object, key, lookup_property_in_holder, |
+ lookup_element_in_holder, &return_false, |
+ &call_runtime); |
Variable result(assembler, MachineRepresentation::kTagged); |
assembler->Bind(&return_true); |
@@ -4421,6 +4346,67 @@ compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, |
return result.value(); |
} |
+void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
+ typedef compiler::Node Node; |
+ typedef CodeStubAssembler::Label Label; |
+ typedef CodeStubAssembler::Variable Variable; |
+ |
+ Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), |
+ end(assembler); |
+ |
+ Node* object = assembler->Parameter(0); |
+ Node* key = assembler->Parameter(1); |
+ Node* context = assembler->Parameter(2); |
+ Variable var_result(assembler, MachineRepresentation::kTagged); |
+ |
+ CodeStubAssembler::LookupInHolder lookup_property_in_holder = |
+ [assembler, context, &var_result, &end]( |
+ Node* receiver, Node* holder, Node* holder_map, |
+ Node* holder_instance_type, Node* unique_name, Label* next_holder, |
+ Label* if_bailout) { |
+ Variable var_value(assembler, MachineRepresentation::kTagged); |
+ Label if_found(assembler); |
+ assembler->TryGetOwnProperty( |
+ context, receiver, holder, holder_map, holder_instance_type, |
+ unique_name, &if_found, &var_value, next_holder, if_bailout); |
+ assembler->Bind(&if_found); |
+ { |
+ var_result.Bind(var_value.value()); |
+ assembler->Goto(&end); |
+ } |
+ }; |
+ |
+ CodeStubAssembler::LookupInHolder lookup_element_in_holder = |
+ [assembler, context, &var_result, &end]( |
+ Node* receiver, Node* holder, Node* holder_map, |
+ Node* holder_instance_type, Node* index, Label* next_holder, |
+ Label* if_bailout) { |
+ // Not supported yet. |
+ assembler->Use(next_holder); |
+ assembler->Goto(if_bailout); |
+ }; |
+ |
+ assembler->TryPrototypeChainLookup(object, key, lookup_property_in_holder, |
+ lookup_element_in_holder, |
+ &return_undefined, &call_runtime); |
+ |
+ assembler->Bind(&return_undefined); |
+ { |
+ var_result.Bind(assembler->UndefinedConstant()); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&call_runtime); |
+ { |
+ var_result.Bind( |
+ assembler->CallRuntime(Runtime::kGetProperty, context, object, key)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ assembler->Return(var_result.value()); |
+} |
+ |
// static |
compiler::Node* FastNewClosureStub::Generate(CodeStubAssembler* assembler, |
compiler::Node* shared_info, |