| Index: src/ia32/lithium-codegen-ia32.h
 | 
| diff --git a/src/ia32/lithium-codegen-ia32.h b/src/ia32/lithium-codegen-ia32.h
 | 
| index 4414e6a26c779d3423363305e0dd6dea4c3fba3a..84ea3a13d55c087734a2703f704c9ab8921a7baa 100644
 | 
| --- a/src/ia32/lithium-codegen-ia32.h
 | 
| +++ b/src/ia32/lithium-codegen-ia32.h
 | 
| @@ -164,16 +164,44 @@ class LCodeGen BASE_EMBEDDED {
 | 
|    bool GenerateRelocPadding();
 | 
|    bool GenerateSafepointTable();
 | 
|  
 | 
| -  void CallCode(Handle<Code> code, RelocInfo::Mode mode, LInstruction* instr,
 | 
| -                bool adjusted = true);
 | 
| -  void CallRuntime(const Runtime::Function* fun, int argc, LInstruction* instr,
 | 
| -                   bool adjusted = true);
 | 
| -  void CallRuntime(Runtime::FunctionId id, int argc, LInstruction* instr,
 | 
| -                   bool adjusted = true) {
 | 
| +  enum ContextMode {
 | 
| +    RESTORE_CONTEXT,
 | 
| +    CONTEXT_ADJUSTED
 | 
| +  };
 | 
| +
 | 
| +  enum SafepointMode {
 | 
| +    RECORD_SIMPLE_SAFEPOINT,
 | 
| +    RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS
 | 
| +  };
 | 
| +
 | 
| +  void CallCode(Handle<Code> code,
 | 
| +                RelocInfo::Mode mode,
 | 
| +                LInstruction* instr,
 | 
| +                ContextMode context_mode);
 | 
| +
 | 
| +  void CallCodeGeneric(Handle<Code> code,
 | 
| +                       RelocInfo::Mode mode,
 | 
| +                       LInstruction* instr,
 | 
| +                       ContextMode context_mode,
 | 
| +                       SafepointMode safepoint_mode);
 | 
| +
 | 
| +  void CallRuntime(const Runtime::Function* fun,
 | 
| +                   int argc,
 | 
| +                   LInstruction* instr,
 | 
| +                   ContextMode context_mode);
 | 
| +
 | 
| +  void CallRuntime(Runtime::FunctionId id,
 | 
| +                   int argc,
 | 
| +                   LInstruction* instr,
 | 
| +                   ContextMode context_mode) {
 | 
|      const Runtime::Function* function = Runtime::FunctionForId(id);
 | 
| -    CallRuntime(function, argc, instr, adjusted);
 | 
| +    CallRuntime(function, argc, instr, context_mode);
 | 
|    }
 | 
|  
 | 
| +  void CallRuntimeFromDeferred(Runtime::FunctionId id,
 | 
| +                               int argc,
 | 
| +                               LInstruction* instr);
 | 
| +
 | 
|    // Generate a direct call to a known function.  Expects the function
 | 
|    // to be in edi.
 | 
|    void CallKnownFunction(Handle<JSFunction> function,
 | 
| @@ -182,7 +210,9 @@ class LCodeGen BASE_EMBEDDED {
 | 
|  
 | 
|    void LoadHeapObject(Register result, Handle<HeapObject> object);
 | 
|  
 | 
| -  void RegisterLazyDeoptimization(LInstruction* instr);
 | 
| +  void RegisterLazyDeoptimization(LInstruction* instr,
 | 
| +                                  SafepointMode safepoint_mode);
 | 
| +
 | 
|    void RegisterEnvironmentForDeoptimization(LEnvironment* environment);
 | 
|    void DeoptimizeIf(Condition cc, LEnvironment* environment);
 | 
|  
 | 
| @@ -281,6 +311,26 @@ class LCodeGen BASE_EMBEDDED {
 | 
|    // Compiler from a set of parallel moves to a sequential list of moves.
 | 
|    LGapResolver resolver_;
 | 
|  
 | 
| +  bool safepoint_registers_pushed_;
 | 
| +
 | 
| +  class PushSafepointRegistersScope BASE_EMBEDDED {
 | 
| +   public:
 | 
| +    PushSafepointRegistersScope(LCodeGen* codegen) : codegen_(codegen) {
 | 
| +      ASSERT(!codegen_->safepoint_registers_pushed_);
 | 
| +      codegen_->safepoint_registers_pushed_ = true;
 | 
| +      codegen_->masm_->PushSafepointRegisters();
 | 
| +    }
 | 
| +
 | 
| +    ~PushSafepointRegistersScope() {
 | 
| +      ASSERT(codegen_->safepoint_registers_pushed_);
 | 
| +      codegen_->safepoint_registers_pushed_ = false;
 | 
| +      codegen_->masm_->PopSafepointRegisters();
 | 
| +    }
 | 
| +
 | 
| +   private:
 | 
| +    LCodeGen* codegen_;
 | 
| +  };
 | 
| +
 | 
|    friend class LDeferredCode;
 | 
|    friend class LEnvironment;
 | 
|    friend class SafepointGenerator;
 | 
| 
 |