Chromium Code Reviews| Index: src/compiler/effect-control-linearizer.cc |
| diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc |
| index 1aa0ec6668c8ea5e228447ab3c3a082014acf9d5..7c4d16913213aa006d50f908c4530793bc2ee39f 100644 |
| --- a/src/compiler/effect-control-linearizer.cc |
| +++ b/src/compiler/effect-control-linearizer.cc |
| @@ -738,6 +738,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, |
| case IrOpcode::kObjectIsUndetectable: |
| result = LowerObjectIsUndetectable(node); |
| break; |
| + case IrOpcode::kTypeOfIsFunction: |
| + result = LowerObjectTypeOfIsFunction(node); |
| + break; |
| case IrOpcode::kNewRestParameterElements: |
| result = LowerNewRestParameterElements(node); |
| break; |
| @@ -1847,6 +1850,34 @@ Node* EffectControlLinearizer::LowerObjectIsUndetectable(Node* node) { |
| return done.PhiAt(0); |
| } |
| +Node* EffectControlLinearizer::LowerObjectTypeOfIsFunction(Node* node) { |
| + Node* value = node->InputAt(0); |
| + |
| + auto return_false = __ MakeDeferredLabel<3>(); |
| + auto done = __ MakeLabel<2>(MachineRepresentation::kBit); |
| + |
| + Node* check0 = ObjectIsSmi(value); |
| + __ GotoIf(check0, &return_false); |
| + |
| + Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); |
| + Node* value_instance_type = |
| + __ LoadField(AccessBuilder::ForMapInstanceType(), value_map); |
| + Node* check1 = __ Uint32LessThanOrEqual( |
| + __ Uint32Constant(FIRST_FUNCTION_TYPE), value_instance_type); |
| + __ GotoUnless(check1, &return_false); |
| + Node* check2 = __ Uint32LessThanOrEqual( |
| + value_instance_type, __ Uint32Constant(LAST_FUNCTION_TYPE)); |
| + __ GotoUnless(check2, &return_false); |
|
vabr (Chromium)
2017/02/15 23:36:41
This ignores proxies (which was helpfully pointed
Benedikt Meurer
2017/02/16 04:01:19
The code of ObjectIsCallable is the correct code f
|
| + |
| + __ Goto(&done, __ Int32Constant(1)); |
| + |
| + __ Bind(&return_false); |
| + __ Goto(&done, __ Int32Constant(0)); |
| + |
| + __ Bind(&done); |
| + return done.PhiAt(0); |
| +} |
| + |
| Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { |
| int const formal_parameter_count = ParameterCountOf(node->op()); |