瀏覽代碼

var-arguments to the script come from 'arg' table (not from original
'argv' array)

Roberto Ierusalimschy 11 年之前
父節點
當前提交
10200585a7
共有 1 個文件被更改,包括 16 次插入10 次删除
  1. 16 10
      lua.c

+ 16 - 10
lua.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lua.c,v 1.210 2014/02/26 15:27:56 roberto Exp roberto $
+** $Id: lua.c,v 1.211 2014/06/05 20:42:06 roberto Exp roberto $
 ** Lua stand-alone interpreter
 ** See Copyright Notice in lua.h
 */
@@ -417,25 +417,31 @@ static void doREPL (lua_State *L) {
 
 
 /*
-** Push on the stack 'n' strings from 'argv'
+** Push on the stack the contents of table 'arg' from 1 to #arg
 */
-static void pushargs (lua_State *L, char **argv, int n) {
-  int i;
+static int pushargs (lua_State *L) {
+  int i, n;
+  lua_getglobal(L, "arg");
+  if (!lua_istable(L, -1))
+    luaL_error(L, "'arg' is not a table");
+  n = (int)luaL_len(L, -1);
   luaL_checkstack(L, n + 3, "too many arguments to script");
-  for (i = 1; i < n; i++)  /* skip 0 (the script name) */
-    lua_pushstring(L, argv[i]);
+  for (i = 1; i <= n; i++)
+    lua_rawgeti(L, -i, i);
+  lua_remove(L, -i);  /* remove table from the stack */
+  return n;
 }
 
 
-static int handle_script (lua_State *L, char **argv, int n) {
+static int handle_script (lua_State *L, char **argv) {
   int status;
   const char *fname = argv[0];
   if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0)
     fname = NULL;  /* stdin */
   status = luaL_loadfile(L, fname);
   if (status == LUA_OK) {
-    pushargs(L, argv, n);  /* push arguments to script */
-    status = docall(L, n - 1, LUA_MULTRET);
+    int n = pushargs(L);  /* push arguments to script */
+    status = docall(L, n, LUA_MULTRET);
   }
   return report(L, status);
 }
@@ -570,7 +576,7 @@ static int pmain (lua_State *L) {
   if (!runargs(L, argv, script))  /* execute arguments -e and -l */
     return 0;  /* something failed */
   if (script < argc &&  /* execute main script (if there is one) */
-      handle_script(L, argv + script, argc - script) != LUA_OK)
+      handle_script(L, argv + script) != LUA_OK)
     return 0;
   if (args & has_i)  /* -i option? */
     doREPL(L);  /* do read-eval-print loop */