-
Notifications
You must be signed in to change notification settings - Fork 7
/
wpack.winxed
122 lines (102 loc) · 3.28 KB
/
wpack.winxed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#! winxed
// Tests of pbc generation using the packfile PMCs
//**********************************************************************
function main()
{
// Generate two simple subs, marking the second as main
// Get opcodes used
var oplib = new 'OpLib';
int OP_end = oplib['end'];
int OP_noop = oplib['noop'];
int OP_invokecc_p = oplib['invokecc_p'];
int OP_returncc = oplib['returncc'];
int OP_set_args_pc = oplib['set_args_pc'];
int OP_get_results_pc = oplib['get_results_pc'];
int OP_set_returns_pc = oplib['set_returns_pc'];
int OP_say_sc = oplib['say_sc'];
int OP_set_p_pc = oplib['set_p_pc'];
var packfile = new 'Packfile';
var dir = packfile.get_directory();
say(elements(dir));
var constseg = new 'PackfileConstantTable';
int cstindex = 0;
constseg[cstindex++] = getinterp();
int cst_hello = cstindex;;
constseg[cstindex++] = 'Hello, world!';
int cst_bye = cstindex;
constseg[cstindex++] = 'Bye, world!';
var empty = new 'FixedIntegerArray';
int cstempty = cstindex;
constseg[cstindex++] = empty;
dir['CONSTANT_test.pir'] = constseg;
var code = new 'PackfileRawSegment';
int of = 0;
code[of++] = OP_noop; // Just to annoy
int subhellostart = of;
code[of++] = OP_say_sc;
code[of++] = cst_hello;
code[of++] = OP_set_returns_pc;
code[of++] = cstempty;
code[of++] = OP_returncc;
int subhelloend = of;
var pmcsubhello = new 'Sub'({
"name": "hello",
"subid": "hello",
"ns_entry_name": "hello",
"start_offs": subhellostart,
"end_offs": subhelloend
});
int constsubhello = cstindex;
constseg[cstindex++] = pmcsubhello;
int submainstart = of;
// Call hello
code[of++] = OP_set_p_pc;
code[of++] = 0;
code[of++] = constsubhello;
code[of++] = OP_set_args_pc;
code[of++] = cstempty;
code[of++] = OP_get_results_pc;
code[of++] = cstempty;
code[of++] = OP_invokecc_p;
code[of++] = 0;
code[of++] = OP_say_sc;
code[of++] = cst_bye;
code[of++] = OP_set_returns_pc;
code[of++] = cstempty;
code[of++] = OP_returncc;
int submainend = of;
code[of++] = OP_end;
var pmcsubmain = new 'Sub'({
"name": "main",
"subid": "main",
"ns_entry_name": "main",
"start_offs": submainstart,
"end_offs": submainend,
"n_regs_used": [ 0, 0, 0, 1 ] // Use 1 P register
});
int constsubmain = cstindex;
constseg[cstindex++] = pmcsubmain;
constseg.set_main(constsubmain);
dir['BYTECODE_test.pir'] = code;
dir['BYTECODE_test.pir_ANN'] = new 'PackfileAnnotations';
var fixups = new 'PackfileFixupTable';
dir['FIXUP_test.pir'] = fixups;
var fixuphello = new 'PackfileFixupEntry';
fixuphello =: 'hello';
fixuphello =: constsubhello;
fixuphello.set_type(2);
fixups[0] = fixuphello;
var fixupmain = new 'PackfileFixupEntry';
fixupmain =: 'main';
fixupmain =: constsubmain;
fixupmain.set_type(2);
fixups[1] = fixupmain;
say(elements(dir));
string rawdata = packfile;
say('About to write');
var handle = new 'FileHandle'.open('h.pbc', 'wb');
handle.print(rawdata);
handle.close();
say('Bye');
}
// That's all folks!