Restore the context pointer after returning from setjmp
authorLars Knoll <lars.knoll@digia.com>
Wed, 6 Feb 2013 12:15:10 +0000 (13:15 +0100)
committerErik Verbruggen <erik.verbruggen@digia.com>
Wed, 6 Feb 2013 15:05:46 +0000 (16:05 +0100)
Change-Id: I68682400c80cf9a8f28d11d8031681d6d92f590b
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/v4/moth/qv4isel_moth.cpp
src/v4/moth/qv4isel_moth_p.h
src/v4/moth/qv4vme_moth.cpp
src/v4/qv4codegen.cpp
src/v4/qv4isel_llvm.cpp
src/v4/qv4isel_llvm_p.h
src/v4/qv4isel_masm.cpp
src/v4/qv4isel_masm_p.h
src/v4/qv4isel_p.cpp
src/v4/qv4isel_p.h

index f31153a..2f0a614 100644 (file)
@@ -830,7 +830,7 @@ void InstructionSelection::callBuiltinThrow(IR::Temp *arg)
     addInstruction(call);
 }
 
-void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result)
+void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *)
 {
     Instruction::CallBuiltinCreateExceptionHandler call;
     call.result = getResultParam(result);
index 0b93ea8..7d57897 100644 (file)
@@ -43,7 +43,7 @@ protected:
     virtual void callBuiltinPostIncrementName(const QString &name, IR::Temp *result);
     virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
     virtual void callBuiltinThrow(IR::Temp *arg);
-    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
+    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp);
     virtual void callBuiltinDeleteExceptionHandler();
     virtual void callBuiltinGetException(IR::Temp *result);
     virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
index e9889fc..1cfaf64 100644 (file)
@@ -256,7 +256,9 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co
                                         , stackSize
 #endif
                                         );
+        VM::ExecutionContext *oldContext = context;
         int didThrow = setjmp(* static_cast<jmp_buf *>(buf));
+        context = oldContext;
         // Two ways to come here: after a create, or after a throw.
         if (didThrow)
             // At this point, the interpreter state can be anything but
index 241b3e8..0b62256 100644 (file)
@@ -2386,7 +2386,10 @@ bool Codegen::visit(TryStatement *ast)
     }
 
     int hasException = _block->newTemp();
-    move(_block->TEMP(hasException), _block->CALL(_block->NAME(IR::Name::builtin_create_exception_handler, 0, 0), 0));
+    int contextTemp = _block->newTemp();
+    IR::ExprList *createExceptionArgs = _function->New<IR::ExprList>();
+    createExceptionArgs->init(_block->TEMP(contextTemp));
+    move(_block->TEMP(hasException), _block->CALL(_block->NAME(IR::Name::builtin_create_exception_handler, 0, 0), createExceptionArgs));
 
     // Pass the hidden "inCatch" and "hasException" TEMPs to the
     // builtin_delete_exception_handler, in order to have those TEMPs alive for
index 0919368..1e98c02 100644 (file)
@@ -427,7 +427,7 @@ void InstructionSelection::callBuiltinThrow(IR::Temp *arg)
     Q_UNREACHABLE();
 }
 
-void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result)
+void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp)
 {
     // TODO
     assert(!"TODO!");
index 46fd2fe..ec5ace3 100644 (file)
@@ -88,7 +88,7 @@ public: // methods from InstructionSelection:
     virtual void callBuiltinPostIncrementName(const QString &name, IR::Temp *result);
     virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
     virtual void callBuiltinThrow(IR::Temp *arg);
-    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
+    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp);
     virtual void callBuiltinDeleteExceptionHandler();
     virtual void callBuiltinGetException(IR::Temp *result);
     virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
index c02f565..bde199d 100644 (file)
@@ -523,10 +523,13 @@ void InstructionSelection::callBuiltinThrow(IR::Temp *arg)
     generateFunctionCall(Assembler::Void, __qmljs_builtin_throw, arg, Assembler::ContextRegister);
 }
 
-void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result)
+void InstructionSelection::callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp)
 {
+    Address contextAddr = _asm->loadTempAddress(Assembler::ScratchRegister, contextTemp);
+    _asm->storePtr(Assembler::ContextRegister, contextAddr);
     generateFunctionCall(Assembler::ReturnValueRegister, __qmljs_create_exception_handler, Assembler::ContextRegister);
     generateFunctionCall(Assembler::ReturnValueRegister, setjmp, Assembler::ReturnValueRegister);
+    _asm->loadPtr(contextAddr, Assembler::ContextRegister);
     Address addr = _asm->loadTempAddress(Assembler::ScratchRegister, result);
     _asm->store32(Assembler::ReturnValueRegister, addr);
     addr.offset += 4;
index de0971f..c5cf2d8 100644 (file)
@@ -693,7 +693,7 @@ protected:
     virtual void callBuiltinPostIncrementName(const QString &name, IR::Temp *result);
     virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
     virtual void callBuiltinThrow(IR::Temp *arg);
-    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
+    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp);
     virtual void callBuiltinDeleteExceptionHandler();
     virtual void callBuiltinGetException(IR::Temp *result);
     virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
index 3e3b42c..05e7739 100644 (file)
@@ -307,9 +307,11 @@ void InstructionSelection::callBuiltin(IR::Call *call, IR::Temp *result)
         callBuiltinThrow(arg);
     } return;
 
-    case IR::Name::builtin_create_exception_handler:
-        callBuiltinCreateExceptionHandler(result);
+    case IR::Name::builtin_create_exception_handler: {
+        IR::Temp *arg = call->args->expr->asTemp();
+        callBuiltinCreateExceptionHandler(result, arg);
         return;
+    }
 
     case IR::Name::builtin_delete_exception_handler:
         callBuiltinDeleteExceptionHandler();
index d4f7052..d097f91 100644 (file)
@@ -99,7 +99,7 @@ public: // to implement by subclasses:
     virtual void callBuiltinPostIncrementName(const QString &name, IR::Temp *result) = 0;
     virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result) = 0;
     virtual void callBuiltinThrow(IR::Temp *arg) = 0;
-    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result) = 0;
+    virtual void callBuiltinCreateExceptionHandler(IR::Temp *result, IR::Temp *contextTemp) = 0;
     virtual void callBuiltinDeleteExceptionHandler() = 0;
     virtual void callBuiltinGetException(IR::Temp *result) = 0;
     virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result) = 0;