lfunc.c
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*
  2. ** $Id: lfunc.c,v 1.34 2000/10/30 12:20:29 roberto Exp $
  3. ** Auxiliary functions to manipulate prototypes and closures
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdlib.h>
  7. #include "lua.h"
  8. #include "lfunc.h"
  9. #include "lmem.h"
  10. #include "lstate.h"
  11. #define sizeclosure(n) ((int)sizeof(Closure) + (int)sizeof(TObject)*((n)-1))
  12. Closure *luaF_newclosure (lua_State *L, int nelems) {
  13.   int size = sizeclosure(nelems);
  14.   Closure *c = (Closure *)luaM_malloc(L, size);
  15.   c->next = L->rootcl;
  16.   L->rootcl = c;
  17.   c->mark = c;
  18.   c->nupvalues = nelems;
  19.   L->nblocks += size;
  20.   return c;
  21. }
  22. Proto *luaF_newproto (lua_State *L) {
  23.   Proto *f = luaM_new(L, Proto);
  24.   f->knum = NULL;
  25.   f->nknum = 0;
  26.   f->kstr = NULL;
  27.   f->nkstr = 0;
  28.   f->kproto = NULL;
  29.   f->nkproto = 0;
  30.   f->code = NULL;
  31.   f->ncode = 0;
  32.   f->numparams = 0;
  33.   f->is_vararg = 0;
  34.   f->maxstacksize = 0;
  35.   f->marked = 0;
  36.   f->lineinfo = NULL;
  37.   f->nlineinfo = 0;
  38.   f->nlocvars = 0;
  39.   f->locvars = NULL;
  40.   f->lineDefined = 0;
  41.   f->source = NULL;
  42.   f->next = L->rootproto;  /* chain in list of protos */
  43.   L->rootproto = f;
  44.   return f;
  45. }
  46. static size_t protosize (Proto *f) {
  47.   return sizeof(Proto)
  48.        + f->nknum*sizeof(Number)
  49.        + f->nkstr*sizeof(TString *)
  50.        + f->nkproto*sizeof(Proto *)
  51.        + f->ncode*sizeof(Instruction)
  52.        + f->nlocvars*sizeof(struct LocVar)
  53.        + f->nlineinfo*sizeof(int);
  54. }
  55. void luaF_protook (lua_State *L, Proto *f, int pc) {
  56.   f->ncode = pc;  /* signal that proto was properly created */
  57.   L->nblocks += protosize(f);
  58. }
  59. void luaF_freeproto (lua_State *L, Proto *f) {
  60.   if (f->ncode > 0)  /* function was properly created? */
  61.     L->nblocks -= protosize(f);
  62.   luaM_free(L, f->code);
  63.   luaM_free(L, f->locvars);
  64.   luaM_free(L, f->kstr);
  65.   luaM_free(L, f->knum);
  66.   luaM_free(L, f->kproto);
  67.   luaM_free(L, f->lineinfo);
  68.   luaM_free(L, f);
  69. }
  70. void luaF_freeclosure (lua_State *L, Closure *c) {
  71.   L->nblocks -= sizeclosure(c->nupvalues);
  72.   luaM_free(L, c);
  73. }
  74. /*
  75. ** Look for n-th local variable at line `line' in function `func'.
  76. ** Returns NULL if not found.
  77. */
  78. const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
  79.   int i;
  80.   for (i = 0; i<f->nlocvars && f->locvars[i].startpc <= pc; i++) {
  81.     if (pc < f->locvars[i].endpc) {  /* is variable active? */
  82.       local_number--;
  83.       if (local_number == 0)
  84.         return f->locvars[i].varname->str;
  85.     }
  86.   }
  87.   return NULL;  /* not found */
  88. }