From 4343d8af53995996503d63bb4c03aee436c0fdb4 Mon Sep 17 00:00:00 2001 From: birk Date: Sun, 8 Jun 2025 06:45:46 +0200 Subject: [PATCH] ldump.c added --- ldump.c | 211 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 ldump.c diff --git a/ldump.c b/ldump.c new file mode 100644 index 0000000..f405385 --- /dev/null +++ b/ldump.c @@ -0,0 +1,211 @@ +/* +** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + + +void print_data(const char* arr, size_t length) +{ + for (int i = 0; i < length; i++) + { + printf("%02X ", (unsigned char)arr[i]); + } + printf("\n"); +} + + + +#include + +#define ldump_c +#define LUA_CORE + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + +typedef struct { + lua_State* L; + lua_Writer writer; + void* data; + int strip; + int status; +} DumpState; + +#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) +#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) + +static void DumpBlock(const void* b, size_t size, DumpState* D) +{ + if (D->status==0) + { + print_data(b, size) + lua_unlock(D->L); + D->status=(*D->writer)(D->L,b,size,D->data); + lua_lock(D->L); + } +} + +static void DumpChar(int y, DumpState* D) +{ + char x=(char)y; + DumpVar(x,D); +} + +static void DumpInt(int x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpNumber(lua_Number x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpVector(const void* b, int n, size_t size, DumpState* D) +{ + DumpInt(n,D); + DumpMem(b,n,size,D); +} + +static void DumpString(const TString* s, DumpState* D) +{ + if (s==NULL || getstr(s)==NULL) + { + printf("NULL\n"); + size_t size=0; + DumpVar(size,D); + } + else + { + size_t size=s->tsv.len+1; /* include trailing '\0' */ + printf("size: "); + DumpVar(size,D); + printf("string: "); + DumpBlock(getstr(s),size,D); + } +} + +#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D); + +static void DumpConstants(const Proto* f, DumpState* D) +{ + int i,n=f->sizek; + printf("sizek: "); + DumpInt(n,D); + for (i=0; ik[i]; + printf("constant type: "); + DumpChar(ttype(o),D); + switch (ttype(o)) + { + case LUA_TNIL: + printf("LUA_TNIL: \n"); + break; + case LUA_TBOOLEAN: + printf("LUA_TBOOLEAN: "); + DumpChar(bvalue(o),D); + break; + case LUA_TNUMBER: + printf("LUA_TNUMBER: "); + DumpNumber(nvalue(o),D); + break; + case LUA_TSTRING: + printf("LUA_TSTRING: "); + DumpString(rawtsvalue(o),D); + break; + default: + lua_assert(0); /* cannot happen */ + break; + } + } + n=f->sizep; + printf("sizep: "); + DumpInt(n,D); + for (i=0; ip[i],f->source,D); + print(0, "=-=-=-=-=-=-=-=-=-=-=-=-=End: %d=-=-=-=-=-=-=-=-=-=-=-=-=\n", i); + } +} + +static void DumpDebug(const Proto* f, DumpState* D) +{ + int i,n; + n= (D->strip) ? 0 : f->sizelineinfo; + DumpVector(f->lineinfo,n,sizeof(int),D); + n= (D->strip) ? 0 : f->sizelocvars; + DumpInt(n,D); + for (i=0; ilocvars[i].varname,D); + DumpInt(f->locvars[i].startpc,D); + DumpInt(f->locvars[i].endpc,D); + } + n= (D->strip) ? 0 : f->sizeupvalues; + DumpInt(n,D); + for (i=0; iupvalues[i],D); +} + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D) +{ + printf("source: \n"); + DumpString((f->source==p || D->strip) ? NULL : f->source,D); + printf("linedefined: "); + DumpInt(f->linedefined,D); + printf("lastlinedefined: "); + DumpInt(f->lastlinedefined,D); + printf("nups: "); + DumpChar(f->nups,D); + printf("numparams: "); + DumpChar(f->numparams,D); + printf("is_vararg: "); + DumpChar(f->is_vararg,D); + printf("maxstacksize: "); + DumpChar(f->maxstacksize,D); + printf("=-=-=-=-=-=-=-=-=-=-=-=-=Dumping CODE=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + + printf("sizecode: "); + DumpCode(f,D); + +// DUMP INS HERE + printf("=-=-=-=-=-=-=-=-=-=-=-=-=Dumping CONSTANTS=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + + DumpConstants(f,D); + printf("=-=-=-=-=-=-=-=-=-=-=-=-=Dumping DEBUG=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + DumpDebug(f,D); +} + +static void DumpHeader(DumpState* D) +{ + char h[LUAC_HEADERSIZE]; + luaU_header(h); + printf("header: "); + DumpBlock(h,LUAC_HEADERSIZE,D); +} + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) +{ + DumpState D; + D.L=L; + D.writer=w; + D.data=data; + D.strip=strip; + D.status=0; + print(0, "=-=-=-=-=-=-=-=-=-=-=-=-=Dumping HEADER=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + DumpHeader(&D); + print(0, "=-=-=-=-=-=-=-=-=-=-=-=-=Dumping MAIN_CODE=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + DumpFunction(f,NULL,&D); + print(0, "=-=-=-=-=-=-=-=-=-=-=-=-=End: MAIN_CODE=-=-=-=-=-=-=-=-=-=-=-=-=\n"); + return D.status; +} \ No newline at end of file