Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index ca4a13d0407309df726047cdebd3f9b19cd13fb7..e6a9d78f05c3476c8a67ca2ad264446754d837d5 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -1827,15 +1827,16 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
return result_var.value(); |
} |
-void InstanceOfStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
+// static |
+compiler::Node* InstanceOfStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* object, |
+ compiler::Node* callable, |
+ compiler::Node* context) { |
typedef CodeStubAssembler::Label Label; |
- typedef compiler::Node Node; |
- |
- Node* object = assembler->Parameter(0); |
- Node* callable = assembler->Parameter(1); |
- Node* context = assembler->Parameter(2); |
+ typedef CodeStubAssembler::Variable Variable; |
- Label return_runtime(assembler, Label::kDeferred); |
+ Label return_runtime(assembler, Label::kDeferred), end(assembler); |
+ Variable result(assembler, MachineRepresentation::kTagged); |
// Check if no one installed @@hasInstance somewhere. |
assembler->GotoUnless( |
@@ -1857,11 +1858,19 @@ void InstanceOfStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
&return_runtime); |
// Use the inline OrdinaryHasInstance directly. |
- assembler->Return(assembler->OrdinaryHasInstance(context, callable, object)); |
+ result.Bind(assembler->OrdinaryHasInstance(context, callable, object)); |
+ assembler->Goto(&end); |
// TODO(bmeurer): Use GetPropertyStub here once available. |
assembler->Bind(&return_runtime); |
- assembler->TailCallRuntime(Runtime::kInstanceOf, context, object, callable); |
+ { |
+ result.Bind(assembler->CallRuntime(Runtime::kInstanceOf, context, object, |
+ callable)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ return result.value(); |
} |
namespace { |
@@ -1873,15 +1882,15 @@ enum RelationalComparisonMode { |
kGreaterThanOrEqual |
}; |
-void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
- RelationalComparisonMode mode) { |
+compiler::Node* GenerateAbstractRelationalComparison( |
+ CodeStubAssembler* assembler, RelationalComparisonMode mode, |
+ compiler::Node* lhs, compiler::Node* rhs, compiler::Node* context) { |
typedef CodeStubAssembler::Label Label; |
typedef compiler::Node Node; |
typedef CodeStubAssembler::Variable Variable; |
- Node* context = assembler->Parameter(2); |
- |
- Label return_true(assembler), return_false(assembler); |
+ Label return_true(assembler), return_false(assembler), end(assembler); |
+ Variable result(assembler, MachineRepresentation::kTagged); |
// Shared entry for floating point comparison. |
Label do_fcmp(assembler); |
@@ -1894,14 +1903,14 @@ void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
var_rhs(assembler, MachineRepresentation::kTagged); |
Variable* loop_vars[2] = {&var_lhs, &var_rhs}; |
Label loop(assembler, 2, loop_vars); |
- var_lhs.Bind(assembler->Parameter(0)); |
- var_rhs.Bind(assembler->Parameter(1)); |
+ var_lhs.Bind(lhs); |
+ var_rhs.Bind(rhs); |
assembler->Goto(&loop); |
assembler->Bind(&loop); |
{ |
// Load the current {lhs} and {rhs} values. |
- Node* lhs = var_lhs.value(); |
- Node* rhs = var_rhs.value(); |
+ lhs = var_lhs.value(); |
+ rhs = var_rhs.value(); |
// Check if the {lhs} is a Smi or a HeapObject. |
Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
@@ -2074,7 +2083,7 @@ void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map); |
// Check if {rhs} is also a String. |
- Label if_rhsisstring(assembler), |
+ Label if_rhsisstring(assembler, Label::kDeferred), |
if_rhsisnotstring(assembler, Label::kDeferred); |
assembler->Branch(assembler->Int32LessThan( |
rhs_instance_type, assembler->Int32Constant( |
@@ -2086,24 +2095,29 @@ void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
// Both {lhs} and {rhs} are strings. |
switch (mode) { |
case kLessThan: |
- assembler->TailCallStub( |
+ result.Bind(assembler->CallStub( |
CodeFactory::StringLessThan(assembler->isolate()), |
- context, lhs, rhs); |
+ context, lhs, rhs)); |
+ assembler->Goto(&end); |
break; |
case kLessThanOrEqual: |
- assembler->TailCallStub( |
+ result.Bind(assembler->CallStub( |
CodeFactory::StringLessThanOrEqual(assembler->isolate()), |
- context, lhs, rhs); |
+ context, lhs, rhs)); |
+ assembler->Goto(&end); |
break; |
case kGreaterThan: |
- assembler->TailCallStub( |
+ result.Bind(assembler->CallStub( |
CodeFactory::StringGreaterThan(assembler->isolate()), |
- context, lhs, rhs); |
+ context, lhs, rhs)); |
+ assembler->Goto(&end); |
break; |
case kGreaterThanOrEqual: |
- assembler->TailCallStub(CodeFactory::StringGreaterThanOrEqual( |
+ result.Bind( |
+ assembler->CallStub(CodeFactory::StringGreaterThanOrEqual( |
assembler->isolate()), |
- context, lhs, rhs); |
+ context, lhs, rhs)); |
+ assembler->Goto(&end); |
break; |
} |
} |
@@ -2208,10 +2222,19 @@ void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
} |
assembler->Bind(&return_true); |
- assembler->Return(assembler->BooleanConstant(true)); |
+ { |
+ result.Bind(assembler->BooleanConstant(true)); |
+ assembler->Goto(&end); |
+ } |
assembler->Bind(&return_false); |
- assembler->Return(assembler->BooleanConstant(false)); |
+ { |
+ result.Bind(assembler->BooleanConstant(false)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ return result.value(); |
} |
enum ResultMode { kDontNegateResult, kNegateResult }; |
@@ -2340,7 +2363,9 @@ void GenerateEqual_Simd128Value_HeapObject( |
} |
// ES6 section 7.2.12 Abstract Equality Comparison |
-void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
+compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, |
+ compiler::Node* lhs, compiler::Node* rhs, |
+ compiler::Node* context) { |
// This is a slightly optimized version of Object::Equals represented as |
// scheduled TurboFan graph utilizing the CodeStubAssembler. Whenever you |
// change something functionality wise in here, remember to update the |
@@ -2349,9 +2374,9 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
typedef compiler::Node Node; |
typedef CodeStubAssembler::Variable Variable; |
- Node* context = assembler->Parameter(2); |
- |
- Label if_equal(assembler), if_notequal(assembler); |
+ Label if_equal(assembler), if_notequal(assembler), |
+ do_rhsstringtonumber(assembler, Label::kDeferred), end(assembler); |
+ Variable result(assembler, MachineRepresentation::kTagged); |
// Shared entry for floating point comparison. |
Label do_fcmp(assembler); |
@@ -2364,14 +2389,14 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
var_rhs(assembler, MachineRepresentation::kTagged); |
Variable* loop_vars[2] = {&var_lhs, &var_rhs}; |
Label loop(assembler, 2, loop_vars); |
- var_lhs.Bind(assembler->Parameter(0)); |
- var_rhs.Bind(assembler->Parameter(1)); |
+ var_lhs.Bind(lhs); |
+ var_rhs.Bind(rhs); |
assembler->Goto(&loop); |
assembler->Bind(&loop); |
{ |
// Load the current {lhs} and {rhs} values. |
- Node* lhs = var_lhs.value(); |
- Node* rhs = var_rhs.value(); |
+ lhs = var_lhs.value(); |
+ rhs = var_rhs.value(); |
// Check if {lhs} and {rhs} refer to the same object. |
Label if_same(assembler), if_notsame(assembler); |
@@ -2399,6 +2424,8 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
&if_rhsisnotsmi); |
assembler->Bind(&if_rhsissmi); |
+ // We have already checked for {lhs} and {rhs} being the same value, so |
+ // if both are Smis when we get here they must not be equal. |
assembler->Goto(&if_notequal); |
assembler->Bind(&if_rhsisnotsmi); |
@@ -2408,8 +2435,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
// Check if {rhs} is a HeapNumber. |
Node* number_map = assembler->HeapNumberMapConstant(); |
- Label if_rhsisnumber(assembler), |
- if_rhsisnotnumber(assembler, Label::kDeferred); |
+ Label if_rhsisnumber(assembler), if_rhsisnotnumber(assembler); |
assembler->Branch(assembler->WordEqual(rhs_map, number_map), |
&if_rhsisnumber, &if_rhsisnotnumber); |
@@ -2429,7 +2455,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
// Check if the {rhs} is a String. |
Label if_rhsisstring(assembler, Label::kDeferred), |
- if_rhsisnotstring(assembler, Label::kDeferred); |
+ if_rhsisnotstring(assembler); |
assembler->Branch(assembler->Int32LessThan( |
rhs_instance_type, assembler->Int32Constant( |
FIRST_NONSTRING_TYPE)), |
@@ -2437,19 +2463,17 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
assembler->Bind(&if_rhsisstring); |
{ |
- // Convert the {rhs} to a Number. |
- Callable callable = |
- CodeFactory::StringToNumber(assembler->isolate()); |
- var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
- assembler->Goto(&loop); |
+ // The {rhs} is a String and the {lhs} is a Smi; we need |
+ // to convert the {rhs} to a Number and compare the output to |
+ // the Number on the {lhs}. |
+ assembler->Goto(&do_rhsstringtonumber); |
} |
assembler->Bind(&if_rhsisnotstring); |
{ |
// Check if the {rhs} is a Boolean. |
Node* boolean_map = assembler->BooleanMapConstant(); |
- Label if_rhsisboolean(assembler, Label::kDeferred), |
- if_rhsisnotboolean(assembler, Label::kDeferred); |
+ Label if_rhsisboolean(assembler), if_rhsisnotboolean(assembler); |
assembler->Branch(assembler->WordEqual(rhs_map, boolean_map), |
&if_rhsisboolean, &if_rhsisnotboolean); |
@@ -2466,7 +2490,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
// Check if the {rhs} is a Receiver. |
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
Label if_rhsisreceiver(assembler, Label::kDeferred), |
- if_rhsisnotreceiver(assembler, Label::kDeferred); |
+ if_rhsisnotreceiver(assembler); |
assembler->Branch( |
assembler->Int32LessThanOrEqual( |
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
@@ -2550,8 +2574,8 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
assembler->Bind(&if_lhsisstring); |
{ |
// Check if {rhs} is also a String. |
- Label if_rhsisstring(assembler), |
- if_rhsisnotstring(assembler, Label::kDeferred); |
+ Label if_rhsisstring(assembler, Label::kDeferred), |
+ if_rhsisnotstring(assembler); |
assembler->Branch(assembler->Int32LessThan( |
rhs_instance_type, assembler->Int32Constant( |
FIRST_NONSTRING_TYPE)), |
@@ -2565,7 +2589,8 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
(mode == kDontNegateResult) |
? CodeFactory::StringEqual(assembler->isolate()) |
: CodeFactory::StringNotEqual(assembler->isolate()); |
- assembler->TailCallStub(callable, context, lhs, rhs); |
+ result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
+ assembler->Goto(&end); |
} |
assembler->Bind(&if_rhsisnotstring); |
@@ -2583,8 +2608,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
assembler->Bind(&if_lhsisnumber); |
{ |
// Check if {rhs} is also a HeapNumber. |
- Label if_rhsisnumber(assembler), |
- if_rhsisnotnumber(assembler, Label::kDeferred); |
+ Label if_rhsisnumber(assembler), if_rhsisnotnumber(assembler); |
assembler->Branch( |
assembler->Word32Equal(lhs_instance_type, rhs_instance_type), |
&if_rhsisnumber, &if_rhsisnotnumber); |
@@ -2614,16 +2638,13 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
// The {rhs} is a String and the {lhs} is a HeapNumber; we need |
// to convert the {rhs} to a Number and compare the output to |
// the Number on the {lhs}. |
- Callable callable = |
- CodeFactory::StringToNumber(assembler->isolate()); |
- var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
- assembler->Goto(&loop); |
+ assembler->Goto(&do_rhsstringtonumber); |
} |
assembler->Bind(&if_rhsisnotstring); |
{ |
// Check if the {rhs} is a JSReceiver. |
- Label if_rhsisreceiver(assembler, Label::kDeferred), |
+ Label if_rhsisreceiver(assembler), |
if_rhsisnotreceiver(assembler); |
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
assembler->Branch( |
@@ -2715,8 +2736,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
assembler->Bind(&if_lhsissymbol); |
{ |
// Check if the {rhs} is a JSReceiver. |
- Label if_rhsisreceiver(assembler, Label::kDeferred), |
- if_rhsisnotreceiver(assembler); |
+ Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); |
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
assembler->Branch( |
assembler->Int32LessThanOrEqual( |
@@ -2763,8 +2783,7 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
assembler->Bind(&if_rhsisnotsimd128value); |
{ |
// Check if the {rhs} is a JSReceiver. |
- Label if_rhsisreceiver(assembler, Label::kDeferred), |
- if_rhsisnotreceiver(assembler); |
+ Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); |
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
assembler->Branch( |
assembler->Int32LessThanOrEqual( |
@@ -2849,6 +2868,13 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
} |
} |
} |
+ |
+ assembler->Bind(&do_rhsstringtonumber); |
+ { |
+ Callable callable = CodeFactory::StringToNumber(assembler->isolate()); |
+ var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
+ assembler->Goto(&loop); |
+ } |
} |
assembler->Bind(&do_fcmp); |
@@ -2862,13 +2888,25 @@ void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
} |
assembler->Bind(&if_equal); |
- assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
+ { |
+ result.Bind(assembler->BooleanConstant(mode == kDontNegateResult)); |
+ assembler->Goto(&end); |
+ } |
assembler->Bind(&if_notequal); |
- assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
+ { |
+ result.Bind(assembler->BooleanConstant(mode == kNegateResult)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ return result.value(); |
} |
-void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
+compiler::Node* GenerateStrictEqual(CodeStubAssembler* assembler, |
+ ResultMode mode, compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
// Here's pseudo-code for the algorithm below in case of kDontNegateResult |
// mode; for kNegateResult mode we properly negate the result. |
// |
@@ -2918,13 +2956,11 @@ void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
// } |
typedef CodeStubAssembler::Label Label; |
+ typedef CodeStubAssembler::Variable Variable; |
typedef compiler::Node Node; |
- Node* lhs = assembler->Parameter(0); |
- Node* rhs = assembler->Parameter(1); |
- Node* context = assembler->Parameter(2); |
- |
- Label if_equal(assembler), if_notequal(assembler); |
+ Label if_equal(assembler), if_notequal(assembler), end(assembler); |
+ Variable result(assembler, MachineRepresentation::kTagged); |
// Check if {lhs} and {rhs} refer to the same object. |
Label if_same(assembler), if_notsame(assembler); |
@@ -3029,7 +3065,8 @@ void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
Node* rhs_instance_type = assembler->LoadInstanceType(rhs); |
// Check if {rhs} is also a String. |
- Label if_rhsisstring(assembler), if_rhsisnotstring(assembler); |
+ Label if_rhsisstring(assembler, Label::kDeferred), |
+ if_rhsisnotstring(assembler); |
assembler->Branch(assembler->Int32LessThan( |
rhs_instance_type, assembler->Int32Constant( |
FIRST_NONSTRING_TYPE)), |
@@ -3041,7 +3078,8 @@ void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
(mode == kDontNegateResult) |
? CodeFactory::StringEqual(assembler->isolate()) |
: CodeFactory::StringNotEqual(assembler->isolate()); |
- assembler->TailCallStub(callable, context, lhs, rhs); |
+ result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
+ assembler->Goto(&end); |
} |
assembler->Bind(&if_rhsisnotstring); |
@@ -3118,10 +3156,19 @@ void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
} |
assembler->Bind(&if_equal); |
- assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
+ { |
+ result.Bind(assembler->BooleanConstant(mode == kDontNegateResult)); |
+ assembler->Goto(&end); |
+ } |
assembler->Bind(&if_notequal); |
- assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
+ { |
+ result.Bind(assembler->BooleanConstant(mode == kNegateResult)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ return result.value(); |
} |
void GenerateStringRelationalComparison(CodeStubAssembler* assembler, |
@@ -3501,37 +3548,69 @@ void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
holder, callback); |
} |
-void LessThanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateAbstractRelationalComparison(assembler, kLessThan); |
+// static |
+compiler::Node* LessThanStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateAbstractRelationalComparison(assembler, kLessThan, lhs, rhs, |
+ context); |
} |
-void LessThanOrEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual); |
+// static |
+compiler::Node* LessThanOrEqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual, lhs, |
+ rhs, context); |
} |
-void GreaterThanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateAbstractRelationalComparison(assembler, kGreaterThan); |
+// static |
+compiler::Node* GreaterThanStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateAbstractRelationalComparison(assembler, kGreaterThan, lhs, rhs, |
+ context); |
} |
-void GreaterThanOrEqualStub::GenerateAssembly( |
- CodeStubAssembler* assembler) const { |
- GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual); |
+// static |
+compiler::Node* GreaterThanOrEqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual, |
+ lhs, rhs, context); |
} |
-void EqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateEqual(assembler, kDontNegateResult); |
+// static |
+compiler::Node* EqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateEqual(assembler, kDontNegateResult, lhs, rhs, context); |
} |
-void NotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateEqual(assembler, kNegateResult); |
+// static |
+compiler::Node* NotEqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateEqual(assembler, kNegateResult, lhs, rhs, context); |
} |
-void StrictEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateStrictEqual(assembler, kDontNegateResult); |
+// static |
+compiler::Node* StrictEqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateStrictEqual(assembler, kDontNegateResult, lhs, rhs, context); |
} |
-void StrictNotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
- GenerateStrictEqual(assembler, kNegateResult); |
+// static |
+compiler::Node* StrictNotEqualStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* lhs, |
+ compiler::Node* rhs, |
+ compiler::Node* context) { |
+ return GenerateStrictEqual(assembler, kNegateResult, lhs, rhs, context); |
} |
void StringEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
@@ -4198,17 +4277,17 @@ void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { |
stub.GetCode(); |
} |
-void HasPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
+// static |
+compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* key, |
+ compiler::Node* object, |
+ compiler::Node* context) { |
typedef compiler::Node Node; |
typedef CodeStubAssembler::Label Label; |
typedef CodeStubAssembler::Variable Variable; |
- Node* key = assembler->Parameter(0); |
- Node* object = assembler->Parameter(1); |
- Node* context = assembler->Parameter(2); |
- |
- Label call_runtime(assembler), return_true(assembler), |
- return_false(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); |
@@ -4306,14 +4385,29 @@ void HasPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
assembler->Goto(&loop); |
} |
} |
+ |
+ Variable result(assembler, MachineRepresentation::kTagged); |
assembler->Bind(&return_true); |
- assembler->Return(assembler->BooleanConstant(true)); |
+ { |
+ result.Bind(assembler->BooleanConstant(true)); |
+ assembler->Goto(&end); |
+ } |
assembler->Bind(&return_false); |
- assembler->Return(assembler->BooleanConstant(false)); |
+ { |
+ result.Bind(assembler->BooleanConstant(false)); |
+ assembler->Goto(&end); |
+ } |
assembler->Bind(&call_runtime); |
- assembler->TailCallRuntime(Runtime::kHasProperty, context, key, object); |
+ { |
+ result.Bind( |
+ assembler->CallRuntime(Runtime::kHasProperty, context, key, object)); |
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(&end); |
+ return result.value(); |
} |
void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { |