| Index: src/ia32/lithium-codegen-ia32.h
|
| diff --git a/src/ia32/lithium-codegen-ia32.h b/src/ia32/lithium-codegen-ia32.h
|
| index 5a474b67f64723339607be28393f25ca7e768464..37a7ea9477a5b77055d2de768af56a63d9a7c900 100644
|
| --- a/src/ia32/lithium-codegen-ia32.h
|
| +++ b/src/ia32/lithium-codegen-ia32.h
|
| @@ -448,10 +448,10 @@ class LCodeGen V8_FINAL BASE_EMBEDDED {
|
|
|
| class X87Stack {
|
| public:
|
| - explicit X87Stack(MacroAssembler* masm) : stack_depth_(0), masm_(masm) { }
|
| + explicit X87Stack(MacroAssembler* masm)
|
| + : stack_depth_(0), is_mutable_(true), masm_(masm) { }
|
| explicit X87Stack(const X87Stack& other)
|
| - : stack_depth_(0), masm_(other.masm_) {
|
| - stack_depth_ = other.stack_depth_;
|
| + : stack_depth_(other.stack_depth_), is_mutable_(false), masm_(masm()) {
|
| for (int i = 0; i < stack_depth_; i++) {
|
| stack_[i] = other.stack_[i];
|
| }
|
| @@ -470,8 +470,12 @@ class LCodeGen V8_FINAL BASE_EMBEDDED {
|
| void CommitWrite(X87Register reg);
|
| void FlushIfNecessary(LInstruction* instr, LCodeGen* cgen);
|
| int depth() const { return stack_depth_; }
|
| - void pop() { stack_depth_--; }
|
| + void pop() {
|
| + ASSERT(is_mutable_);
|
| + stack_depth_--;
|
| + }
|
| void push(X87Register reg) {
|
| + ASSERT(is_mutable_);
|
| ASSERT(stack_depth_ < X87Register::kNumAllocatableRegisters);
|
| stack_[stack_depth_] = reg;
|
| stack_depth_++;
|
| @@ -482,9 +486,11 @@ class LCodeGen V8_FINAL BASE_EMBEDDED {
|
| private:
|
| int ArrayIndex(X87Register reg);
|
| int st2idx(int pos);
|
| +
|
| X87Register stack_[X87Register::kNumAllocatableRegisters];
|
| int stack_depth_;
|
| - MacroAssembler* const masm_;
|
| + bool is_mutable_;
|
| + MacroAssembler* masm_;
|
| };
|
| X87Stack x87_stack_;
|
|
|
| @@ -528,10 +534,11 @@ class LCodeGen V8_FINAL BASE_EMBEDDED {
|
|
|
| class LDeferredCode : public ZoneObject {
|
| public:
|
| - explicit LDeferredCode(LCodeGen* codegen)
|
| + explicit LDeferredCode(LCodeGen* codegen, const LCodeGen::X87Stack& x87_stack)
|
| : codegen_(codegen),
|
| external_exit_(NULL),
|
| - instruction_index_(codegen->current_instruction_) {
|
| + instruction_index_(codegen->current_instruction_),
|
| + x87_stack_(x87_stack) {
|
| codegen->AddDeferredCode(this);
|
| }
|
|
|
| @@ -543,6 +550,7 @@ class LDeferredCode : public ZoneObject {
|
| Label* entry() { return &entry_; }
|
| Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; }
|
| int instruction_index() const { return instruction_index_; }
|
| + const LCodeGen::X87Stack& x87_stack() const { return x87_stack_; }
|
|
|
| protected:
|
| LCodeGen* codegen() const { return codegen_; }
|
| @@ -554,6 +562,7 @@ class LDeferredCode : public ZoneObject {
|
| Label exit_;
|
| Label* external_exit_;
|
| int instruction_index_;
|
| + LCodeGen::X87Stack x87_stack_;
|
| };
|
|
|
| } } // namespace v8::internal
|
|
|