| Index: src/hydrogen.h
|
| diff --git a/src/hydrogen.h b/src/hydrogen.h
|
| index a117c551ad6171b8f65527be34be799a541d979d..bd42896c7e062503d23d9ca0e15ab0675b923c8c 100644
|
| --- a/src/hydrogen.h
|
| +++ b/src/hydrogen.h
|
| @@ -1057,13 +1057,13 @@ class HGraphBuilder {
|
| HInstruction* NewUncasted() { return I::New(zone(), context()); }
|
|
|
| template<class I>
|
| - I* New() { return I::cast(NewUncasted<I>()); }
|
| + I* New() { return I::New(zone(), context()); }
|
|
|
| template<class I>
|
| HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());}
|
|
|
| template<class I>
|
| - I* Add() { return I::cast(AddUncasted<I>());}
|
| + I* Add() { return AddInstructionTyped(New<I>());}
|
|
|
| template<class I, class P1>
|
| HInstruction* NewUncasted(P1 p1) {
|
| @@ -1071,7 +1071,7 @@ class HGraphBuilder {
|
| }
|
|
|
| template<class I, class P1>
|
| - I* New(P1 p1) { return I::cast(NewUncasted<I>(p1)); }
|
| + I* New(P1 p1) { return I::New(zone(), context(), p1); }
|
|
|
| template<class I, class P1>
|
| HInstruction* AddUncasted(P1 p1) {
|
| @@ -1085,7 +1085,12 @@ class HGraphBuilder {
|
|
|
| template<class I, class P1>
|
| I* Add(P1 p1) {
|
| - return I::cast(AddUncasted<I>(p1));
|
| + I* result = AddInstructionTyped(New<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, class P2>
|
| @@ -1095,7 +1100,7 @@ class HGraphBuilder {
|
|
|
| template<class I, class P1, class P2>
|
| I* New(P1 p1, P2 p2) {
|
| - return I::cast(NewUncasted<I>(p1, p2));
|
| + return I::New(zone(), context(), p1, p2);
|
| }
|
|
|
| template<class I, class P1, class P2>
|
| @@ -1109,7 +1114,11 @@ class HGraphBuilder {
|
|
|
| template<class I, class P1, class P2>
|
| I* Add(P1 p1, P2 p2) {
|
| - return I::cast(AddUncasted<I>(p1, p2));
|
| + I* result = AddInstructionTyped(New<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, class P3>
|
| @@ -1119,7 +1128,7 @@ class HGraphBuilder {
|
|
|
| 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));
|
| + return I::New(zone(), context(), p1, p2, p3);
|
| }
|
|
|
| template<class I, class P1, class P2, class P3>
|
| @@ -1129,7 +1138,7 @@ class HGraphBuilder {
|
|
|
| template<class I, class P1, class P2, class P3>
|
| I* Add(P1 p1, P2 p2, P3 p3) {
|
| - return I::cast(AddUncasted<I>(p1, p2, p3));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4>
|
| @@ -1139,7 +1148,7 @@ class HGraphBuilder {
|
|
|
| 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));
|
| + return I::New(zone(), context(), p1, p2, p3, p4);
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4>
|
| @@ -1149,7 +1158,7 @@ class HGraphBuilder {
|
|
|
| template<class I, class P1, class P2, class P3, class P4>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| - return I::cast(AddUncasted<I>(p1, p2, p3, p4));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3, p4));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5>
|
| @@ -1159,7 +1168,7 @@ class HGraphBuilder {
|
|
|
| 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));
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5);
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5>
|
| @@ -1169,7 +1178,7 @@ class HGraphBuilder {
|
|
|
| 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 I::cast(AddUncasted<I>(p1, p2, p3, p4, p5));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| @@ -1179,7 +1188,7 @@ class HGraphBuilder {
|
|
|
| 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));
|
| + 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>
|
| @@ -1189,7 +1198,7 @@ class HGraphBuilder {
|
|
|
| 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 I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6)));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4,
|
| @@ -1201,7 +1210,7 @@ class HGraphBuilder {
|
| 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));
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7);
|
| }
|
|
|
| template<class I, class P1, class P2, class P3,
|
| @@ -1213,8 +1222,7 @@ class HGraphBuilder {
|
| 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 I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4,
|
| - p5, p6, p7)));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4,
|
| @@ -1227,7 +1235,7 @@ class HGraphBuilder {
|
| 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));
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8);
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4,
|
| @@ -1240,8 +1248,7 @@ class HGraphBuilder {
|
| 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 I::cast(
|
| - AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)));
|
| + return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7, p8));
|
| }
|
|
|
| void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE);
|
| @@ -1256,7 +1263,7 @@ class HGraphBuilder {
|
|
|
| HValue* BuildCheckHeapObject(HValue* object);
|
| HValue* BuildCheckMap(HValue* obj, Handle<Map> map);
|
| - HValue* BuildCheckString(HValue* object, const char* failure_reason);
|
| + HValue* BuildCheckString(HValue* string);
|
| HValue* BuildWrapReceiver(HValue* object, HValue* function);
|
|
|
| // Building common constructs
|
| @@ -1345,8 +1352,7 @@ class HGraphBuilder {
|
| Handle<Type> left_type,
|
| Handle<Type> right_type,
|
| Handle<Type> result_type,
|
| - Maybe<int> fixed_right_arg,
|
| - bool binop_stub = false);
|
| + Maybe<int> fixed_right_arg);
|
|
|
| HLoadNamedField* AddLoadFixedArrayLength(HValue *object);
|
|
|
| @@ -1730,6 +1736,12 @@ class HGraphBuilder {
|
| position_ = position;
|
| }
|
|
|
| + template <typename ViewClass>
|
| + void BuildArrayBufferViewInitialization(HValue* obj,
|
| + HValue* buffer,
|
| + HValue* byte_offset,
|
| + HValue* byte_length);
|
| +
|
| private:
|
| HGraphBuilder();
|
|
|
| @@ -1743,6 +1755,11 @@ class HGraphBuilder {
|
| void PadEnvironmentForContinuation(HBasicBlock* from,
|
| HBasicBlock* continuation);
|
|
|
| + template <class I>
|
| + I* AddInstructionTyped(I* instr) {
|
| + return I::cast(AddInstruction(instr));
|
| + }
|
| +
|
| CompilationInfo* info_;
|
| HGraph* graph_;
|
| HBasicBlock* current_block_;
|
| @@ -1751,7 +1768,7 @@ class HGraphBuilder {
|
|
|
|
|
| template<>
|
| -inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
| +inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
|
| const char* reason, Deoptimizer::BailoutType type) {
|
| if (type == Deoptimizer::SOFT) {
|
| isolate()->counters()->soft_deopts_requested()->Increment();
|
| @@ -1771,14 +1788,14 @@ inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
|
|
|
|
| template<>
|
| -inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
| const char* reason, Deoptimizer::BailoutType type) {
|
| - return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(reason, type));
|
| + return Add<HDeoptimize>(reason, type);
|
| }
|
|
|
|
|
| template<>
|
| -inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(
|
| +inline HSimulate* HGraphBuilder::Add<HSimulate>(
|
| BailoutId id,
|
| RemovableSimulate removable) {
|
| HSimulate* instr = current_block()->CreateSimulate(id, removable);
|
| @@ -1788,13 +1805,20 @@ inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(
|
|
|
|
|
| template<>
|
| +inline HSimulate* HGraphBuilder::Add<HSimulate>(
|
| + BailoutId id) {
|
| + return Add<HSimulate>(id, FIXED_SIMULATE);
|
| +}
|
| +
|
| +
|
| +template<>
|
| inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) {
|
| - return AddUncasted<HSimulate>(id, FIXED_SIMULATE);
|
| + return Add<HSimulate>(id, FIXED_SIMULATE);
|
| }
|
|
|
|
|
| template<>
|
| -inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
| +inline HReturn* HGraphBuilder::Add<HReturn>(HValue* value) {
|
| int num_parameters = graph()->info()->num_parameters();
|
| HValue* params = AddUncasted<HConstant>(num_parameters);
|
| HReturn* return_instruction = New<HReturn>(value, params);
|
| @@ -1804,13 +1828,24 @@ inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
|
|
|
|
| template<>
|
| +inline HReturn* HGraphBuilder::Add<HReturn>(HConstant* value) {
|
| + return Add<HReturn>(static_cast<HValue*>(value));
|
| +}
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
| + return Add<HReturn>(value);
|
| +}
|
| +
|
| +
|
| +template<>
|
| inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) {
|
| - return AddUncasted<HReturn>(static_cast<HValue*>(value));
|
| + return Add<HReturn>(value);
|
| }
|
|
|
|
|
| template<>
|
| -inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>(
|
| +inline HCallRuntime* HGraphBuilder::Add<HCallRuntime>(
|
| Handle<String> name,
|
| const Runtime::Function* c_function,
|
| int argument_count) {
|
| @@ -1827,11 +1862,25 @@ inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>(
|
|
|
|
|
| template<>
|
| -inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>(
|
| + Handle<String> name,
|
| + const Runtime::Function* c_function,
|
| + int argument_count) {
|
| + return Add<HCallRuntime>(name, c_function, argument_count);
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HContext* HGraphBuilder::New<HContext>() {
|
| return HContext::New(zone());
|
| }
|
|
|
|
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
|
| + return New<HContext>();
|
| +}
|
| +
|
| class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| public:
|
| // A class encapsulating (lazily-allocated) break and continue blocks for
|
| @@ -2152,6 +2201,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| SmallMapList* types,
|
| Handle<String> name);
|
|
|
| + void VisitTypedArrayInitialize(CallRuntime* expr);
|
| +
|
| bool IsCallNewArrayInlineable(CallNew* expr);
|
| void BuildInlinedCallNewArray(CallNew* expr);
|
|
|
| @@ -2360,7 +2411,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| HInstruction* BuildThisFunction();
|
|
|
| HInstruction* BuildFastLiteral(Handle<JSObject> boilerplate_object,
|
| - AllocationSiteContext* site_context);
|
| + AllocationSiteUsageContext* site_context);
|
|
|
| void BuildEmitObjectHeader(Handle<JSObject> boilerplate_object,
|
| HInstruction* object);
|
| @@ -2371,12 +2422,12 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
|
|
| void BuildEmitInObjectProperties(Handle<JSObject> boilerplate_object,
|
| HInstruction* object,
|
| - AllocationSiteContext* site_context);
|
| + AllocationSiteUsageContext* site_context);
|
|
|
| void BuildEmitElements(Handle<JSObject> boilerplate_object,
|
| Handle<FixedArrayBase> elements,
|
| HValue* object_elements,
|
| - AllocationSiteContext* site_context);
|
| + AllocationSiteUsageContext* site_context);
|
|
|
| void BuildEmitFixedDoubleArray(Handle<FixedArrayBase> elements,
|
| ElementsKind kind,
|
| @@ -2385,7 +2436,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| void BuildEmitFixedArray(Handle<FixedArrayBase> elements,
|
| ElementsKind kind,
|
| HValue* object_elements,
|
| - AllocationSiteContext* site_context);
|
| + AllocationSiteUsageContext* site_context);
|
|
|
| void AddCheckPrototypeMaps(Handle<JSObject> holder,
|
| Handle<Map> receiver_map);
|
|
|