| 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; | 
|  |