00001 /* 00002 ** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ 00003 ** save precompiled Lua chunks 00004 ** See Copyright Notice in lua.h 00005 */ 00006 00007 #include <stddef.h> 00008 00009 #define ldump_c 00010 #define LUA_CORE 00011 00012 #include "lua.h" 00013 00014 #include "lobject.h" 00015 #include "lstate.h" 00016 #include "lundump.h" 00017 00018 typedef struct { 00019 lua_State* L; 00020 lua_Writer writer; 00021 void* data; 00022 int strip; 00023 int status; 00024 } DumpState; 00025 00026 #define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) 00027 #define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) 00028 00029 static void DumpBlock(const void* b, size_t size, DumpState* D) 00030 { 00031 if (D->status==0) 00032 { 00033 lua_unlock(D->L); 00034 D->status=(*D->writer)(D->L,b,size,D->data); 00035 lua_lock(D->L); 00036 } 00037 } 00038 00039 static void DumpChar(int y, DumpState* D) 00040 { 00041 char x=(char)y; 00042 DumpVar(x,D); 00043 } 00044 00045 static void DumpInt(int x, DumpState* D) 00046 { 00047 DumpVar(x,D); 00048 } 00049 00050 static void DumpNumber(lua_Number x, DumpState* D) 00051 { 00052 DumpVar(x,D); 00053 } 00054 00055 static void DumpVector(const void* b, int n, size_t size, DumpState* D) 00056 { 00057 DumpInt(n,D); 00058 DumpMem(b,n,size,D); 00059 } 00060 00061 static void DumpString(const TString* s, DumpState* D) 00062 { 00063 if (s==NULL || getstr(s)==NULL) 00064 { 00065 size_t size=0; 00066 DumpVar(size,D); 00067 } 00068 else 00069 { 00070 size_t size=s->tsv.len+1; /* include trailing '\0' */ 00071 DumpVar(size,D); 00072 DumpBlock(getstr(s),size,D); 00073 } 00074 } 00075 00076 #define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) 00077 00078 static void DumpFunction(const Proto* f, const TString* p, DumpState* D); 00079 00080 static void DumpConstants(const Proto* f, DumpState* D) 00081 { 00082 int i,n=f->sizek; 00083 DumpInt(n,D); 00084 for (i=0; i<n; i++) 00085 { 00086 const TValue* o=&f->k[i]; 00087 DumpChar(ttype(o),D); 00088 switch (ttype(o)) 00089 { 00090 case LUA_TNIL: 00091 break; 00092 case LUA_TBOOLEAN: 00093 DumpChar(bvalue(o),D); 00094 break; 00095 case LUA_TNUMBER: 00096 DumpNumber(nvalue(o),D); 00097 break; 00098 case LUA_TSTRING: 00099 DumpString(rawtsvalue(o),D); 00100 break; 00101 default: 00102 lua_assert(0); /* cannot happen */ 00103 break; 00104 } 00105 } 00106 n=f->sizep; 00107 DumpInt(n,D); 00108 for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D); 00109 } 00110 00111 static void DumpDebug(const Proto* f, DumpState* D) 00112 { 00113 int i,n; 00114 n= (D->strip) ? 0 : f->sizelineinfo; 00115 DumpVector(f->lineinfo,n,sizeof(int),D); 00116 n= (D->strip) ? 0 : f->sizelocvars; 00117 DumpInt(n,D); 00118 for (i=0; i<n; i++) 00119 { 00120 DumpString(f->locvars[i].varname,D); 00121 DumpInt(f->locvars[i].startpc,D); 00122 DumpInt(f->locvars[i].endpc,D); 00123 } 00124 n= (D->strip) ? 0 : f->sizeupvalues; 00125 DumpInt(n,D); 00126 for (i=0; i<n; i++) DumpString(f->upvalues[i],D); 00127 } 00128 00129 static void DumpFunction(const Proto* f, const TString* p, DumpState* D) 00130 { 00131 DumpString((f->source==p || D->strip) ? NULL : f->source,D); 00132 DumpInt(f->linedefined,D); 00133 DumpInt(f->lastlinedefined,D); 00134 DumpChar(f->nups,D); 00135 DumpChar(f->numparams,D); 00136 DumpChar(f->is_vararg,D); 00137 DumpChar(f->maxstacksize,D); 00138 DumpCode(f,D); 00139 DumpConstants(f,D); 00140 DumpDebug(f,D); 00141 } 00142 00143 static void DumpHeader(DumpState* D) 00144 { 00145 char h[LUAC_HEADERSIZE]; 00146 luaU_header(h); 00147 DumpBlock(h,LUAC_HEADERSIZE,D); 00148 } 00149 00150 /* 00151 ** dump Lua function as precompiled chunk 00152 */ 00153 int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) 00154 { 00155 DumpState D; 00156 D.L=L; 00157 D.writer=w; 00158 D.data=data; 00159 D.strip=strip; 00160 D.status=0; 00161 DumpHeader(&D); 00162 DumpFunction(f,NULL,&D); 00163 return D.status; 00164 }
ContextLogger2—ContextLogger2 Logger Daemon Internals—Generated on Mon May 2 13:49:54 2011 by Doxygen 1.6.1