aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-12-13 14:38:00 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-12-13 14:38:00 -0200
commitb83b6ba015d2fef9a73aa1b8e55c2d2233bd2812 (patch)
treee29e93816938f6f1a07ca9fe07d544985a4aa617
parentaf119c8b55f15910df17e02633d8a5ca656b209a (diff)
downloadlua-b83b6ba015d2fef9a73aa1b8e55c2d2233bd2812.tar.gz
lua-b83b6ba015d2fef9a73aa1b8e55c2d2233bd2812.tar.bz2
lua-b83b6ba015d2fef9a73aa1b8e55c2d2233bd2812.zip
'loadin' -> 'load'
-rw-r--r--lbaselib.c73
1 files changed, 29 insertions, 44 deletions
diff --git a/lbaselib.c b/lbaselib.c
index d0aeb893..137ffe71 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.253 2010/12/07 11:40:42 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.254 2010/12/08 12:58:04 roberto Exp roberto $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -253,6 +253,11 @@ static int luaB_loadfile (lua_State *L) {
253** ======================================================= 253** =======================================================
254*/ 254*/
255 255
256/*
257** check whether a chunk (prefix in 's') satisfies given 'mode'
258** ('t' for text, 'b' for binary). Returns error message (also
259** pushed on the stack) in case of errors.
260*/
256static const char *checkrights (lua_State *L, const char *mode, const char *s) { 261static const char *checkrights (lua_State *L, const char *mode, const char *s) {
257 if (strchr(mode, 'b') == NULL && *s == LUA_SIGNATURE[0]) 262 if (strchr(mode, 'b') == NULL && *s == LUA_SIGNATURE[0])
258 return lua_pushstring(L, "attempt to load a binary chunk"); 263 return lua_pushstring(L, "attempt to load a binary chunk");
@@ -263,10 +268,11 @@ static const char *checkrights (lua_State *L, const char *mode, const char *s) {
263 268
264 269
265/* 270/*
266** reserves a slot, above all arguments, to hold a copy of the returned 271** reserved slot, above all arguments, to hold a copy of the returned
267** string to avoid it being collected while parsed 272** string to avoid it being collected while parsed. 'load' has four
273** optional arguments (chunk, source name, mode, and environment).
268*/ 274*/
269#define RESERVEDSLOT 4 275#define RESERVEDSLOT 5
270 276
271 277
272/* 278/*
@@ -275,25 +281,20 @@ static const char *checkrights (lua_State *L, const char *mode, const char *s) {
275** stack top. Instead, it keeps its resulting string in a 281** stack top. Instead, it keeps its resulting string in a
276** reserved slot inside the stack. 282** reserved slot inside the stack.
277*/ 283*/
278typedef struct { /* reader state */
279 int f; /* position of reader function on stack */
280 const char *mode; /* allowed modes (binary/text) */
281} Readstat;
282
283static const char *generic_reader (lua_State *L, void *ud, size_t *size) { 284static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
284 const char *s; 285 const char *s;
285 Readstat *stat = (Readstat *)ud; 286 const char **mode = (const char **)ud;
286 luaL_checkstack(L, 2, "too many nested functions"); 287 luaL_checkstack(L, 2, "too many nested functions");
287 lua_pushvalue(L, stat->f); /* get function */ 288 lua_pushvalue(L, 1); /* get function */
288 lua_call(L, 0, 1); /* call it */ 289 lua_call(L, 0, 1); /* call it */
289 if (lua_isnil(L, -1)) { 290 if (lua_isnil(L, -1)) {
290 *size = 0; 291 *size = 0;
291 return NULL; 292 return NULL;
292 } 293 }
293 else if ((s = lua_tostring(L, -1)) != NULL) { 294 else if ((s = lua_tostring(L, -1)) != NULL) {
294 if (stat->mode != NULL) { /* first time? */ 295 if (*mode != NULL) { /* first time? */
295 s = checkrights(L, stat->mode, s); /* check mode */ 296 s = checkrights(L, *mode, s); /* check mode */
296 stat->mode = NULL; /* to avoid further checks */ 297 *mode = NULL; /* to avoid further checks */
297 if (s) luaL_error(L, s); 298 if (s) luaL_error(L, s);
298 } 299 }
299 lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ 300 lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */
@@ -306,43 +307,28 @@ static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
306} 307}
307 308
308 309
309static int luaB_load_aux (lua_State *L, int farg) { 310static int luaB_load (lua_State *L) {
310 int status; 311 int status;
311 Readstat stat;
312 size_t l; 312 size_t l;
313 const char *s = lua_tolstring(L, farg, &l); 313 int top = lua_gettop(L);
314 stat.mode = luaL_optstring(L, farg + 2, "bt"); 314 const char *s = lua_tolstring(L, 1, &l);
315 const char *mode = luaL_optstring(L, 3, "bt");
315 if (s != NULL) { /* loading a string? */ 316 if (s != NULL) { /* loading a string? */
316 const char *chunkname = luaL_optstring(L, farg + 1, s); 317 const char *chunkname = luaL_optstring(L, 2, s);
317 status = (checkrights(L, stat.mode, s) != NULL) 318 status = (checkrights(L, mode, s) != NULL)
318 || luaL_loadbuffer(L, s, l, chunkname); 319 || luaL_loadbuffer(L, s, l, chunkname);
319 } 320 }
320 else { /* loading from a reader function */ 321 else { /* loading from a reader function */
321 const char *chunkname = luaL_optstring(L, farg + 1, "=(load)"); 322 const char *chunkname = luaL_optstring(L, 2, "=(load)");
322 luaL_checktype(L, farg, LUA_TFUNCTION); 323 luaL_checktype(L, 1, LUA_TFUNCTION);
323 stat.f = farg;
324 lua_settop(L, RESERVEDSLOT); /* create reserved slot */ 324 lua_settop(L, RESERVEDSLOT); /* create reserved slot */
325 status = lua_load(L, generic_reader, &stat, chunkname); 325 status = lua_load(L, generic_reader, &mode, chunkname);
326 } 326 }
327 return load_aux(L, status); 327 if (status == LUA_OK && top >= 4) { /* is there an 'env' argument */
328} 328 lua_pushvalue(L, 4); /* environment for loaded function */
329 329 lua_setupvalue(L, -2, 1); /* set it as 1st upvalue */
330
331static int luaB_load (lua_State *L) {
332 return luaB_load_aux(L, 1);
333}
334
335
336static int luaB_loadin (lua_State *L) {
337 int n;
338 luaL_checkany(L, 1);
339 n = luaB_load_aux(L, 2);
340 if (n == 1) { /* success? */
341 lua_pushvalue(L, 1); /* environment for loaded function */
342 if (lua_setupvalue(L, -2, 1) == NULL)
343 luaL_error(L, "loaded chunk does not have an upvalue");
344 } 330 }
345 return n; 331 return load_aux(L, status);
346} 332}
347 333
348 334
@@ -447,7 +433,7 @@ static int luaB_newproxy (lua_State *L) {
447 else if (lua_isboolean(L, 1)) { 433 else if (lua_isboolean(L, 1)) {
448 lua_createtable(L, 0, 1); /* create a new metatable `m' ... */ 434 lua_createtable(L, 0, 1); /* create a new metatable `m' ... */
449 lua_pushboolean(L, 1); 435 lua_pushboolean(L, 1);
450 lua_setfield(L, -2, "__gc"); /* ... m.__gc = false (HACK!!)... */ 436 lua_setfield(L, -2, "__gc"); /* ... m.__gc = true (HACK!!)... */
451 lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ 437 lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */
452 lua_pushboolean(L, 1); 438 lua_pushboolean(L, 1);
453 lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ 439 lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */
@@ -477,7 +463,6 @@ static const luaL_Reg base_funcs[] = {
477 {"ipairs", luaB_ipairs}, 463 {"ipairs", luaB_ipairs},
478 {"loadfile", luaB_loadfile}, 464 {"loadfile", luaB_loadfile},
479 {"load", luaB_load}, 465 {"load", luaB_load},
480 {"loadin", luaB_loadin},
481 {"loadstring", luaB_loadstring}, 466 {"loadstring", luaB_loadstring},
482 {"next", luaB_next}, 467 {"next", luaB_next},
483 {"pairs", luaB_pairs}, 468 {"pairs", luaB_pairs},