1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh
* Jagannathan, and Stephen Weeks.
*
* MLton is released under a BSD-style license.
* See the file MLton-LICENSE for details.
*/
#ifndef _BYTECODE_MAIN_H_
#define _BYTECODE_MAIN_H_
#include "main.h"
#include "interpret.h"
#ifndef DEBUG_CODEGEN
#define DEBUG_CODEGEN FALSE
#endif
struct Bytecode MLton_bytecode;
static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) {
return *((GC_frameIndex*)(MLton_bytecode.code + ra - sizeof(GC_frameIndex)));
}
#define Main(al, mg, mfs, mmc, pk, ps, ml) \
void MLton_callFromC () { \
uintptr_t nextFun; \
GC_state s; \
\
if (DEBUG_CODEGEN) \
fprintf (stderr, "MLton_callFromC() starting\n"); \
s = &gcState; \
s->savedThread = s->currentThread; \
s->atomicState += 3; \
/* Switch to the C Handler thread. */ \
GC_switchToThread (s, s->callFromCHandlerThread, 0); \
nextFun = *(uintptr_t*)(s->stackTop - GC_RETURNADDRESS_SIZE); \
MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \
GC_switchToThread (s, s->savedThread, 0); \
s->savedThread = BOGUS_OBJPTR; \
if (DEBUG_CODEGEN) \
fprintf (stderr, "MLton_callFromC done\n"); \
} \
int main (int argc, char **argv) { \
uintptr_t nextFun; \
Initialize (al, mg, mfs, mmc, pk, ps); \
if (gcState.amOriginal) { \
real_Init(); \
nextFun = ml; \
} else { \
/* Return to the saved world */ \
nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
} \
MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \
}
#endif /* #ifndef _BYTECODE_MAIN_H */
|