Index: src/full-codegen.h |
diff --git a/src/full-codegen.h b/src/full-codegen.h |
index e5693ed4cf6f9eae44fcea7936fa9755193de21b..799f96d08816398815d276665f0ba3d1df5e72cc 100644 |
--- a/src/full-codegen.h |
+++ b/src/full-codegen.h |
@@ -85,9 +85,7 @@ class FullCodeGenerator: public AstVisitor { |
loop_depth_(0), |
context_(NULL), |
bailout_entries_(0), |
- stack_checks_(2), // There's always at least one. |
- forward_bailout_stack_(NULL), |
- forward_bailout_pending_(NULL) { |
+ stack_checks_(2) { // There's always at least one. |
} |
static bool MakeCode(CompilationInfo* info); |
@@ -275,27 +273,8 @@ class FullCodeGenerator: public AstVisitor { |
} |
}; |
- // The forward bailout stack keeps track of the expressions that can |
- // bail out to just before the control flow is split in a child |
- // node. The stack elements are linked together through the parent |
- // link when visiting expressions in test contexts after requesting |
- // bailout in child forwarding. |
- class ForwardBailoutStack BASE_EMBEDDED { |
- public: |
- ForwardBailoutStack(Expression* expr, ForwardBailoutStack* parent) |
- : expr_(expr), parent_(parent) { } |
- |
- Expression* expr() const { return expr_; } |
- ForwardBailoutStack* parent() const { return parent_; } |
- |
- private: |
- Expression* const expr_; |
- ForwardBailoutStack* const parent_; |
- }; |
- |
// Type of a member function that generates inline code for a native function. |
- typedef void (FullCodeGenerator::*InlineFunctionGenerator) |
- (ZoneList<Expression*>*); |
+ typedef void (FullCodeGenerator::*InlineFunctionGenerator)(CallRuntime* expr); |
static const InlineFunctionGenerator kInlineFunctionGenerators[]; |
@@ -356,23 +335,22 @@ class FullCodeGenerator: public AstVisitor { |
// need the write barrier if location is CONTEXT. |
MemOperand VarOperand(Variable* var, Register scratch); |
- // Forward the bailout responsibility for the given expression to |
- // the next child visited (which must be in a test context). |
- void ForwardBailoutToChild(Expression* expr); |
- |
void VisitForEffect(Expression* expr) { |
EffectContext context(this); |
- VisitInCurrentContext(expr); |
+ Visit(expr); |
+ PrepareForBailout(expr, NO_REGISTERS); |
} |
void VisitForAccumulatorValue(Expression* expr) { |
AccumulatorValueContext context(this); |
- VisitInCurrentContext(expr); |
+ Visit(expr); |
+ PrepareForBailout(expr, TOS_REG); |
} |
void VisitForStackValue(Expression* expr) { |
StackValueContext context(this); |
- VisitInCurrentContext(expr); |
+ Visit(expr); |
+ PrepareForBailout(expr, NO_REGISTERS); |
} |
void VisitForControl(Expression* expr, |
@@ -380,9 +358,14 @@ class FullCodeGenerator: public AstVisitor { |
Label* if_false, |
Label* fall_through) { |
TestContext context(this, expr, if_true, if_false, fall_through); |
- VisitInCurrentContext(expr); |
+ Visit(expr); |
+ // For test contexts, we prepare for bailout before branching, not at |
+ // the end of the entire expression. This happens as part of visiting |
+ // the expression. |
} |
+ void VisitInDuplicateContext(Expression* expr); |
+ |
void VisitDeclarations(ZoneList<Declaration*>* declarations); |
void DeclareGlobals(Handle<FixedArray> pairs); |
int DeclareGlobalsFlags(); |
@@ -394,7 +377,9 @@ class FullCodeGenerator: public AstVisitor { |
// Platform-specific code for comparing the type of a value with |
// a given literal string. |
- void EmitLiteralCompareTypeof(Expression* expr, Handle<String> check); |
+ void EmitLiteralCompareTypeof(Expression* expr, |
+ Expression* sub_expr, |
+ Handle<String> check); |
// Platform-specific code for equality comparison with a nil-like value. |
void EmitLiteralCompareNil(CompareOperation* expr, |
@@ -414,7 +399,7 @@ class FullCodeGenerator: public AstVisitor { |
// canonical JS true value so we will insert a (dead) test against true at |
// the actual bailout target from the optimized code. If not |
// should_normalize, the true and false labels are ignored. |
- void PrepareForBailoutBeforeSplit(State state, |
+ void PrepareForBailoutBeforeSplit(Expression* expr, |
bool should_normalize, |
Label* if_true, |
Label* if_false); |
@@ -449,7 +434,7 @@ class FullCodeGenerator: public AstVisitor { |
void EmitInlineRuntimeCall(CallRuntime* expr); |
#define EMIT_INLINE_RUNTIME_CALL(name, x, y) \ |
- void Emit##name(ZoneList<Expression*>* arguments); |
+ void Emit##name(CallRuntime* expr); |
INLINE_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL) |
INLINE_RUNTIME_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL) |
#undef EMIT_INLINE_RUNTIME_CALL |
@@ -576,7 +561,6 @@ class FullCodeGenerator: public AstVisitor { |
void VisitComma(BinaryOperation* expr); |
void VisitLogicalExpression(BinaryOperation* expr); |
void VisitArithmeticExpression(BinaryOperation* expr); |
- void VisitInCurrentContext(Expression* expr); |
void VisitForTypeofValue(Expression* expr); |
@@ -771,8 +755,6 @@ class FullCodeGenerator: public AstVisitor { |
const ExpressionContext* context_; |
ZoneList<BailoutEntry> bailout_entries_; |
ZoneList<BailoutEntry> stack_checks_; |
- ForwardBailoutStack* forward_bailout_stack_; |
- ForwardBailoutStack* forward_bailout_pending_; |
friend class NestedStatement; |