2 ** $Id: dump.c,v 1.11 1998/07/12 00:17:37 lhf Exp $
3 ** save bytecodes to file
4 ** See Copyright Notice in lua.h
11 #define NotWord(x) ((unsigned short)x!=x)
12 #define DumpBlock(b,size,D) fwrite(b,size,1,D)
13 #define DumpNative(t,D) DumpBlock(&t,sizeof(t),D)
15 static void DumpWord(int i
, FILE* D
)
17 int hi
= 0x0000FF & (i
>>8);
23 static void DumpLong(long i
, FILE* D
)
25 int hi
= 0x00FFFF & (i
>>16);
31 #if ID_NUMBER==ID_REAL4
33 /* assumes sizeof(long)==4 and sizeof(float)==4 (IEEE) */
34 static void DumpFloat(float f
, FILE* D
)
41 #if ID_NUMBER==ID_REAL8
43 /* assumes sizeof(long)==4 and sizeof(double)==8 (IEEE) */
44 static void DumpDouble(double f
, FILE* D
)
48 if (*(char*)&x
==1) /* little-endian */
61 static void DumpCode(TProtoFunc
* tf
, FILE* D
)
63 int size
=CodeSize(tf
);
65 fprintf(stderr
,"luac: warning: "
66 "\"%s\":%d code too long for 16-bit machines (%d bytes)\n",
67 fileName(tf
),tf
->lineDefined
,size
);
69 DumpBlock(tf
->code
,size
,D
);
72 static void DumpString(char* s
, int size
, FILE* D
)
79 luaL_verror("string too long (%d bytes): \"%.32s...\"",size
,s
);
85 static void DumpTString(TaggedString
* s
, FILE* D
)
87 if (s
==NULL
) DumpString(NULL
,0,D
); else DumpString(s
->str
,s
->u
.s
.len
+1,D
);
90 static void DumpLocals(TProtoFunc
* tf
, FILE* D
)
94 for (n
=0,lv
=tf
->locvars
; lv
&& lv
->line
>=0; lv
++) ++n
;
96 for (lv
=tf
->locvars
; lv
&& lv
->line
>=0; lv
++)
99 DumpTString(lv
->varname
,D
);
103 static void DumpFunction(TProtoFunc
* tf
, FILE* D
);
105 static void DumpConstants(TProtoFunc
* tf
, FILE* D
)
111 TObject
* o
=tf
->consts
+i
;
116 DumpNumber(nvalue(o
),D
);
119 DumpTString(tsvalue(o
),D
);
122 DumpFunction(tfvalue(o
),D
);
126 default: /* cannot happen */
127 luaL_verror("cannot dump constant #%d: type=%d [%s]",
128 i
,ttype(o
),luaO_typename(o
));
134 static void DumpFunction(TProtoFunc
* tf
, FILE* D
)
136 DumpWord(tf
->lineDefined
,D
);
137 DumpTString(tf
->fileName
,D
);
143 static void DumpHeader(TProtoFunc
* Main
, FILE* D
)
154 void DumpChunk(TProtoFunc
* Main
, FILE* D
)
157 DumpFunction(Main
,D
);