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");
47 fwrite("SSBC\r\n\xBC\x55", 8, 1, fp);
48 _put32(0); // Function count, to be filled
49 _put32(0); // String count
50 _put32(0); // String table offset
53 fcn_hdr_offset = ftell(fp);
55 // Create function descriptors
56 for(fcn = Script->Functions; fcn; fcn = fcn->Next, fcn_count ++)
58 _put32( StringList_GetString(&strings, fcn->Name, strlen(fcn->Name)) );
59 _put32( 0 ); // Code offset
61 _put8( fcn->ReturnType );
63 if(fcn->ArgumentCount > 255) {
64 // ERROR: Too many args
67 _put8( fcn->ArgumentCount );
70 for( i = 0; i < fcn->ArgumentCount; i ++ )
72 _put32( StringList_GetString(&strings, fcn->Arguments[i].Name, strlen(fcn->Arguments[i].Name)) );
73 _put8( fcn->Arguments[i].Type );
77 // Put function code in
78 for(fcn = Script->Functions; fcn; fcn = fcn->Next)
85 fseek(fp, SEEK_SET, fcn_hdr_offset + 4);
87 fseek(fp, SEEK_SET, code_pos );
89 fcn_hdr_offset += 4+4+1+1+(4+1)*fcn->ArgumentCount;
92 if( !fcn->BCFcn ) Bytecode_ConvertFunction(fcn);
93 code = Bytecode_SerialiseFunction(fcn->BCFcn, &len, &strings);
94 fwrite(code, len, 1, fp);
99 strtab_ofs = ftell(fp);
101 int string_offset = strtab_ofs + (4+4)*strings.Count;
104 for(str = strings.Head; str; str = str->Next)
107 _put32(string_offset);
108 string_offset += str->Length + 1;
111 for(str = strings.Head; str;)
113 tString *nextstr = str->Next;
114 fwrite(str->Data, str->Length, 1, fp);
124 fseek(fp, 8, SEEK_SET);
126 _put32(strings.Count);