static u32 lua_co_create(LSTATE) { lclosure_t *function = lstate_getfunction(0); if (function->type != LUAF_LUA) { err_str(0, "Lua function expected"); } lthread_t *thread = gc_alloc(sizeof(lthread_t), LTHREAD); thread->status = CO_NEVER_RUN; thread->stack = mmap(NULL, CO_STACK_SIZE, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE, -1, 0); xassert(thread->stack != MAP_FAILED); thread->caller = NULL; thread->closure = function; thread->frame = NULL; thread->env = cur_thread->env; thread->argvi = 0; thread->argc = 0; vm_stack_init(&thread->vm_stack, 20); size_t *stack = (size_t*) ((size_t) thread->stack + CO_STACK_SIZE); /* Bogus return address, and then actual address to return to */ size_t spaces = CALLEE_REGS + 2; memset(stack - spaces, 0, sizeof(size_t) * spaces); *(stack - 1) = 0; *(stack - 2) = (size_t) coroutine_wrapper; thread->curstack = stack - spaces; lstate_return1(lv_thread(thread)); }
/** * Initialize interpreter. */ void vm_init (const vm_instr_t *program_p, /**< pointer to byte-code program */ bool dump_mem_stats) /** dump per-instruction memory usage change statistics */ { #ifdef MEM_STATS interp_mem_stats_enabled = dump_mem_stats; #else /* MEM_STATS */ JERRY_ASSERT (!dump_mem_stats); #endif /* !MEM_STATS */ JERRY_ASSERT (__program == NULL); vm_stack_init (); __program = program_p; } /* vm_init */