| Index: src/compiler/js-generic-lowering.cc
|
| diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc
|
| index 5631e6983093fd464a0124cf25f6fe0c3763c2e4..2d6f9d43b7b3f5ed868e959f212243c208667ce2 100644
|
| --- a/src/compiler/js-generic-lowering.cc
|
| +++ b/src/compiler/js-generic-lowering.cc
|
| @@ -2,6 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "src/code-factory.h"
|
| #include "src/code-stubs.h"
|
| #include "src/compiler/common-operator.h"
|
| #include "src/compiler/graph-inl.h"
|
| @@ -15,103 +16,6 @@ namespace v8 {
|
| namespace internal {
|
| namespace compiler {
|
|
|
| -
|
| -// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
|
| -// which doesn't have an interface descriptor yet. It mimics a hydrogen code
|
| -// stub for the underlying IC stub code.
|
| -class LoadICStubShim : public HydrogenCodeStub {
|
| - public:
|
| - LoadICStubShim(Isolate* isolate, ContextualMode contextual_mode)
|
| - : HydrogenCodeStub(isolate), contextual_mode_(contextual_mode) {}
|
| -
|
| - virtual Handle<Code> GenerateCode() OVERRIDE {
|
| - ExtraICState extra_state = LoadIC::ComputeExtraICState(contextual_mode_);
|
| - return LoadIC::initialize_stub(isolate(), extra_state);
|
| - }
|
| -
|
| - virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
|
| - return LoadDescriptor(isolate());
|
| - }
|
| -
|
| - private:
|
| - virtual Major MajorKey() const OVERRIDE { return NoCache; }
|
| - virtual bool UseSpecialCache() OVERRIDE { return true; }
|
| -
|
| - ContextualMode contextual_mode_;
|
| -};
|
| -
|
| -
|
| -// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
|
| -// which doesn't have an interface descriptor yet. It mimics a hydrogen code
|
| -// stub for the underlying IC stub code.
|
| -class KeyedLoadICStubShim : public HydrogenCodeStub {
|
| - public:
|
| - explicit KeyedLoadICStubShim(Isolate* isolate) : HydrogenCodeStub(isolate) {}
|
| -
|
| - virtual Handle<Code> GenerateCode() OVERRIDE {
|
| - return isolate()->builtins()->KeyedLoadIC_Initialize();
|
| - }
|
| -
|
| - virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
|
| - return LoadDescriptor(isolate());
|
| - }
|
| -
|
| - private:
|
| - virtual Major MajorKey() const OVERRIDE { return NoCache; }
|
| - virtual bool UseSpecialCache() OVERRIDE { return true; }
|
| -};
|
| -
|
| -
|
| -// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
|
| -// which doesn't have an interface descriptor yet. It mimics a hydrogen code
|
| -// stub for the underlying IC stub code.
|
| -class StoreICStubShim : public HydrogenCodeStub {
|
| - public:
|
| - StoreICStubShim(Isolate* isolate, StrictMode strict_mode)
|
| - : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {}
|
| -
|
| - virtual Handle<Code> GenerateCode() OVERRIDE {
|
| - return StoreIC::initialize_stub(isolate(), strict_mode_);
|
| - }
|
| -
|
| - virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
|
| - return StoreDescriptor(isolate());
|
| - }
|
| -
|
| - private:
|
| - virtual Major MajorKey() const OVERRIDE { return NoCache; }
|
| - virtual bool UseSpecialCache() OVERRIDE { return true; }
|
| -
|
| - StrictMode strict_mode_;
|
| -};
|
| -
|
| -
|
| -// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
|
| -// which doesn't have an interface descriptor yet. It mimics a hydrogen code
|
| -// stub for the underlying IC stub code.
|
| -class KeyedStoreICStubShim : public HydrogenCodeStub {
|
| - public:
|
| - KeyedStoreICStubShim(Isolate* isolate, StrictMode strict_mode)
|
| - : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {}
|
| -
|
| - virtual Handle<Code> GenerateCode() OVERRIDE {
|
| - return strict_mode_ == SLOPPY
|
| - ? isolate()->builtins()->KeyedStoreIC_Initialize()
|
| - : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
|
| - }
|
| -
|
| - virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
|
| - return StoreDescriptor(isolate());
|
| - }
|
| -
|
| - private:
|
| - virtual Major MajorKey() const OVERRIDE { return NoCache; }
|
| - virtual bool UseSpecialCache() OVERRIDE { return true; }
|
| -
|
| - StrictMode strict_mode_;
|
| -};
|
| -
|
| -
|
| JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph,
|
| MachineOperatorBuilder* machine)
|
| : info_(info),
|
| @@ -175,12 +79,11 @@ Reduction JSGenericLowering::Reduce(Node* node) {
|
| }
|
|
|
|
|
| -#define REPLACE_BINARY_OP_IC_CALL(op, token) \
|
| - Node* JSGenericLowering::Lower##op(Node* node) { \
|
| - BinaryOpICStub stub(isolate(), token); \
|
| - ReplaceWithStubCall(node, &stub, \
|
| - CallDescriptor::kPatchableCallSiteWithNop); \
|
| - return node; \
|
| +#define REPLACE_BINARY_OP_IC_CALL(op, token) \
|
| + Node* JSGenericLowering::Lower##op(Node* node) { \
|
| + ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \
|
| + CallDescriptor::kPatchableCallSiteWithNop); \
|
| + return node; \
|
| }
|
| REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR)
|
| REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR)
|
| @@ -196,14 +99,14 @@ REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD)
|
| #undef REPLACE_BINARY_OP_IC_CALL
|
|
|
|
|
| -#define REPLACE_STUB_CALL(op, StubDeclaration) \
|
| - Node* JSGenericLowering::Lower##op(Node* node) { \
|
| - StubDeclaration; \
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kNoFlags); \
|
| - return node; \
|
| +#define REPLACE_FACTORY_CALL(op, FactoryDeclaration) \
|
| + Node* JSGenericLowering::Lower##op(Node* node) { \
|
| + Callable callable = FactoryDeclaration; \
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kNoFlags); \
|
| + return node; \
|
| }
|
| -REPLACE_STUB_CALL(JSToNumber, ToNumberStub stub(isolate()))
|
| -#undef REPLACE_STUB_CALL
|
| +REPLACE_FACTORY_CALL(JSToNumber, CodeFactory::ToNumber(isolate()))
|
| +#undef REPLACE_FACTORY_CALL
|
|
|
|
|
| #define REPLACE_COMPARE_IC_CALL(op, token, pure) \
|
| @@ -260,15 +163,14 @@ static CallDescriptor::Flags FlagsForNode(Node* node) {
|
|
|
| void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token,
|
| bool pure) {
|
| - BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack.
|
| - CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
|
| + Callable callable = CodeFactory::CompareIC(isolate(), token);
|
| bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op());
|
| CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor(
|
| - d, 0, CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node));
|
| - Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token);
|
| + callable.descriptor(), 0,
|
| + CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node));
|
| NodeVector inputs(zone());
|
| inputs.reserve(node->InputCount() + 1);
|
| - inputs.push_back(CodeConstant(ic));
|
| + inputs.push_back(CodeConstant(callable.code()));
|
| inputs.push_back(NodeProperties::GetValueInput(node, 0));
|
| inputs.push_back(NodeProperties::GetValueInput(node, 1));
|
| inputs.push_back(NodeProperties::GetContextInput(node));
|
| @@ -309,12 +211,11 @@ void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token,
|
| }
|
|
|
|
|
| -void JSGenericLowering::ReplaceWithStubCall(Node* node, HydrogenCodeStub* stub,
|
| +void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable,
|
| CallDescriptor::Flags flags) {
|
| - CallInterfaceDescriptor d = stub->GetCallInterfaceDescriptor();
|
| - CallDescriptor* desc =
|
| - linkage()->GetStubCallDescriptor(d, 0, flags | FlagsForNode(node));
|
| - Node* stub_code = CodeConstant(stub->GetCode());
|
| + CallDescriptor* desc = linkage()->GetStubCallDescriptor(
|
| + callable.descriptor(), 0, flags | FlagsForNode(node));
|
| + Node* stub_code = CodeConstant(callable.code());
|
| PatchInsertInput(node, 0, stub_code);
|
| PatchOperator(node, common()->Call(desc));
|
| }
|
| @@ -323,14 +224,15 @@ void JSGenericLowering::ReplaceWithStubCall(Node* node, HydrogenCodeStub* stub,
|
| void JSGenericLowering::ReplaceWithBuiltinCall(Node* node,
|
| Builtins::JavaScript id,
|
| int nargs) {
|
| - CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS);
|
| - CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
|
| - CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, nargs);
|
| + Callable callable =
|
| + CodeFactory::CallFunction(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS);
|
| + CallDescriptor* desc =
|
| + linkage()->GetStubCallDescriptor(callable.descriptor(), nargs);
|
| // TODO(mstarzinger): Accessing the builtins object this way prevents sharing
|
| // of code across native contexts. Fix this by loading from given context.
|
| Handle<JSFunction> function(
|
| JSFunction::cast(info()->context()->builtins()->javascript_builtin(id)));
|
| - Node* stub_code = CodeConstant(stub.GetCode());
|
| + Node* stub_code = CodeConstant(callable.code());
|
| Node* function_node = FunctionConstant(function);
|
| PatchInsertInput(node, 0, stub_code);
|
| PatchInsertInput(node, 1, function_node);
|
| @@ -372,15 +274,17 @@ Node* JSGenericLowering::LowerBranch(Node* node) {
|
|
|
|
|
| Node* JSGenericLowering::LowerJSUnaryNot(Node* node) {
|
| - ToBooleanStub stub(isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL);
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + Callable callable = CodeFactory::ToBoolean(
|
| + isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL);
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
|
|
| Node* JSGenericLowering::LowerJSToBoolean(Node* node) {
|
| - ToBooleanStub stub(isolate(), ToBooleanStub::RESULT_AS_ODDBALL);
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + Callable callable =
|
| + CodeFactory::ToBoolean(isolate(), ToBooleanStub::RESULT_AS_ODDBALL);
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
| @@ -398,34 +302,34 @@ Node* JSGenericLowering::LowerJSToObject(Node* node) {
|
|
|
|
|
| Node* JSGenericLowering::LowerJSLoadProperty(Node* node) {
|
| - KeyedLoadICStubShim stub(isolate());
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + Callable callable = CodeFactory::KeyedLoadIC(isolate());
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
|
|
| Node* JSGenericLowering::LowerJSLoadNamed(Node* node) {
|
| LoadNamedParameters p = OpParameter<LoadNamedParameters>(node);
|
| - LoadICStubShim stub(isolate(), p.contextual_mode);
|
| PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name));
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + Callable callable = CodeFactory::LoadIC(isolate(), p.contextual_mode);
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
|
|
| Node* JSGenericLowering::LowerJSStoreProperty(Node* node) {
|
| StrictMode strict_mode = OpParameter<StrictMode>(node);
|
| - KeyedStoreICStubShim stub(isolate(), strict_mode);
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + Callable callable = CodeFactory::KeyedStoreIC(isolate(), strict_mode);
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
|
|
| Node* JSGenericLowering::LowerJSStoreNamed(Node* node) {
|
| StoreNamedParameters params = OpParameter<StoreNamedParameters>(node);
|
| - StoreICStubShim stub(isolate(), params.strict_mode);
|
| + Callable callable = CodeFactory::StoreIC(isolate(), params.strict_mode);
|
| PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name));
|
| - ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite);
|
| + ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
|
| return node;
|
| }
|
|
|
|
|