| Index: src/hydrogen.h
|
| diff --git a/src/hydrogen.h b/src/hydrogen.h
|
| index 99428c14c5ad0e58aa2ee2158858f80fc4525049..daca61d12d183ce81cda8ab222b02d40857b6688 100644
|
| --- a/src/hydrogen.h
|
| +++ b/src/hydrogen.h
|
| @@ -583,7 +583,7 @@ class HEnvironment: public ZoneObject {
|
| return result;
|
| }
|
|
|
| - HValue* LookupContext() const {
|
| + HValue* context() const {
|
| // Return first special.
|
| return Lookup(parameter_count());
|
| }
|
| @@ -990,57 +990,205 @@ class HGraphBuilder {
|
| void Push(HValue* value) { environment()->Push(value); }
|
| HValue* Pop() { return environment()->Pop(); }
|
|
|
| + virtual HValue* context() = 0;
|
| +
|
| // Adding instructions.
|
| HInstruction* AddInstruction(HInstruction* instr);
|
|
|
| template<class I>
|
| - I* Add() { return static_cast<I*>(AddInstruction(new(zone()) I())); }
|
| + HInstruction* NewUncasted() { return I::New(zone(), context()); }
|
| +
|
| + template<class I>
|
| + I* New() { return I::cast(NewUncasted<I>()); }
|
| +
|
| + template<class I>
|
| + HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());}
|
| +
|
| + template<class I>
|
| + I* Add() { return I::cast(AddUncasted<I>());}
|
| +
|
| + template<class I, class P1>
|
| + HInstruction* NewUncasted(P1 p1) {
|
| + return I::New(zone(), context(), p1);
|
| + }
|
| +
|
| + template<class I, class P1>
|
| + I* New(P1 p1) { return I::cast(NewUncasted<I>(p1)); }
|
| +
|
| + template<class I, class P1>
|
| + HInstruction* AddUncasted(P1 p1) {
|
| + HInstruction* result = AddInstruction(NewUncasted<I>(p1));
|
| + // Specializations must have their parameters properly casted
|
| + // to avoid landing here.
|
| + ASSERT(!result->IsReturn() && !result->IsSimulate() &&
|
| + !result->IsDeoptimize());
|
| + return result;
|
| + }
|
|
|
| template<class I, class P1>
|
| I* Add(P1 p1) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1)));
|
| + return I::cast(AddUncasted<I>(p1));
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2) {
|
| + return I::New(zone(), context(), p1, p2);
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + I* New(P1 p1, P2 p2) {
|
| + return I::cast(NewUncasted<I>(p1, p2));
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2) {
|
| + HInstruction* result = AddInstruction(NewUncasted<I>(p1, p2));
|
| + // Specializations must have their parameters properly casted
|
| + // to avoid landing here.
|
| + ASSERT(!result->IsSimulate());
|
| + return result;
|
| }
|
|
|
| template<class I, class P1, class P2>
|
| I* Add(P1 p1, P2 p2) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2)));
|
| + return static_cast<I*>(AddUncasted<I>(p1, p2));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3) {
|
| + return I::New(zone(), context(), p1, p2, p3);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + I* New(P1 p1, P2 p2, P3 p3) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3>
|
| I* Add(P1 p1, P2 p2, P3 p3) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3, p4));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4, p5)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3, p4, p5));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6)));
|
| + return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6)));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3,
|
| + class P4, class P5, class P6, class P7>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3,
|
| class P4, class P5, class P6, class P7>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6, p7)));
|
| + return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4,
|
| + p5, p6, p7)));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
|
| + P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
|
| + P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4,
|
| class P5, class P6, class P7, class P8>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8)));
|
| + return I::cast(
|
| + AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)));
|
| }
|
|
|
| + void AddSimulate(BailoutId id,
|
| + RemovableSimulate removable = FIXED_SIMULATE);
|
| +
|
| void IncrementInNoSideEffectsScope() {
|
| no_side_effects_scope_count_++;
|
| }
|
| @@ -1089,15 +1237,9 @@ class HGraphBuilder {
|
| LoadKeyedHoleMode load_mode,
|
| KeyedAccessStoreMode store_mode);
|
|
|
| - HLoadNamedField* AddLoad(
|
| - HValue *object,
|
| - HObjectAccess access,
|
| - HValue *typecheck = NULL);
|
| -
|
| HLoadNamedField* BuildLoadNamedField(
|
| HValue* object,
|
| - HObjectAccess access,
|
| - Representation representation);
|
| + HObjectAccess access);
|
|
|
| HInstruction* AddExternalArrayElementAccess(
|
| HValue* external_elements,
|
| @@ -1117,13 +1259,11 @@ class HGraphBuilder {
|
| LoadKeyedHoleMode load_mode,
|
| KeyedAccessStoreMode store_mode);
|
|
|
| - HLoadNamedField* BuildLoadNamedField(HValue* object, HObjectAccess access);
|
| - HStoreNamedField* AddStore(HValue *object, HObjectAccess access, HValue *val);
|
| HStoreNamedField* AddStoreMapConstant(HValue *object, Handle<Map>);
|
| HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL);
|
| HLoadNamedField* AddLoadFixedArrayLength(HValue *object);
|
|
|
| - HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context);
|
| + HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin);
|
|
|
| HValue* TruncateToNumber(HValue* value, Handle<Type>* expected);
|
|
|
| @@ -1314,8 +1454,7 @@ class HGraphBuilder {
|
| HGraphBuilder* builder_;
|
| };
|
|
|
| - HValue* BuildNewElementsCapacity(HValue* context,
|
| - HValue* old_capacity);
|
| + HValue* BuildNewElementsCapacity(HValue* old_capacity);
|
|
|
| void BuildNewSpaceArrayCheck(HValue* length,
|
| ElementsKind kind);
|
| @@ -1349,7 +1488,7 @@ class HGraphBuilder {
|
| return JSArray::kPreallocatedArrayElements;
|
| }
|
|
|
| - HValue* EmitMapCode(HValue* context);
|
| + HValue* EmitMapCode();
|
| HValue* EmitInternalMapCode();
|
| HValue* EstablishEmptyArrayAllocationSize();
|
| HValue* EstablishAllocationSize(HValue* length_node);
|
| @@ -1364,16 +1503,14 @@ class HGraphBuilder {
|
| HInnerAllocatedObject* elements_location_;
|
| };
|
|
|
| - HValue* BuildAllocateElements(HValue* context,
|
| - ElementsKind kind,
|
| + HValue* BuildAllocateElements(ElementsKind kind,
|
| HValue* capacity);
|
|
|
| void BuildInitializeElementsHeader(HValue* elements,
|
| ElementsKind kind,
|
| HValue* capacity);
|
|
|
| - HValue* BuildAllocateElementsAndInitializeElementsHeader(HValue* context,
|
| - ElementsKind kind,
|
| + HValue* BuildAllocateElementsAndInitializeElementsHeader(ElementsKind kind,
|
| HValue* capacity);
|
|
|
| // array must have been allocated with enough room for
|
| @@ -1394,22 +1531,19 @@ class HGraphBuilder {
|
| HValue* length,
|
| HValue* new_capacity);
|
|
|
| - void BuildFillElementsWithHole(HValue* context,
|
| - HValue* elements,
|
| + void BuildFillElementsWithHole(HValue* elements,
|
| ElementsKind elements_kind,
|
| HValue* from,
|
| HValue* to);
|
|
|
| - void BuildCopyElements(HValue* context,
|
| - HValue* from_elements,
|
| + void BuildCopyElements(HValue* from_elements,
|
| ElementsKind from_elements_kind,
|
| HValue* to_elements,
|
| ElementsKind to_elements_kind,
|
| HValue* length,
|
| HValue* capacity);
|
|
|
| - HValue* BuildCloneShallowArray(HContext* context,
|
| - HValue* boilerplate,
|
| + HValue* BuildCloneShallowArray(HValue* boilerplate,
|
| HValue* allocation_site,
|
| AllocationSiteMode mode,
|
| ElementsKind kind,
|
| @@ -1428,8 +1562,8 @@ class HGraphBuilder {
|
| int previous_object_size,
|
| HValue* payload);
|
|
|
| - HInstruction* BuildGetNativeContext(HValue* context);
|
| - HInstruction* BuildGetArrayFunction(HValue* context);
|
| + HInstruction* BuildGetNativeContext();
|
| + HInstruction* BuildGetArrayFunction();
|
|
|
| private:
|
| HGraphBuilder();
|
| @@ -1445,13 +1579,14 @@ class HGraphBuilder {
|
|
|
|
|
| template<>
|
| -inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) {
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
| + Deoptimizer::BailoutType type) {
|
| if (type == Deoptimizer::SOFT) {
|
| isolate()->counters()->soft_deopts_requested()->Increment();
|
| if (FLAG_always_opt) return NULL;
|
| }
|
| if (current_block()->IsDeoptimizing()) return NULL;
|
| - HDeoptimize* instr = new(zone()) HDeoptimize(type);
|
| + HDeoptimize* instr = New<HDeoptimize>(type);
|
| AddInstruction(instr);
|
| if (type == Deoptimizer::SOFT) {
|
| isolate()->counters()->soft_deopts_inserted()->Increment();
|
| @@ -1463,8 +1598,16 @@ inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) {
|
|
|
|
|
| template<>
|
| -inline HSimulate* HGraphBuilder::Add(BailoutId id,
|
| - RemovableSimulate removable) {
|
| +inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
|
| + Deoptimizer::BailoutType type) {
|
| + return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(type));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(
|
| + BailoutId id,
|
| + RemovableSimulate removable) {
|
| HSimulate* instr = current_block()->CreateSimulate(id, removable);
|
| AddInstruction(instr);
|
| return instr;
|
| @@ -1472,26 +1615,46 @@ inline HSimulate* HGraphBuilder::Add(BailoutId id,
|
|
|
|
|
| template<>
|
| -inline HSimulate* HGraphBuilder::Add(BailoutId id) {
|
| - return Add<HSimulate>(id, FIXED_SIMULATE);
|
| +inline HInstruction* HGraphBuilder::NewUncasted<HLoadNamedField>(
|
| + HValue* object, HObjectAccess access) {
|
| + return NewUncasted<HLoadNamedField>(object, access,
|
| + static_cast<HValue*>(NULL));
|
| }
|
|
|
|
|
| template<>
|
| -inline HReturn* HGraphBuilder::Add(HValue* value) {
|
| - HValue* context = environment()->LookupContext();
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HLoadNamedField>(
|
| + HValue* object, HObjectAccess access) {
|
| + return AddUncasted<HLoadNamedField>(object, access,
|
| + static_cast<HValue*>(NULL));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) {
|
| + return AddUncasted<HSimulate>(id, FIXED_SIMULATE);
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
| int num_parameters = graph()->info()->num_parameters();
|
| - HValue* params = Add<HConstant>(num_parameters);
|
| - HReturn* return_instruction = new(graph()->zone())
|
| - HReturn(value, context, params);
|
| + HValue* params = AddUncasted<HConstant>(num_parameters);
|
| + HReturn* return_instruction = New<HReturn>(value, params);
|
| current_block()->FinishExit(return_instruction);
|
| return return_instruction;
|
| }
|
|
|
|
|
| template<>
|
| -inline HReturn* HGraphBuilder::Add(HConstant* p1) {
|
| - return Add<HReturn>(static_cast<HValue*>(p1));
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) {
|
| + return AddUncasted<HReturn>(static_cast<HValue*>(value));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
|
| + return HContext::New(zone());
|
| }
|
|
|
|
|
| @@ -1560,6 +1723,8 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
|
|
|
| bool inline_bailout() { return inline_bailout_; }
|
|
|
| + HValue* context() { return environment()->context(); }
|
| +
|
| void Bailout(const char* reason);
|
|
|
| HBasicBlock* CreateJoin(HBasicBlock* first,
|
| @@ -1835,8 +2000,7 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
|
| Expression* sub_expr,
|
| NilValue nil);
|
|
|
| - HInstruction* BuildStringCharCodeAt(HValue* context,
|
| - HValue* string,
|
| + HInstruction* BuildStringCharCodeAt(HValue* string,
|
| HValue* index);
|
| HInstruction* BuildBinaryOperation(BinaryOperation* expr,
|
| HValue* left,
|
|
|