DLLEXPORT int julia_trampoline(int argc, char **argv, int (*pmain)(int ac,char *av[])) { #if defined(_WIN32) //&& !defined(_WIN64) SetUnhandledExceptionFilter(exception_handler); #endif unsigned char * p = (unsigned char *) &__stack_chk_guard; char a = p[sizeof(__stack_chk_guard)-1]; char b = p[sizeof(__stack_chk_guard)-2]; char c = p[0]; /* If you have the ability to generate random numbers in your kernel then use them */ p[sizeof(__stack_chk_guard)-1] = 255; p[sizeof(__stack_chk_guard)-2] = '\n'; p[0] = 0; #ifdef COPY_STACKS // initialize base context of root task jl_root_task->stackbase = (char*)&argc; if (jl_setjmp(jl_root_task->base_ctx, 0)) { jl_switch_stack(jl_current_task, jl_jmp_target); } #endif int ret = pmain(argc, argv); p[sizeof(__stack_chk_guard)-1] = a; p[sizeof(__stack_chk_guard)-2] = b; p[0] = c; return ret; }
DLLEXPORT int julia_trampoline(int argc, char *argv[], int (*pmain)(int ac,char *av[])) { #ifdef COPY_STACKS // initialize base context of root task jl_root_task->stackbase = (char*)&argc; if (jl_setjmp(jl_root_task->base_ctx, 1)) { jl_switch_stack(jl_current_task, jl_jmp_target); } #endif return pmain(argc, argv); }
DLLEXPORT void *jl_eval_string(char *str) { #ifdef COPY_STACKS jl_root_task->stackbase = (char*)&str; if (jl_setjmp(jl_root_task->base_ctx, 1)) { jl_switch_stack(jl_current_task, jl_jmp_target); } #endif jl_value_t *r; JL_TRY { jl_value_t *ast = jl_parse_input_line(str); JL_GC_PUSH1(&ast); r = jl_toplevel_eval(ast); JL_GC_POP(); } JL_CATCH { //jl_show(jl_stderr_obj(), jl_exception_in_transit); r = NULL; } return r; }