summaryrefslogtreecommitdiff
path: root/src/ldump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ldump.c')
-rw-r--r--src/ldump.c79
1 files changed, 35 insertions, 44 deletions
diff --git a/src/ldump.c b/src/ldump.c
index 0c9f00d1..e580047b 100644
--- a/src/ldump.c
+++ b/src/ldump.c
@@ -1,5 +1,5 @@
/*
-** $Id: ldump.c,v 1.10 2005/05/12 00:26:50 lhf Exp $
+** $Id: ldump.c,v 1.12 2005/06/08 14:40:44 lhf Exp $
** save pre-compiled Lua chunks
** See Copyright Notice in lua.h
*/
@@ -16,17 +16,20 @@
#include "lstate.h"
#include "lundump.h"
-#define DumpVector(b,n,size,D) DumpBlock(b,(n)*(size),D)
-#define DumpLiteral(s,D) DumpBlock("" s,(sizeof(s))-1,D)
-
typedef struct {
lua_State* L;
- lua_Chunkwriter writer;
+ lua_Writer writer;
void* data;
int strip;
int status;
} DumpState;
+#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D)
+#define DumpLines(f,D) DumpVector(f->lineinfo,f->sizelineinfo,sizeof(int),D)
+#define DumpLiteral(s,D) DumpBlock("" s,(sizeof(s))-1,D)
+#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D)
+#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D)
+
static void DumpBlock(const void* b, size_t size, DumpState* D)
{
if (D->status==0)
@@ -37,45 +40,43 @@ static void DumpBlock(const void* b, size_t size, DumpState* D)
}
}
-static void DumpByte(int y, DumpState* D)
+static void DumpChar(int y, DumpState* D)
{
char x=(char)y;
- DumpBlock(&x,sizeof(x),D);
+ DumpVar(x,D);
}
static void DumpInt(int x, DumpState* D)
{
- DumpBlock(&x,sizeof(x),D);
+ DumpVar(x,D);
}
-static void DumpSize(size_t x, DumpState* D)
+static void DumpNumber(lua_Number x, DumpState* D)
{
- DumpBlock(&x,sizeof(x),D);
+ DumpVar(x,D);
}
-static void DumpNumber(lua_Number x, DumpState* D)
+static void DumpVector(const void* b, int n, size_t size, DumpState* D)
{
- DumpBlock(&x,sizeof(x),D);
+ DumpInt(n,D);
+ DumpMem(b,n,size,D);
}
static void DumpString(const TString* s, DumpState* D)
{
if (s==NULL || getstr(s)==NULL)
- DumpSize(0,D);
+ {
+ size_t size=0;
+ DumpVar(size,D);
+ }
else
{
size_t size=s->tsv.len+1; /* include trailing '\0' */
- DumpSize(size,D);
+ DumpVar(size,D);
DumpBlock(getstr(s),size,D);
}
}
-static void DumpCode(const Proto* f, DumpState* D)
-{
- DumpInt(f->sizecode,D);
- DumpVector(f->code,f->sizecode,sizeof(*f->code),D);
-}
-
static void DumpLocals(const Proto* f, DumpState* D)
{
int i,n=f->sizelocvars;
@@ -88,12 +89,6 @@ static void DumpLocals(const Proto* f, DumpState* D)
}
}
-static void DumpLines(const Proto* f, DumpState* D)
-{
- DumpInt(f->sizelineinfo,D);
- DumpVector(f->lineinfo,f->sizelineinfo,sizeof(*f->lineinfo),D);
-}
-
static void DumpUpvalues(const Proto* f, DumpState* D)
{
int i,n=f->sizeupvalues;
@@ -105,18 +100,18 @@ static void DumpFunction(const Proto* f, const TString* p, DumpState* D);
static void DumpConstants(const Proto* f, DumpState* D)
{
- int i,n;
- DumpInt(n=f->sizek,D);
+ int i,n=f->sizek;
+ DumpInt(n,D);
for (i=0; i<n; i++)
{
const TValue* o=&f->k[i];
- DumpByte(ttype(o),D);
+ DumpChar(ttype(o),D);
switch (ttype(o))
{
case LUA_TNIL:
break;
case LUA_TBOOLEAN:
- DumpByte(bvalue(o),D);
+ DumpChar(bvalue(o),D);
break;
case LUA_TNUMBER:
DumpNumber(nvalue(o),D);
@@ -129,7 +124,8 @@ static void DumpConstants(const Proto* f, DumpState* D)
break;
}
}
- DumpInt(n=f->sizep,D);
+ n=f->sizep;
+ DumpInt(n,D);
for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D);
}
@@ -138,10 +134,10 @@ static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
DumpString((f->source==p) ? NULL : f->source,D);
DumpInt(f->linedefined,D);
DumpInt(f->lastlinedefined,D);
- DumpByte(f->nups,D);
- DumpByte(f->numparams,D);
- DumpByte(f->is_vararg,D);
- DumpByte(f->maxstacksize,D);
+ DumpChar(f->nups,D);
+ DumpChar(f->numparams,D);
+ DumpChar(f->is_vararg,D);
+ DumpChar(f->maxstacksize,D);
if (D->strip) DumpInt(0,D); else DumpLines(f,D);
if (D->strip) DumpInt(0,D); else DumpLocals(f,D);
if (D->strip) DumpInt(0,D); else DumpUpvalues(f,D);
@@ -151,20 +147,15 @@ static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
static void DumpHeader(DumpState* D)
{
- DumpLiteral(LUA_SIGNATURE,D);
- DumpByte(VERSION,D);
- DumpByte(luaU_endianness(),D);
- DumpByte(sizeof(int),D);
- DumpByte(sizeof(size_t),D);
- DumpByte(sizeof(Instruction),D);
- DumpByte(sizeof(lua_Number),D);
- DumpNumber(TEST_NUMBER,D);
+ char h[LUAC_HEADERSIZE];
+ luaU_header(h);
+ DumpBlock(h,LUAC_HEADERSIZE,D);
}
/*
** dump Lua function as precompiled chunk
*/
-int luaU_dump (lua_State* L, const Proto* f, lua_Chunkwriter w, void* data, int strip)
+int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
{
DumpState D;
D.L=L;