-
Notifications
You must be signed in to change notification settings - Fork 1
/
jmpbuf.js
33 lines (31 loc) · 787 Bytes
/
jmpbuf.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
class JmpBuf {
constructor(base){
this.base = base;
this.nextSpot = 0;
this.buf = new Array(26).fill(0);
}
_nextRaLoc(){
return this.nextSpot;
}
_nextSpLoc() {
return this.nextSpot + 13;
}
_advancePtr() {
this.nextSpot ++;
if(this.nextSpot % 13 === 0) {
this.nextSpot += 13;
this.buf = this.buf.concat(new Array(26).fill(0));
}
}
makeTarget(ra, sp){ //returns what a0 should be
const res = this._nextRaLoc();
this.buf[this._nextRaLoc()] = ra;
this.buf[this._nextSpLoc()] = sp;
this._advancePtr();
return res * 8 + this.base;
}
synthesize() {
return this.buf;
}
}
const jmpBuf = new JmpBuf(0x20000000);