X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FInterpreter.c;h=96ba3b890832b8aa8b75336439751187b84e55b6;hb=073ba748a8463265ce902d438b9d3604fd5b3fa8;hp=3fc838810534c51ac19da57a8217cbb4b47d360a;hpb=b3f530814c15886a7a010ed871bb1f054a3918b3;p=ghc-hetmet.git diff --git a/ghc/rts/Interpreter.c b/ghc/rts/Interpreter.c index 3fc8388..96ba3b8 100644 --- a/ghc/rts/Interpreter.c +++ b/ghc/rts/Interpreter.c @@ -926,7 +926,7 @@ run_BCO: case bci_ALLOC_AP: { StgAP* ap; - int n_payload = BCO_NEXT - 1; + int n_payload = BCO_NEXT; int request = PAP_sizeW(n_payload); ap = (StgAP*)allocate_UPD(request); Sp[-1] = (W_)ap; @@ -939,7 +939,7 @@ run_BCO: case bci_ALLOC_PAP: { StgPAP* pap; int arity = BCO_NEXT; - int n_payload = BCO_NEXT - 1; + int n_payload = BCO_NEXT; int request = PAP_sizeW(n_payload); pap = (StgPAP*)allocate_NONUPD(request); Sp[-1] = (W_)pap; @@ -953,7 +953,7 @@ run_BCO: case bci_MKAP: { int i; int stkoff = BCO_NEXT; - int n_payload = BCO_NEXT - 1; + int n_payload = BCO_NEXT; StgAP* ap = (StgAP*)Sp[stkoff]; ASSERT((int)ap->n_args == n_payload); ap->fun = (StgClosure*)Sp[0]; @@ -1157,6 +1157,9 @@ run_BCO: int stk_offset = BCO_NEXT; int o_itbl = BCO_NEXT; void(*marshall_fn)(void*) = (void (*)(void*))BCO_LIT(o_itbl); + int ret_dyn_size = + RET_DYN_BITMAP_SIZE + RET_DYN_NONPTR_REGS_SIZE + + sizeofW(StgRetDyn); #ifdef RTS_SUPPORTS_THREADS // Threaded RTS: @@ -1168,7 +1171,7 @@ run_BCO: memcpy(arguments, Sp, sizeof(W_) * stk_offset); #endif - + // There are a bunch of non-ptr words on the stack (the // ccall args, the ccall fun address and space for the // result), which we need to cover with an info table @@ -1179,7 +1182,7 @@ run_BCO: // CCALL instruction. So we build a RET_DYN stack frame // on the stack frame to describe this chunk of stack. // - Sp -= RET_DYN_SIZE + sizeofW(StgRetDyn); + Sp -= ret_dyn_size; ((StgRetDyn *)Sp)->liveness = ALL_NON_PTRS | N_NONPTRS(stk_offset); ((StgRetDyn *)Sp)->info = (StgInfoTable *)&stg_gc_gen_info; @@ -1192,7 +1195,7 @@ run_BCO: // around (stack squeezing), so we have to grab the real // Sp out of the TSO to find the ccall args again. - marshall_fn ( (void*)(cap->r.rCurrentTSO->sp + RET_DYN_SIZE + sizeofW(StgRetDyn)) ); + marshall_fn ( (void*)(cap->r.rCurrentTSO->sp + ret_dyn_size) ); #else // Threaded RTS: // We already made a malloced copy of the arguments above. @@ -1203,8 +1206,7 @@ run_BCO: // And restart the thread again, popping the RET_DYN frame. cap = (Capability *)((void *)resumeThread(tok,rtsFalse) - sizeof(StgFunTable)); LOAD_STACK_POINTERS; - Sp += RET_DYN_SIZE + sizeofW(StgRetDyn); - + Sp += ret_dyn_size; #ifdef RTS_SUPPORTS_THREADS // Threaded RTS: