lfunc.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. ** $Id: lfunc.c,v 1.33 2000/10/18 17:19:09 roberto Exp roberto $
  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. }