fallback.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. ** fallback.c
  3. ** TecCGraf - PUC-Rio
  4. */
  5. char *rcs_fallback="$Id: fallback.c,v 1.1 1994/11/07 15:20:56 roberto Exp roberto $";
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "fallback.h"
  9. #include "opcode.h"
  10. #include "lua.h"
  11. void luaI_errorFB (void)
  12. {
  13. lua_Object o = lua_getparam(1);
  14. if (lua_isstring(o))
  15. fprintf (stderr, "lua: %s\n", lua_getstring(o));
  16. else
  17. fprintf(stderr, "lua: unknown error\n");
  18. }
  19. void luaI_indexFB (void)
  20. {
  21. lua_pushnil();
  22. }
  23. void luaI_gettableFB (void)
  24. {
  25. lua_error("indexed expression not a table");
  26. }
  27. void luaI_arithFB (void)
  28. {
  29. lua_error("unexpected type at conversion to number");
  30. }
  31. void luaI_concatFB (void)
  32. {
  33. lua_error("unexpected type at conversion to string");
  34. }
  35. void luaI_orderFB (void)
  36. {
  37. lua_error("unexpected type at comparison");
  38. }
  39. /*
  40. ** Lock routines
  41. */
  42. static Object *lockArray = NULL;
  43. static int lockSize = 0;
  44. int lua_lock (lua_Object object)
  45. {
  46. int i;
  47. int oldSize;
  48. if (lua_isnil(object))
  49. return -1;
  50. for (i=0; i<lockSize; i++)
  51. if (tag(&lockArray[i]) == LUA_T_NIL)
  52. {
  53. lockArray[i] = *luaI_Address(object);
  54. return i;
  55. }
  56. /* no more empty spaces */
  57. oldSize = lockSize;
  58. if (lockArray == NULL)
  59. {
  60. lockSize = 10;
  61. lockArray = (Object *)malloc(lockSize);
  62. }
  63. else
  64. {
  65. lockSize = 3*oldSize/2 + 5;
  66. lockArray = (Object *)realloc(lockArray, lockSize);
  67. }
  68. if (lockArray == NULL)
  69. {
  70. lockSize = 0;
  71. lua_error("lock - not enough memory");
  72. }
  73. for (i=oldSize; i<lockSize; i++)
  74. tag(&lockArray[i]) = LUA_T_NIL;
  75. lockArray[oldSize] = *luaI_Address(object);
  76. return oldSize;
  77. }
  78. void lua_unlock (int ref)
  79. {
  80. tag(&lockArray[ref]) = LUA_T_NIL;
  81. }
  82. Object *luaI_getlocked (int ref)
  83. {
  84. return &lockArray[ref];
  85. }
  86. void luaI_travlock (void (*fn)(Object *))
  87. {
  88. int i;
  89. for (i=0; i<lockSize; i++)
  90. fn(&lockArray[i]);
  91. }