lglobal.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. ** $Id: $
  3. ** Global variables
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdlib.h>
  7. #include "lbuiltin.h"
  8. #include "lglobal.h"
  9. #include "lmem.h"
  10. #include "lobject.h"
  11. #include "lstring.h"
  12. Symbol *luaG_global = NULL;
  13. int luaG_nglobal = 0;
  14. static int maxglobal = 0;
  15. Word luaG_findsymbol (TaggedString *t)
  16. {
  17. if (maxglobal == 0) { /* first time? */
  18. maxglobal = 50;
  19. luaG_global = luaM_newvector(maxglobal, Symbol);
  20. luaB_predefine();
  21. }
  22. if (t->u.s.varindex == NOT_USED) {
  23. if (!t->marked) t->marked = 2; /* avoid GC of global variable names */
  24. if (luaG_nglobal >= maxglobal)
  25. maxglobal = luaM_growvector(&luaG_global, maxglobal, Symbol,
  26. symbolEM, MAX_WORD);
  27. t->u.s.varindex = luaG_nglobal;
  28. luaG_global[luaG_nglobal].varname = t;
  29. s_ttype(luaG_nglobal) = LUA_T_NIL;
  30. luaG_nglobal++;
  31. }
  32. return t->u.s.varindex;
  33. }
  34. Word luaG_findsymbolbyname (char *name)
  35. {
  36. return luaG_findsymbol(luaS_new(name));
  37. }
  38. int luaG_globaldefined (char *name)
  39. {
  40. return s_ttype(luaG_findsymbolbyname(name)) != LUA_T_NIL;
  41. }
  42. int luaG_nextvar (Word next)
  43. {
  44. while (next < luaG_nglobal && s_ttype(next) == LUA_T_NIL)
  45. next++;
  46. return (next < luaG_nglobal ? next : -1);
  47. }
  48. char *luaG_travsymbol (int (*fn)(TObject *))
  49. {
  50. int i;
  51. for (i=0; i<luaG_nglobal; i++)
  52. if (fn(&s_object(i)))
  53. return luaG_global[i].varname->str;
  54. return NULL;
  55. }