예제 #1
0
파일: ldebug.c 프로젝트: crazii/mameplus
LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
	int status;
	Closure *cl;
	CallInfo *ci;
	StkId func;
	lua_lock(L);
	if (*what == '>') {
	ci = NULL;
	func = L->top - 1;
	api_check(L, ttisfunction(func), "function expected");
	what++;  /* skip the '>' */
	L->top--;  /* pop function */
	}
	else {
	ci = ar->i_ci;
	func = ci->func;
	lua_assert(ttisfunction(ci->func));
	}
	cl = ttisclosure(func) ? clvalue(func) : NULL;
	status = auxgetinfo(L, what, ar, cl, ci);
	if (strchr(what, 'f')) {
	setobjs2s(L, L->top, func);
	api_incr_top(L);
	}
	if (strchr(what, 'L'))
	collectvalidlines(L, cl);
	lua_unlock(L);
	return status;
}
예제 #2
0
LUA_API int lua_getinfo(lua_State* L, const char* what, lua_Debug* ar)
{
	int status;
	Closure* f = NULL;
	CallInfo* ci = NULL;
	lua_lock(L);
	if (*what == '>')
	{
		StkId func = L->top - 1;
		luai_apicheck(L, ttisfunction(func));
		what++;  /* skip the '>' */
		f = clvalue(func);
		L->top--;  /* pop function */
	}
	else if (ar->i_ci != 0)    /* no tail call? */
	{
		ci = L->base_ci + ar->i_ci;
		lua_assert(ttisfunction(ci->func));
		f = clvalue(ci->func);
	}
	status = auxgetinfo(L, what, ar, f, ci);
	if (strchr(what, 'f'))
	{
		if (f == NULL) setnilvalue(L->top);
		else setclvalue(L, L->top, f);
		incr_top(L);
	}
	if (strchr(what, 'L'))
		collectvalidlines(L, f);
	lua_unlock(L);
	return status;
}
예제 #3
0
파일: ldebug.c 프로젝트: gitrider/wxsj2
LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
  int status = 1;
  lua_lock(L);
  if (*what == '>') {
    StkId f = L->top - 1;
    if (!ttisfunction(f))
      luaG_runerror(L, "value for `lua_getinfo' is not a function");
    status = auxgetinfo(L, what + 1, ar, f, NULL);
    L->top--;  /* pop function */
  }
  else if (ar->i_ci != 0) {  /* no tail call? */
    CallInfo *ci = L->base_ci + ar->i_ci;
    lua_assert(ttisfunction(ci->base - 1));
    status = auxgetinfo(L, what, ar, ci->base - 1, ci);
  }
  else
    info_tailcall(L, ar);
  if (strchr(what, 'f')) incr_top(L);
  lua_unlock(L);
  return status;
}
예제 #4
0
LUA_API int ICACHE_FLASH_ATTR lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
  int status;
  Closure *f = NULL;
  CallInfo *ci = NULL;
  void *plight = NULL;
  lua_lock(L);
  if (*what == '>') {
    StkId func = L->top - 1;
    luai_apicheck(L, ttisfunction(func) || ttislightfunction(func));
    what++;  /* skip the '>' */
    if (ttisfunction(func))
      f = clvalue(func);
    else
      plight = fvalue(func);
    L->top--;  /* pop function */
  }
  else if (ar->i_ci != 0) {  /* no tail call? */
    ci = L->base_ci + ar->i_ci;
    lua_assert(ttisfunction(ci->func) || ttislightfunction(ci->func));
    if (ttisfunction(ci->func))
      f = clvalue(ci->func);
    else
      plight = fvalue(ci->func);
  }
  status = auxgetinfo(L, what, ar, f, plight, ci);
  if (c_strchr(what, 'f')) {
    if (f != NULL) 
      setclvalue(L, L->top, f)
    else if (plight != NULL)
      setfvalue(L->top, plight)
    else
      setnilvalue(L->top);
    incr_top(L);
  }
  if (c_strchr(what, 'L'))
    collectvalidlines(L, f);
  lua_unlock(L);
  return status;
}
예제 #5
0
파일: ldebug.cpp 프로젝트: aappleby/Lumina
int lua_getinfo (LuaThread *L, const char *what, LuaDebug *ar) {
  THREAD_CHECK(L);
  int status;
  LuaClosure *cl;
  LuaStackFrame *ci;
  StkId func;
  if (*what == '>') {
    ci = NULL;
    func = L->stack_.top_ - 1;
    api_check(func->isFunction(), "function expected");
    what++;  /* skip the '>' */
    L->stack_.pop();  /* pop function */
  }
  else {
    ci = ar->i_ci;
    func = ci->getFunc();
    assert(ci->getFunc()->isFunction());
  }
  cl = NULL;

  if(func->isCClosure()) cl = func->getCClosure();
  if(func->isLClosure()) cl = func->getLClosure();

  status = auxgetinfo(L, what, ar, cl, ci);
  
  LuaResult result = LUA_OK;
  if (strchr(what, 'f')) {
    result = L->stack_.push_reserve2(*func);
  }
  handleResult(result);

  if (strchr(what, 'L')) {
    collectvalidlines(L, cl);
  }

  return status;
}