lfunc.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. ** $Id: lfunc.c,v 1.30 2000/08/22 17:44:17 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) (sizeof(Closure) + (lint32)sizeof(TObject)*((n)-1))
  12. Closure *luaF_newclosure (lua_State *L, int nelems) {
  13. lint32 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->code = NULL;
  25. f->ncode = 0;
  26. f->lineinfo = NULL;
  27. f->nlineinfo = 0;
  28. f->lineDefined = 0;
  29. f->source = NULL;
  30. f->kstr = NULL;
  31. f->nkstr = 0;
  32. f->knum = NULL;
  33. f->nknum = 0;
  34. f->kproto = NULL;
  35. f->nkproto = 0;
  36. f->locvars = NULL;
  37. f->nlocvars = 0;
  38. f->next = L->rootproto;
  39. L->rootproto = f;
  40. f->marked = 0;
  41. return f;
  42. }
  43. static size_t protosize (Proto *f) {
  44. return sizeof(Proto)
  45. + f->nknum*sizeof(Number)
  46. + f->nkstr*sizeof(TString *)
  47. + f->nkproto*sizeof(Proto *)
  48. + f->ncode*sizeof(Instruction)
  49. + f->nlocvars*sizeof(struct LocVar)
  50. + f->nlineinfo*sizeof(int);
  51. }
  52. void luaF_protook (lua_State *L, Proto *f, int pc) {
  53. f->ncode = pc; /* signal that proto was properly created */
  54. L->nblocks += protosize(f);
  55. }
  56. void luaF_freeproto (lua_State *L, Proto *f) {
  57. if (f->ncode > 0) /* function was properly created? */
  58. L->nblocks -= protosize(f);
  59. luaM_free(L, f->code);
  60. luaM_free(L, f->locvars);
  61. luaM_free(L, f->kstr);
  62. luaM_free(L, f->knum);
  63. luaM_free(L, f->kproto);
  64. luaM_free(L, f->lineinfo);
  65. luaM_free(L, f);
  66. }
  67. void luaF_freeclosure (lua_State *L, Closure *c) {
  68. L->nblocks -= sizeclosure(c->nupvalues);
  69. luaM_free(L, c);
  70. }
  71. /*
  72. ** Look for n-th local variable at line `line' in function `func'.
  73. ** Returns NULL if not found.
  74. */
  75. const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
  76. int i;
  77. for (i = 0; i<f->nlocvars && f->locvars[i].startpc <= pc; i++) {
  78. if (pc < f->locvars[i].endpc) { /* is variable active? */
  79. local_number--;
  80. if (local_number == 0)
  81. return f->locvars[i].varname->str;
  82. }
  83. }
  84. return NULL; /* not found */
  85. }