diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-26 12:02:26 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-26 12:02:26 -0300 |
| commit | a580480b07cdf7201306b246deeb2fe84f2c25a9 (patch) | |
| tree | 30e9d4798228156eea5be2589834f1ff2db4355e /lbuiltin.c | |
| parent | 0dd6d1080e7f58eb17cb8a2ad3fc5801ed7c0532 (diff) | |
| download | lua-a580480b07cdf7201306b246deeb2fe84f2c25a9.tar.gz lua-a580480b07cdf7201306b246deeb2fe84f2c25a9.tar.bz2 lua-a580480b07cdf7201306b246deeb2fe84f2c25a9.zip | |
new implementation for globals: Global value is stored in TaggedString
Diffstat (limited to 'lbuiltin.c')
| -rw-r--r-- | lbuiltin.c | 76 |
1 files changed, 40 insertions, 36 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: $ | 2 | ** $Id: lbuiltin.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ |
| 3 | ** Built-in functions | 3 | ** Built-in functions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -10,7 +10,6 @@ | |||
| 10 | #include "lapi.h" | 10 | #include "lapi.h" |
| 11 | #include "lauxlib.h" | 11 | #include "lauxlib.h" |
| 12 | #include "lbuiltin.h" | 12 | #include "lbuiltin.h" |
| 13 | #include "lglobal.h" | ||
| 14 | #include "lmem.h" | 13 | #include "lmem.h" |
| 15 | #include "lstring.h" | 14 | #include "lstring.h" |
| 16 | #include "ltable.h" | 15 | #include "ltable.h" |
| @@ -18,13 +17,25 @@ | |||
| 18 | #include "lua.h" | 17 | #include "lua.h" |
| 19 | 18 | ||
| 20 | 19 | ||
| 20 | |||
| 21 | static void nextvar (void) | 21 | static void nextvar (void) |
| 22 | { | 22 | { |
| 23 | int i = luaG_nextvar(lua_isnil(lua_getparam(1)) ? 0 : | 23 | lua_Object v = luaL_nonnullarg(1); |
| 24 | luaG_findsymbolbyname(luaL_check_string(1))+1); | 24 | TaggedString *g; |
| 25 | if (i >= 0) { | 25 | if (lua_isnil(v)) |
| 26 | lua_pushstring(luaG_global[i].varname->str); | 26 | g = (TaggedString *)luaS_root.next; |
| 27 | luaA_pushobject(&s_object(i)); | 27 | else { |
| 28 | TObject *o = luaA_Address(v); | ||
| 29 | luaL_arg_check(ttype(o) == LUA_T_STRING, 1, "variable name expected"); | ||
| 30 | g = tsvalue(o); | ||
| 31 | luaL_arg_check((GCnode *)g != g->head.next, 1, "variable name expected"); | ||
| 32 | g = (TaggedString *)g->head.next; | ||
| 33 | } | ||
| 34 | while (g && g->u.globalval.ttype == LUA_T_NIL) | ||
| 35 | g = (TaggedString *)g->head.next; | ||
| 36 | if (g) { | ||
| 37 | lua_pushstring(g->str); | ||
| 38 | luaA_pushobject(&g->u.globalval); | ||
| 28 | } | 39 | } |
| 29 | } | 40 | } |
| 30 | 41 | ||
| @@ -32,10 +43,9 @@ static void nextvar (void) | |||
| 32 | static void next (void) | 43 | static void next (void) |
| 33 | { | 44 | { |
| 34 | lua_Object o = lua_getparam(1); | 45 | lua_Object o = lua_getparam(1); |
| 35 | lua_Object r = lua_getparam(2); | 46 | lua_Object r = luaL_nonnullarg(2); |
| 36 | Node *n; | 47 | Node *n; |
| 37 | luaL_arg_check(lua_istable(o), 1, "table expected"); | 48 | luaL_arg_check(lua_istable(o), 1, "table expected"); |
| 38 | luaL_arg_check(r != LUA_NOOBJECT, 2, "value expected"); | ||
| 39 | n = luaH_next(luaA_Address(o), luaA_Address(r)); | 49 | n = luaH_next(luaA_Address(o), luaA_Address(r)); |
| 40 | if (n) { | 50 | if (n) { |
| 41 | luaA_pushobject(&n->ref); | 51 | luaA_pushobject(&n->ref); |
| @@ -90,7 +100,7 @@ static char *to_string (lua_Object obj) | |||
| 90 | return buff; | 100 | return buff; |
| 91 | } | 101 | } |
| 92 | case LUA_T_USERDATA: { | 102 | case LUA_T_USERDATA: { |
| 93 | sprintf(buff, "userdata: %p", o->value.ts->u.v); | 103 | sprintf(buff, "userdata: %p", o->value.ts->u.d.v); |
| 94 | return buff; | 104 | return buff; |
| 95 | } | 105 | } |
| 96 | case LUA_T_NIL: | 106 | case LUA_T_NIL: |
| @@ -116,8 +126,7 @@ static void luaI_print (void) | |||
| 116 | 126 | ||
| 117 | static void luaI_type (void) | 127 | static void luaI_type (void) |
| 118 | { | 128 | { |
| 119 | lua_Object o = lua_getparam(1); | 129 | lua_Object o = luaL_nonnullarg(1); |
| 120 | luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument"); | ||
| 121 | lua_pushstring(luaO_typenames[-ttype(luaA_Address(o))]); | 130 | lua_pushstring(luaO_typenames[-ttype(luaA_Address(o))]); |
| 122 | lua_pushnumber(lua_tag(o)); | 131 | lua_pushnumber(lua_tag(o)); |
| 123 | } | 132 | } |
| @@ -149,8 +158,7 @@ static void luaI_assert (void) | |||
| 149 | 158 | ||
| 150 | static void setglobal (void) | 159 | static void setglobal (void) |
| 151 | { | 160 | { |
| 152 | lua_Object value = lua_getparam(2); | 161 | lua_Object value = luaL_nonnullarg(2); |
| 153 | luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); | ||
| 154 | lua_pushobject(value); | 162 | lua_pushobject(value); |
| 155 | lua_setglobal(luaL_check_string(1)); | 163 | lua_setglobal(luaL_check_string(1)); |
| 156 | lua_pushobject(value); /* return given value */ | 164 | lua_pushobject(value); /* return given value */ |
| @@ -158,8 +166,7 @@ static void setglobal (void) | |||
| 158 | 166 | ||
| 159 | static void rawsetglobal (void) | 167 | static void rawsetglobal (void) |
| 160 | { | 168 | { |
| 161 | lua_Object value = lua_getparam(2); | 169 | lua_Object value = luaL_nonnullarg(2); |
| 162 | luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); | ||
| 163 | lua_pushobject(value); | 170 | lua_pushobject(value); |
| 164 | lua_rawsetglobal(luaL_check_string(1)); | 171 | lua_rawsetglobal(luaL_check_string(1)); |
| 165 | lua_pushobject(value); /* return given value */ | 172 | lua_pushobject(value); /* return given value */ |
| @@ -233,10 +240,8 @@ static void newtag (void) | |||
| 233 | 240 | ||
| 234 | static void rawgettable (void) | 241 | static void rawgettable (void) |
| 235 | { | 242 | { |
| 236 | lua_Object t = lua_getparam(1); | 243 | lua_Object t = luaL_nonnullarg(1); |
| 237 | lua_Object i = lua_getparam(2); | 244 | lua_Object i = luaL_nonnullarg(2); |
| 238 | luaL_arg_check(t != LUA_NOOBJECT, 1, NULL); | ||
| 239 | luaL_arg_check(i != LUA_NOOBJECT, 2, NULL); | ||
| 240 | lua_pushobject(t); | 245 | lua_pushobject(t); |
| 241 | lua_pushobject(i); | 246 | lua_pushobject(i); |
| 242 | lua_pushobject(lua_rawgettable()); | 247 | lua_pushobject(lua_rawgettable()); |
| @@ -245,11 +250,9 @@ static void rawgettable (void) | |||
| 245 | 250 | ||
| 246 | static void rawsettable (void) | 251 | static void rawsettable (void) |
| 247 | { | 252 | { |
| 248 | lua_Object t = lua_getparam(1); | 253 | lua_Object t = luaL_nonnullarg(1); |
| 249 | lua_Object i = lua_getparam(2); | 254 | lua_Object i = luaL_nonnullarg(2); |
| 250 | lua_Object v = lua_getparam(3); | 255 | lua_Object v = luaL_nonnullarg(3); |
| 251 | luaL_arg_check(t != LUA_NOOBJECT && i != LUA_NOOBJECT && v != LUA_NOOBJECT, | ||
| 252 | 0, NULL); | ||
| 253 | lua_pushobject(t); | 256 | lua_pushobject(t); |
| 254 | lua_pushobject(i); | 257 | lua_pushobject(i); |
| 255 | lua_pushobject(v); | 258 | lua_pushobject(v); |
| @@ -259,8 +262,7 @@ static void rawsettable (void) | |||
| 259 | 262 | ||
| 260 | static void settagmethod (void) | 263 | static void settagmethod (void) |
| 261 | { | 264 | { |
| 262 | lua_Object nf = lua_getparam(3); | 265 | lua_Object nf = luaL_nonnullarg(3); |
| 263 | luaL_arg_check(nf != LUA_NOOBJECT, 3, "value expected"); | ||
| 264 | lua_pushobject(nf); | 266 | lua_pushobject(nf); |
| 265 | lua_pushobject(lua_settagmethod((int)luaL_check_number(1), | 267 | lua_pushobject(lua_settagmethod((int)luaL_check_number(1), |
| 266 | luaL_check_string(2))); | 268 | luaL_check_string(2))); |
| @@ -276,8 +278,7 @@ static void gettagmethod (void) | |||
| 276 | 278 | ||
| 277 | static void seterrormethod (void) | 279 | static void seterrormethod (void) |
| 278 | { | 280 | { |
| 279 | lua_Object nf = lua_getparam(1); | 281 | lua_Object nf = luaL_nonnullarg(1); |
| 280 | luaL_arg_check(nf != LUA_NOOBJECT, 1, "value expected"); | ||
| 281 | lua_pushobject(nf); | 282 | lua_pushobject(nf); |
| 282 | lua_pushobject(lua_seterrormethod()); | 283 | lua_pushobject(lua_seterrormethod()); |
| 283 | } | 284 | } |
| @@ -387,18 +388,21 @@ static struct luaL_reg int_funcs[] = { | |||
| 387 | void luaB_predefine (void) | 388 | void luaB_predefine (void) |
| 388 | { | 389 | { |
| 389 | int i; | 390 | int i; |
| 390 | Word n; | 391 | TaggedString *ts; |
| 392 | TObject o; | ||
| 391 | /* pre-register mem error messages, to avoid loop when error arises */ | 393 | /* pre-register mem error messages, to avoid loop when error arises */ |
| 392 | luaS_newfixedstring(tableEM); | 394 | luaS_newfixedstring(tableEM); |
| 393 | luaS_newfixedstring(memEM); | 395 | luaS_newfixedstring(memEM); |
| 396 | o.ttype = LUA_T_CFUNCTION; | ||
| 394 | for (i=0; i<INTFUNCSIZE; i++) { | 397 | for (i=0; i<INTFUNCSIZE; i++) { |
| 395 | n = luaG_findsymbolbyname(int_funcs[i].name); | 398 | ts = luaS_new(int_funcs[i].name); |
| 396 | s_ttype(n) = LUA_T_CFUNCTION; | 399 | fvalue(&o) = int_funcs[i].func; |
| 397 | fvalue(&s_object(n)) = int_funcs[i].func; | 400 | luaS_rawsetglobal(ts, &o); |
| 398 | } | 401 | } |
| 399 | n = luaG_findsymbolbyname("_VERSION"); | 402 | ts = luaS_new("_VERSION"); |
| 400 | s_ttype(n) = LUA_T_STRING; | 403 | ttype(&o) = LUA_T_STRING; |
| 401 | tsvalue(&s_object(n)) = luaS_new(LUA_VERSION); | 404 | tsvalue(&o) = luaS_new(LUA_VERSION); |
| 405 | luaS_rawsetglobal(ts, &o); | ||
| 402 | } | 406 | } |
| 403 | 407 | ||
| 404 | 408 | ||
