forked from kisonecat/web2js
/
program.js
134 lines (100 loc) · 5.45 KB
/
program.js
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
123
124
125
126
127
128
129
130
131
132
133
'use strict';
var Binaryen = require('binaryen');
var Environment = require('./environment.js');
var Stack = require('./stack.js');
var Memory = require('./memory.js');
var pages = require('../commonMemory').pages;
module.exports = class Program {
constructor(labels,consts,types,vars,pfs,compound, parent) {
this.labels = labels;
this.consts = consts;
this.types = types;
this.vars = vars;
this.pfs = pfs;
this.compound = compound;
this.parent = parent;
this.memory = undefined;
this.stack = undefined;
this.traces = [];
}
generate(environment) {
environment = new Environment(environment);
environment.program = this;
var module = environment.module;
this.memory = new Memory(module, pages);
this.stack = new Stack(module, this.memory);
this.consts.forEach( function(v) {
environment.constants[v.name] = v.expression;
});
this.types.forEach( function(t) {
environment.types[t.name] = t.expression;
});
for(var j in this.vars) {
var v = this.vars[j];
for (var i in v.names) {
var name = v.names[i].name;
var type = environment.resolveType( v.type );
environment.variables[name] = this.memory.allocateVariable( name, type );
}
};
this.pfs.forEach( function(v) {
v.generate(environment);
});
module.addGlobal( "trampoline", Binaryen.i32, true, module.i32.const(-1) );
var e = this.compound.generate(environment);
var main = module.addFunction("main", [], Binaryen.none, [], e);
module.addFunctionExport("main", "main");
module.addFunctionImport( "start_unwind", "asyncify", "start_unwind",
Binaryen.createType([Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "stop_unwind", "asyncify", "stop_unwind",
Binaryen.createType([]), Binaryen.none );
module.addFunctionImport( "start_rewind", "asyncify", "start_rewind",
Binaryen.createType([Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "stop_rewind", "asyncify", "stop_rewind",
Binaryen.createType([]), Binaryen.none );
module.addFunctionImport( "printInteger", "library", "printInteger",
Binaryen.createType([Binaryen.i32,Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "printBoolean", "library", "printBoolean",
Binaryen.createType([Binaryen.i32,Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "printChar", "library", "printChar",
Binaryen.createType([Binaryen.i32,Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "printString", "library", "printString",
Binaryen.createType([Binaryen.i32,Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "printFloat", "library", "printFloat",
Binaryen.createType([Binaryen.i32,Binaryen.f32]), Binaryen.none );
module.addFunctionImport( "printNewline", "library", "printNewline",
Binaryen.createType([Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "reset", "library", "reset",
Binaryen.createType([Binaryen.i32, Binaryen.i32]), Binaryen.i32 );
module.addFunctionImport( "inputln", "library", "inputln",
Binaryen.createType([Binaryen.i32, Binaryen.i32, Binaryen.i32,
Binaryen.i32, Binaryen.i32, Binaryen.i32, Binaryen.i32]),
Binaryen.i32 );
module.addFunctionImport( "rewrite", "library", "rewrite",
Binaryen.createType([Binaryen.i32, Binaryen.i32]), Binaryen.i32 );
module.addFunctionImport( "get", "library", "get",
Binaryen.createType([Binaryen.i32, Binaryen.i32, Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "put", "library", "put",
Binaryen.createType([Binaryen.i32, Binaryen.i32, Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "eof", "library", "eof",
Binaryen.createType([Binaryen.i32]), Binaryen.i32 );
module.addFunctionImport( "eoln", "library", "eoln",
Binaryen.createType([Binaryen.i32]), Binaryen.i32 );
module.addFunctionImport( "erstat", "library", "erstat",
Binaryen.createType([Binaryen.i32]), Binaryen.i32 );
module.addFunctionImport( "close", "library", "close",
Binaryen.createType([Binaryen.i32]), Binaryen.none );
module.addFunctionImport( "getCurrentMinutes", "library", "getCurrentMinutes",
Binaryen.createType([]), Binaryen.i32 );
module.addFunctionImport( "getCurrentDay", "library", "getCurrentDay",
Binaryen.createType([]), Binaryen.i32 );
module.addFunctionImport( "getCurrentMonth", "library", "getCurrentMonth",
Binaryen.createType([]), Binaryen.i32 );
module.addFunctionImport( "getCurrentYear", "library", "getCurrentYear",
Binaryen.createType([]), Binaryen.i32 );
module.addFunctionImport( "tex_final_end", "library", "tex_final_end",
Binaryen.createType([]), Binaryen.none );
this.memory.setup();
return module;
}
};