3 * by John Hodge (thePowersGang)
6 * - Generate a bytecode file
10 #include "bytecode_gen.h"
21 int SpiderScript_SaveBytecode(tSpiderScript *Script, const char *DestFile)
23 tStringList strings = {0};
24 tScript_Function *fcn;
26 int fcn_hdr_offset = 0;
31 void _put8(uint8_t val)
33 fwrite(&val, 1, 1, fp);
35 void _put32(uint32_t val)
43 fp = fopen(DestFile, "wb");
46 fwrite("SSBC\r\n\xBC\x55", 8, 1, fp);
47 _put32(0); // Function count, to be filled
48 _put32(0); // String count
49 _put32(0); // String table offset
52 fcn_hdr_offset = ftell(fp);
54 // Create function descriptors
55 for(fcn = Script->Functions; fcn; fcn = fcn->Next, fcn_count ++)
57 _put32( StringList_GetString(&strings, fcn->Name, strlen(fcn->Name)) );
58 _put32( 0 ); // Code offset
60 _put8( fcn->ReturnType );
62 if(fcn->ArgumentCount > 255) {
63 // ERROR: Too many args
66 _put8( fcn->ArgumentCount );
69 for( i = 0; i < fcn->ArgumentCount; i ++ )
71 _put32( StringList_GetString(&strings, fcn->Arguments[i].Name, strlen(fcn->Arguments[i].Name)) );
72 _put8( fcn->Arguments[i].Type );
76 // Put function code in
77 for(fcn = Script->Functions; fcn; fcn = fcn->Next)
84 fseek(fp, SEEK_SET, fcn_hdr_offset + 4);
86 fseek(fp, SEEK_SET, code_pos );
88 fcn_hdr_offset += 4+4+1+1+(4+1)*fcn->ArgumentCount;
91 if( !fcn->BCFcn ) Bytecode_ConvertFunction(fcn);
92 code = Bytecode_SerialiseFunction(fcn->BCFcn, &len, &strings);
93 fwrite(code, len, 1, fp);
98 strtab_ofs = ftell(fp);
100 int string_offset = strtab_ofs + (4+4)*strings.Count;
103 for(str = strings.Head; str; str = str->Next)
106 _put32(string_offset);
107 string_offset += str->Length + 1;
110 for(str = strings.Head; str;)
112 tString *nextstr = str->Next;
113 fwrite(str->Data, str->Length, 1, fp);
114 _put8(0); // NULL separator
123 fseek(fp, 8, SEEK_SET);
125 _put32(strings.Count);