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