1dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* 2dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** $Id: lundump.c,v 2.22 2012/05/08 13:53:33 roberto Exp $ 3dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** load precompiled Lua chunks 4dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** See Copyright Notice in lua.h 5dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/ 6dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 7dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include <string.h> 8dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 9dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define lundump_c 10dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LUA_CORE 11dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 12dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lua.h" 13dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 14dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ldebug.h" 15dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ldo.h" 16dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lfunc.h" 17dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lmem.h" 18dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lobject.h" 19dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lstring.h" 20dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lundump.h" 21dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lzio.h" 22dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 23dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct { 24dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lua_State* L; 25dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com ZIO* Z; 26dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Mbuffer* b; 27dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const char* name; 28dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} LoadState; 29dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 30dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic l_noret error(LoadState* S, const char* why) 31dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 32dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com luaO_pushfstring(S->L,"%s: %s precompiled chunk",S->name,why); 33dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com luaD_throw(S->L,LUA_ERRSYNTAX); 34dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 35dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 36dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) 37dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LoadByte(S) (lu_byte)LoadChar(S) 38dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) 39dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LoadVector(S,b,n,size) LoadMem(S,b,n,size) 40dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 41dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#if !defined(luai_verifycode) 42dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luai_verifycode(L,b,f) /* empty */ 43dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#endif 44dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 45dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadBlock(LoadState* S, void* b, size_t size) 46dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 47dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (luaZ_read(S->Z,b,size)!=0) error(S,"truncated"); 48dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 49dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 50dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic int LoadChar(LoadState* S) 51dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 52dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com char x; 53dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVar(S,x); 54dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return x; 55dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 56dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 57dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic int LoadInt(LoadState* S) 58dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 59dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int x; 60dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVar(S,x); 61dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (x<0) error(S,"corrupted"); 62dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return x; 63dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 64dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 65dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic lua_Number LoadNumber(LoadState* S) 66dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 67dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lua_Number x; 68dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVar(S,x); 69dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return x; 70dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 71dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 72dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic TString* LoadString(LoadState* S) 73dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 74dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com size_t size; 75dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVar(S,size); 76dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (size==0) 77dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return NULL; 78dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com else 79dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 80dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com char* s=luaZ_openspace(S->L,S->b,size); 81dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadBlock(S,s,size*sizeof(char)); 82dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ 83dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 84dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 85dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 86dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadCode(LoadState* S, Proto* f) 87dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 88dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int n=LoadInt(S); 89dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->code=luaM_newvector(S->L,n,Instruction); 90dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizecode=n; 91dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVector(S,f->code,n,sizeof(Instruction)); 92dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 93dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 94dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadFunction(LoadState* S, Proto* f); 95dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 96dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadConstants(LoadState* S, Proto* f) 97dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 98dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int i,n; 99dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 100dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->k=luaM_newvector(S->L,n,TValue); 101dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizek=n; 102dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) setnilvalue(&f->k[i]); 103dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) 104dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 105dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com TValue* o=&f->k[i]; 106dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int t=LoadChar(S); 107dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com switch (t) 108dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 109dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com case LUA_TNIL: 110dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setnilvalue(o); 111dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com break; 112dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com case LUA_TBOOLEAN: 113dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setbvalue(o,LoadChar(S)); 114dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com break; 115dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com case LUA_TNUMBER: 116dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setnvalue(o,LoadNumber(S)); 117dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com break; 118dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com case LUA_TSTRING: 119dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setsvalue2n(S->L,o,LoadString(S)); 120dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com break; 121dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com default: lua_assert(0); 122dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 123dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 124dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 125dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->p=luaM_newvector(S->L,n,Proto*); 126dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizep=n; 127dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) f->p[i]=NULL; 128dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) 129dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 130dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->p[i]=luaF_newproto(S->L); 131dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadFunction(S,f->p[i]); 132dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 133dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 134dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 135dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadUpvalues(LoadState* S, Proto* f) 136dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 137dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int i,n; 138dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 139dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->upvalues=luaM_newvector(S->L,n,Upvaldesc); 140dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizeupvalues=n; 141dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) f->upvalues[i].name=NULL; 142dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) 143dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 144dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->upvalues[i].instack=LoadByte(S); 145dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->upvalues[i].idx=LoadByte(S); 146dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 147dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 148dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 149dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadDebug(LoadState* S, Proto* f) 150dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 151dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int i,n; 152dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->source=LoadString(S); 153dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 154dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->lineinfo=luaM_newvector(S->L,n,int); 155dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizelineinfo=n; 156dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadVector(S,f->lineinfo,n,sizeof(int)); 157dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 158dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->locvars=luaM_newvector(S->L,n,LocVar); 159dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->sizelocvars=n; 160dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) f->locvars[i].varname=NULL; 161dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) 162dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 163dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->locvars[i].varname=LoadString(S); 164dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->locvars[i].startpc=LoadInt(S); 165dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->locvars[i].endpc=LoadInt(S); 166dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 167dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com n=LoadInt(S); 168dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (i=0; i<n; i++) f->upvalues[i].name=LoadString(S); 169dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 170dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 171dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadFunction(LoadState* S, Proto* f) 172dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 173dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->linedefined=LoadInt(S); 174dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->lastlinedefined=LoadInt(S); 175dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->numparams=LoadByte(S); 176dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->is_vararg=LoadByte(S); 177dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com f->maxstacksize=LoadByte(S); 178dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadCode(S,f); 179dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadConstants(S,f); 180dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadUpvalues(S,f); 181dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadDebug(S,f); 182dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 183dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 184dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* the code below must be consistent with the code in luaU_header */ 185dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define N0 LUAC_HEADERSIZE 186dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define N1 (sizeof(LUA_SIGNATURE)-sizeof(char)) 187dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define N2 N1+2 188dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define N3 N2+6 189dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 190dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstatic void LoadHeader(LoadState* S) 191dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 192dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte h[LUAC_HEADERSIZE]; 193dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte s[LUAC_HEADERSIZE]; 194dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com luaU_header(h); 195dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com memcpy(s,h,sizeof(char)); /* first char already read */ 196dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadBlock(S,s+sizeof(char),LUAC_HEADERSIZE-sizeof(char)); 197dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (memcmp(h,s,N0)==0) return; 198dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (memcmp(h,s,N1)!=0) error(S,"not a"); 199dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (memcmp(h,s,N2)!=0) error(S,"version mismatch in"); 200dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (memcmp(h,s,N3)!=0) error(S,"incompatible"); else error(S,"corrupted"); 201dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 202dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 203dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* 204dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** load precompiled chunk 205dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/ 206dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comClosure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) 207dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 208dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadState S; 209dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Closure* cl; 210dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (*name=='@' || *name=='=') 211dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.name=name+1; 212dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com else if (*name==LUA_SIGNATURE[0]) 213dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.name="binary string"; 214dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com else 215dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.name=name; 216dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.L=L; 217dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.Z=Z; 218dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com S.b=buff; 219dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadHeader(&S); 220dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com cl=luaF_newLclosure(L,1); 221dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setclLvalue(L,L->top,cl); incr_top(L); 222dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com cl->l.p=luaF_newproto(L); 223dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com LoadFunction(&S,cl->l.p); 224dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (cl->l.p->sizeupvalues != 1) 225dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 226dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Proto* p=cl->l.p; 227dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com cl=luaF_newLclosure(L,cl->l.p->sizeupvalues); 228dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com cl->l.p=p; 229dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com setclLvalue(L,L->top-1,cl); 230dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 231dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com luai_verifycode(L,buff,cl->l.p); 232dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com return cl; 233dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 234dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 235dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define MYINT(s) (s[0]-'0') 236dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define VERSION MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR) 237dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define FORMAT 0 /* this is the official format */ 238dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 239dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* 240dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com* make header for precompiled chunks 241dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com* if you change the code below be sure to update LoadHeader and FORMAT above 242dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com* and LUAC_HEADERSIZE in lundump.h 243dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/ 244dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comvoid luaU_header (lu_byte* h) 245dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com{ 246dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int x=1; 247dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-sizeof(char)); 248dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com h+=sizeof(LUA_SIGNATURE)-sizeof(char); 249dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(VERSION); 250dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(FORMAT); 251dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(*(char*)&x); /* endianness */ 252dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(sizeof(int)); 253dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(sizeof(size_t)); 254dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(sizeof(Instruction)); 255dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(sizeof(lua_Number)); 256dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com *h++=cast_byte(((lua_Number)0.5)==0); /* is lua_Number integral? */ 257dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com memcpy(h,LUAC_TAIL,sizeof(LUAC_TAIL)-sizeof(char)); 258dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 259