Chromium Code Reviews| Index: src/code-stubs.cc |
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
| index 9a8e4f91912d24c35ac5795055ac24a6335575e6..b4afeaa72ee767d79fbe43bb017e66062338940d 100644 |
| --- a/src/code-stubs.cc |
| +++ b/src/code-stubs.cc |
| @@ -1882,6 +1882,128 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
| } |
| // static |
| +// ES6 section 12.5.5 typeof operator |
| +compiler::Node* TypeofStub::Generate(CodeStubAssembler* assembler, |
| + compiler::Node* value, |
| + compiler::Node* context) { |
| + typedef compiler::Node Node; |
| + typedef CodeStubAssembler::Label Label; |
| + typedef CodeStubAssembler::Variable Variable; |
| + |
| + Variable result_var(assembler, MachineRepresentation::kTagged); |
| + |
| + Label return_number(assembler, Label::kDeferred), if_oddball(assembler), |
| + return_function(assembler), return_undefined(assembler), |
| + return_object(assembler), return_string(assembler), |
| + return_result(assembler); |
| + |
| + assembler->GotoIf(assembler->WordIsSmi(value), &return_number); |
| + |
| + Node* map = assembler->LoadMap(value); |
| + |
| + assembler->GotoIf( |
| + assembler->WordEqual(map, assembler->HeapNumberMapConstant()), |
| + &return_number); |
| + |
| + Node* instance_type = assembler->LoadInstanceType(value); |
| + |
| + assembler->GotoIf(assembler->Word32Equal( |
| + instance_type, assembler->Int32Constant(ODDBALL_TYPE)), |
| + &if_oddball); |
| + { |
|
Benedikt Meurer
2016/08/02 03:18:22
Nit: No need to put this into a { } block, that's
|
| + Node* callable_or_undetectable_mask = assembler->Word32And( |
| + assembler->LoadMapBitField(map), |
| + assembler->Int32Constant(1 << Map::kIsCallable | |
| + 1 << Map::kIsUndetectable)); |
| + |
| + assembler->GotoIf( |
| + assembler->Word32Equal(callable_or_undetectable_mask, |
| + assembler->Int32Constant(1 << Map::kIsCallable)), |
| + &return_function); |
| + |
| + assembler->GotoUnless(assembler->Word32Equal(callable_or_undetectable_mask, |
| + assembler->Int32Constant(0)), |
| + &return_undefined); |
| + } |
| + assembler->GotoIf( |
| + assembler->Int32GreaterThanOrEqual( |
| + instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), |
| + &return_object); |
| + |
| + assembler->GotoIf( |
| + assembler->Int32LessThan(instance_type, |
| + assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| + &return_string); |
| + |
| +#define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \ |
| + Label return_##type(assembler); \ |
| + Node* type##_map = \ |
| + assembler->HeapConstant(assembler->factory()->type##_map()); \ |
| + assembler->GotoIf(assembler->WordEqual(map, type##_map), &return_##type); |
| + SIMD128_TYPES(SIMD128_BRANCH) |
| +#undef SIMD128_BRANCH |
| + |
| + result_var.Bind(assembler->HeapConstant( |
|
Benedikt Meurer
2016/08/02 03:18:22
Nit: Please add an Assert here that the map is the
|
| + assembler->isolate()->factory()->symbol_string())); |
| + assembler->Goto(&return_result); |
| + |
| + assembler->Bind(&return_number); |
| + { |
| + result_var.Bind(assembler->HeapConstant( |
| + assembler->isolate()->factory()->number_string())); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| + assembler->Bind(&if_oddball); |
| + { |
| + Node* type = assembler->LoadObjectField(value, Oddball::kTypeOfOffset); |
| + result_var.Bind(type); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| + assembler->Bind(&return_function); |
| + { |
| + result_var.Bind(assembler->HeapConstant( |
| + assembler->isolate()->factory()->function_string())); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| + assembler->Bind(&return_undefined); |
| + { |
| + result_var.Bind(assembler->HeapConstant( |
| + assembler->isolate()->factory()->undefined_string())); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| + assembler->Bind(&return_object); |
| + { |
| + result_var.Bind(assembler->HeapConstant( |
| + assembler->isolate()->factory()->object_string())); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| + assembler->Bind(&return_string); |
| + { |
| + result_var.Bind(assembler->HeapConstant( |
| + assembler->isolate()->factory()->string_string())); |
| + assembler->Goto(&return_result); |
| + } |
| + |
| +#define SIMD128_BIND_RETURN(TYPE, Type, type, lane_count, lane_type) \ |
| + assembler->Bind(&return_##type); \ |
| + { \ |
| + result_var.Bind(assembler->HeapConstant( \ |
| + assembler->isolate()->factory()->type##_string())); \ |
| + assembler->Goto(&return_result); \ |
| + } |
| + SIMD128_TYPES(SIMD128_BIND_RETURN) |
| +#undef SIMD128_BIND_RETURN |
| + |
| + assembler->Bind(&return_result); |
| + return result_var.value(); |
| +} |
| + |
| +// static |
| compiler::Node* InstanceOfStub::Generate(CodeStubAssembler* assembler, |
| compiler::Node* object, |
| compiler::Node* callable, |
| @@ -4100,10 +4222,6 @@ void StoreTransitionStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| FUNCTION_ADDR(Runtime_TransitionStoreIC_MissFromStubFailure)); |
| } |
| -void TypeofStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| - descriptor->SetMissHandler(Runtime::kTypeof); |
| -} |
| - |
| void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| descriptor->Initialize( |
| Runtime::FunctionForId(Runtime::kNumberToString)->entry); |
| @@ -4190,11 +4308,6 @@ void GrowArrayElementsStub::InitializeDescriptor( |
| } |
| -void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { |
| - TypeofStub stub(isolate); |
| - stub.GetCode(); |
| -} |
| - |
| namespace { |
| compiler::Node* GenerateHasProperty( |