Пример #1
0
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));
}
Пример #2
0
/**
 * 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 */