lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Thanks for the quick reply!  Yes, that seems to work and does what I need.

Is there a reason why this is not the default way of assembling the
files?  It seems like being able to pass arguments is a good thing but
maybe it has complications I don't understand.

Thanks again!

CR


On 1/18/07, Rici Lake <lua@ricilake.net> wrote:

On 18-Jan-07, at 6:53 PM, Chris wrote:

> What happened to the arguments in the first case?

They got lost because ... is not a variable.

When you compile multiple files, luac assembles them as though
you'd written:

(function(...)
   <file1>
end)()

(function(...)
   <file2>
end)()

return (function(...)
   <filen>
end)()

(except there are no line ends so the line numbers are preserved.)

What you (probably) want is the following conversion:

(function(...)<file1> end)(...)
(function(...)<file2> end)(...)
return (function(...)<filen> end)(...)

Since that's not very pretty to do in Lua (it's hard to retain the
correct line numbers while doing the combination), you could try the
following patch to luac.c:

--- ../../lua-5.1.1/src/luac.c  Fri Jun  2 12:37:11 2006
+++ luac.c      Thu Jan 18 21:01:30 2007
@@ -126,8 +126,9 @@
    Proto* f=luaF_newproto(L);
    setptvalue2s(L,L->top,f); incr_top(L);
    f->source=luaS_newliteral(L,"=(" PROGNAME ")");
-  f->maxstacksize=1;
-  pc=2*n+1;
+  f->maxstacksize=2;
+  f->is_vararg = VARARG_ISVARARG;
+  pc=3*n+1;
    f->code=luaM_newvector(L,pc,Instruction);
    f->sizecode=pc;
    f->p=luaM_newvector(L,n,Proto*);
@@ -137,7 +138,8 @@
    {
     f->p[i]=toproto(L,i-n-1);
     f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i);
-   f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1);
+   f->code[pc++]=CREATE_ABC(OP_VARARG,1,0,0);
+   f->code[pc++]=CREATE_ABC(OP_CALL,0,0,1);
    }
    f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0);
    return f;