⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lapi.c

📁 lua的即时编译器。支持lua 5.1.2版本
💻 C
📖 第 1 页 / 共 2 页
字号:
  TValue key;  lua_lock(L);  t = index2adr(L, idx);  api_checkvalidindex(L, t);  setsvalue(L, &key, luaS_new(L, k));  luaV_gettable(L, t, &key, L->top);  api_incr_top(L);  lua_unlock(L);}LUA_API void lua_rawget (lua_State *L, int idx) {  StkId t;  lua_lock(L);  t = index2adr(L, idx);  api_check(L, ttistable(t));  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));  lua_unlock(L);}LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {  StkId o;  lua_lock(L);  o = index2adr(L, idx);  api_check(L, ttistable(o));  setobj2s(L, L->top, luaH_getnum(hvalue(o), n));  api_incr_top(L);  lua_unlock(L);}LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {  lua_lock(L);  luaC_checkGC(L);  sethvalue(L, L->top, luaH_new(L, narray, nrec));  api_incr_top(L);  lua_unlock(L);}LUA_API int lua_getmetatable (lua_State *L, int objindex) {  const TValue *obj;  Table *mt = NULL;  int res;  lua_lock(L);  obj = index2adr(L, objindex);  switch (ttype(obj)) {    case LUA_TTABLE:      mt = hvalue(obj)->metatable;      break;    case LUA_TUSERDATA:      mt = uvalue(obj)->metatable;      break;    default:      mt = G(L)->mt[ttype(obj)];      break;  }  if (mt == NULL)    res = 0;  else {    sethvalue(L, L->top, mt);    api_incr_top(L);    res = 1;  }  lua_unlock(L);  return res;}LUA_API void lua_getfenv (lua_State *L, int idx) {  StkId o;  lua_lock(L);  o = index2adr(L, idx);  api_checkvalidindex(L, o);  switch (ttype(o)) {    case LUA_TFUNCTION:      sethvalue(L, L->top, clvalue(o)->c.env);      break;    case LUA_TUSERDATA:      sethvalue(L, L->top, uvalue(o)->env);      break;    case LUA_TTHREAD:      setobj2s(L, L->top,  gt(thvalue(o)));      break;    default:      setnilvalue(L->top);      break;  }  api_incr_top(L);  lua_unlock(L);}/*** set functions (stack -> Lua)*/LUA_API void lua_settable (lua_State *L, int idx) {  StkId t;  lua_lock(L);  api_checknelems(L, 2);  t = index2adr(L, idx);  api_checkvalidindex(L, t);  luaV_settable(L, t, L->top - 2, L->top - 1);  L->top -= 2;  /* pop index and value */  lua_unlock(L);}LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {  StkId t;  TValue key;  lua_lock(L);  api_checknelems(L, 1);  t = index2adr(L, idx);  api_checkvalidindex(L, t);  setsvalue(L, &key, luaS_new(L, k));  luaV_settable(L, t, &key, L->top - 1);  L->top--;  /* pop value */  lua_unlock(L);}LUA_API void lua_rawset (lua_State *L, int idx) {  StkId t;  lua_lock(L);  api_checknelems(L, 2);  t = index2adr(L, idx);  api_check(L, ttistable(t));  setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);  luaC_barriert(L, hvalue(t), L->top-1);  L->top -= 2;  lua_unlock(L);}LUA_API void lua_rawseti (lua_State *L, int idx, int n) {  StkId o;  lua_lock(L);  api_checknelems(L, 1);  o = index2adr(L, idx);  api_check(L, ttistable(o));  setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);  luaC_barriert(L, hvalue(o), L->top-1);  L->top--;  lua_unlock(L);}LUA_API int lua_setmetatable (lua_State *L, int objindex) {  TValue *obj;  Table *mt;  lua_lock(L);  api_checknelems(L, 1);  obj = index2adr(L, objindex);  api_checkvalidindex(L, obj);  if (ttisnil(L->top - 1))    mt = NULL;  else {    api_check(L, ttistable(L->top - 1));    mt = hvalue(L->top - 1);  }  switch (ttype(obj)) {    case LUA_TTABLE: {      hvalue(obj)->metatable = mt;      if (mt)        luaC_objbarriert(L, hvalue(obj), mt);      break;    }    case LUA_TUSERDATA: {      uvalue(obj)->metatable = mt;      if (mt)        luaC_objbarrier(L, rawuvalue(obj), mt);      break;    }    default: {      G(L)->mt[ttype(obj)] = mt;      break;    }  }  L->top--;  lua_unlock(L);  return 1;}LUA_API int lua_setfenv (lua_State *L, int idx) {  StkId o;  int res = 1;  lua_lock(L);  api_checknelems(L, 1);  o = index2adr(L, idx);  api_checkvalidindex(L, o);  api_check(L, ttistable(L->top - 1));  switch (ttype(o)) {    case LUA_TFUNCTION:      clvalue(o)->c.env = hvalue(L->top - 1);      break;    case LUA_TUSERDATA:      uvalue(o)->env = hvalue(L->top - 1);      break;    case LUA_TTHREAD:      sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1));      break;    default:      res = 0;      break;  }  luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));  L->top--;  lua_unlock(L);  return res;}/*** `load' and `call' functions (run Lua code)*/#define adjustresults(L,nres) \    { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }#define checkresults(L,na,nr) \     api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)))	LUA_API void lua_call (lua_State *L, int nargs, int nresults) {  StkId func;  lua_lock(L);  api_checknelems(L, nargs+1);  checkresults(L, nargs, nresults);  func = L->top - (nargs+1);  luaD_call(L, func, nresults);  adjustresults(L, nresults);  lua_unlock(L);}/*** Execute a protected call.*/struct CallS {  /* data to `f_call' */  StkId func;  int nresults;};static void f_call (lua_State *L, void *ud) {  struct CallS *c = cast(struct CallS *, ud);  luaD_call(L, c->func, c->nresults);}LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) {  struct CallS c;  int status;  ptrdiff_t func;  lua_lock(L);  api_checknelems(L, nargs+1);  checkresults(L, nargs, nresults);  if (errfunc == 0)    func = 0;  else {    StkId o = index2adr(L, errfunc);    api_checkvalidindex(L, o);    func = savestack(L, o);  }  c.func = L->top - (nargs+1);  /* function to be called */  c.nresults = nresults;  status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);  adjustresults(L, nresults);  lua_unlock(L);  return status;}/*** Execute a protected C call.*/struct CCallS {  /* data to `f_Ccall' */  lua_CFunction func;  void *ud;};static void f_Ccall (lua_State *L, void *ud) {  struct CCallS *c = cast(struct CCallS *, ud);  Closure *cl;  cl = luaF_newCclosure(L, 0, getcurrenv(L));  cl->c.f = c->func;  setclvalue(L, L->top, cl);  /* push function */  api_incr_top(L);  setpvalue(L->top, c->ud);  /* push only argument */  api_incr_top(L);  luaD_call(L, L->top - 2, 0);}LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {  struct CCallS c;  int status;  lua_lock(L);  c.func = func;  c.ud = ud;  status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0);  lua_unlock(L);  return status;}LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,                      const char *chunkname) {  ZIO z;  int status;  lua_lock(L);  if (!chunkname) chunkname = "?";  luaZ_init(L, &z, reader, data);  status = luaD_protectedparser(L, &z, chunkname);  lua_unlock(L);  return status;}LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {  int status;  TValue *o;  lua_lock(L);  api_checknelems(L, 1);  o = L->top - 1;  if (isLfunction(o))    status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0);  else    status = 1;  lua_unlock(L);  return status;}LUA_API int  lua_status (lua_State *L) {  return L->status;}/*** Garbage-collection function*/LUA_API int lua_gc (lua_State *L, int what, int data) {  int res = 0;  global_State *g;  lua_lock(L);  g = G(L);  switch (what) {    case LUA_GCSTOP: {      g->GCthreshold = MAX_LUMEM;      break;    }    case LUA_GCRESTART: {      g->GCthreshold = g->totalbytes;      break;    }    case LUA_GCCOLLECT: {      luaC_fullgc(L);      break;    }    case LUA_GCCOUNT: {      /* GC values are expressed in Kbytes: #bytes/2^10 */      res = cast_int(g->totalbytes >> 10);      break;    }    case LUA_GCCOUNTB: {      res = cast_int(g->totalbytes & 0x3ff);      break;    }    case LUA_GCSTEP: {      lu_mem a = (cast(lu_mem, data) << 10);      if (a <= g->totalbytes)        g->GCthreshold = g->totalbytes - a;      else        g->GCthreshold = 0;      while (g->GCthreshold <= g->totalbytes)        luaC_step(L);      if (g->gcstate == GCSpause)  /* end of cycle? */        res = 1;  /* signal it */      break;    }    case LUA_GCSETPAUSE: {      res = g->gcpause;      g->gcpause = data;      break;    }    case LUA_GCSETSTEPMUL: {      res = g->gcstepmul;      g->gcstepmul = data;      break;    }    default: res = -1;  /* invalid option */  }  lua_unlock(L);  return res;}/*** miscellaneous functions*/LUA_API int lua_error (lua_State *L) {  lua_lock(L);  api_checknelems(L, 1);  luaG_errormsg(L);  lua_unlock(L);  return 0;  /* to avoid warnings */}LUA_API int lua_next (lua_State *L, int idx) {  StkId t;  int more;  lua_lock(L);  t = index2adr(L, idx);  api_check(L, ttistable(t));  more = luaH_next(L, hvalue(t), L->top - 1);  if (more) {    api_incr_top(L);  }  else  /* no more elements */    L->top -= 1;  /* remove key */  lua_unlock(L);  return more;}LUA_API void lua_concat (lua_State *L, int n) {  lua_lock(L);  api_checknelems(L, n);  if (n >= 2) {    luaC_checkGC(L);    luaV_concat(L, n, cast_int(L->top - L->base) - 1);    L->top -= (n-1);  }  else if (n == 0) {  /* push empty string */    setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));    api_incr_top(L);  }  /* else n == 1; nothing to do */  lua_unlock(L);}LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {  lua_Alloc f;  lua_lock(L);  if (ud) *ud = G(L)->ud;  f = G(L)->frealloc;  lua_unlock(L);  return f;}LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {  lua_lock(L);  G(L)->ud = ud;  G(L)->frealloc = f;  lua_unlock(L);}LUA_API void *lua_newuserdata (lua_State *L, size_t size) {  Udata *u;  lua_lock(L);  luaC_checkGC(L);  u = luaS_newudata(L, size, getcurrenv(L));  setuvalue(L, L->top, u);  api_incr_top(L);  lua_unlock(L);  return u + 1;}static const char *aux_upvalue (StkId fi, int n, TValue **val) {  Closure *f;  if (!ttisfunction(fi)) return NULL;  f = clvalue(fi);  if (f->c.isC) {    if (!(1 <= n && n <= f->c.nupvalues)) return NULL;    *val = &f->c.upvalue[n-1];    return "";  }  else {    Proto *p = f->l.p;    if (!(1 <= n && n <= p->sizeupvalues)) return NULL;    *val = f->l.upvals[n-1]->v;    return getstr(p->upvalues[n-1]);  }}LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {  const char *name;  TValue *val;  lua_lock(L);  name = aux_upvalue(index2adr(L, funcindex), n, &val);  if (name) {    setobj2s(L, L->top, val);    api_incr_top(L);  }  lua_unlock(L);  return name;}LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {  const char *name;  TValue *val;  StkId fi;  lua_lock(L);  fi = index2adr(L, funcindex);  api_checknelems(L, 1);  name = aux_upvalue(fi, n, &val);  if (name) {    L->top--;    setobj(L, val, L->top);    luaC_barrier(L, clvalue(fi), L->top);  }  lua_unlock(L);  return name;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -