aboutsummaryrefslogtreecommitdiff
path: root/fallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fallback.c')
-rw-r--r--fallback.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/fallback.c b/fallback.c
index 023d11c3..68d052b3 100644
--- a/fallback.c
+++ b/fallback.c
@@ -3,11 +3,13 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_fallback="$Id: $"; 6char *rcs_fallback="$Id: fallback.c,v 1.1 1994/11/07 15:20:56 roberto Exp roberto $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <stdlib.h>
9 10
10#include "fallback.h" 11#include "fallback.h"
12#include "opcode.h"
11#include "lua.h" 13#include "lua.h"
12 14
13 15
@@ -49,3 +51,66 @@ void luaI_orderFB (void)
49 lua_error("unexpected type at comparison"); 51 lua_error("unexpected type at comparison");
50} 52}
51 53
54
55/*
56** Lock routines
57*/
58
59static Object *lockArray = NULL;
60static int lockSize = 0;
61
62int lua_lock (lua_Object object)
63{
64 int i;
65 int oldSize;
66 if (lua_isnil(object))
67 return -1;
68 for (i=0; i<lockSize; i++)
69 if (tag(&lockArray[i]) == LUA_T_NIL)
70 {
71 lockArray[i] = *luaI_Address(object);
72 return i;
73 }
74 /* no more empty spaces */
75 oldSize = lockSize;
76 if (lockArray == NULL)
77 {
78 lockSize = 10;
79 lockArray = (Object *)malloc(lockSize);
80 }
81 else
82 {
83 lockSize = 3*oldSize/2 + 5;
84 lockArray = (Object *)realloc(lockArray, lockSize);
85 }
86 if (lockArray == NULL)
87 {
88 lockSize = 0;
89 lua_error("lock - not enough memory");
90 }
91 for (i=oldSize; i<lockSize; i++)
92 tag(&lockArray[i]) = LUA_T_NIL;
93 lockArray[oldSize] = *luaI_Address(object);
94 return oldSize;
95}
96
97
98void lua_unlock (int ref)
99{
100 tag(&lockArray[ref]) = LUA_T_NIL;
101}
102
103
104Object *luaI_getlocked (int ref)
105{
106 return &lockArray[ref];
107}
108
109
110void luaI_travlock (void (*fn)(Object *))
111{
112 int i;
113 for (i=0; i<lockSize; i++)
114 fn(&lockArray[i]);
115}
116