@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
37 lines (35 loc) • 4.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
class JumpTable {
constructor() {
this.mutableJumpNumber = 0;
this.mutableTable = [];
}
add(sb, node, body) {
const jumpNumber = this.mutableJumpNumber;
this.mutableJumpNumber += 1;
const { bytecode } = sb.capture(() => {
body();
});
this.mutableTable.push({ jumpNumber, node, bytecode });
return jumpNumber;
}
emitTable(sb, outerNode) {
this.mutableTable.forEach(({ node, jumpNumber, bytecode }) => {
sb.emitHelper(node, {}, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitPushInt(node, jumpNumber);
sb.emitOp(node, 'NUMEQUAL');
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.emitBytecode(bytecode);
},
}));
});
sb.emitOp(outerNode, 'THROW');
}
}
exports.JumpTable = JumpTable;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkp1bXBUYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLE1BQWEsU0FBUztJQUF0QjtRQUNVLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNiLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztJQWtDbkQsQ0FBQztJQWhDUSxHQUFHLENBQUMsRUFBaUIsRUFBRSxJQUFhLEVBQUUsSUFBZ0I7UUFDM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDNUIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ25DLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV2RCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sU0FBUyxDQUFDLEVBQWlCLEVBQUUsU0FBa0I7UUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUMzRCxFQUFFLENBQUMsVUFBVSxDQUNYLElBQUksRUFDSixFQUFFLEVBQ0YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLEdBQUcsRUFBRTtvQkFDZCxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ2IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3hCLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVCLENBQUM7YUFDRixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBcENELDhCQW9DQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL3NiL0p1bXBUYWJsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgQnl0ZWNvZGUsIFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi9zYic7XG5cbmludGVyZmFjZSBKdW1wUmVzdWx0IHtcbiAgcmVhZG9ubHkgbm9kZTogdHMuTm9kZTtcbiAgcmVhZG9ubHkganVtcE51bWJlcjogbnVtYmVyO1xuICByZWFkb25seSBieXRlY29kZTogQnl0ZWNvZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBKdW1wVGFibGUge1xuICBwcml2YXRlIG11dGFibGVKdW1wTnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhYmxlVGFibGU6IEp1bXBSZXN1bHRbXSA9IFtdO1xuXG4gIHB1YmxpYyBhZGQoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLk5vZGUsIGJvZHk6ICgpID0+IHZvaWQpOiBudW1iZXIge1xuICAgIGNvbnN0IGp1bXBOdW1iZXIgPSB0aGlzLm11dGFibGVKdW1wTnVtYmVyO1xuICAgIHRoaXMubXV0YWJsZUp1bXBOdW1iZXIgKz0gMTtcbiAgICBjb25zdCB7IGJ5dGVjb2RlIH0gPSBzYi5jYXB0dXJlKCgpID0+IHtcbiAgICAgIGJvZHkoKTtcbiAgICB9KTtcbiAgICB0aGlzLm11dGFibGVUYWJsZS5wdXNoKHsganVtcE51bWJlciwgbm9kZSwgYnl0ZWNvZGUgfSk7XG5cbiAgICByZXR1cm4ganVtcE51bWJlcjtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0VGFibGUoc2I6IFNjcmlwdEJ1aWxkZXIsIG91dGVyTm9kZTogdHMuTm9kZSk6IHZvaWQge1xuICAgIHRoaXMubXV0YWJsZVRhYmxlLmZvckVhY2goKHsgbm9kZSwganVtcE51bWJlciwgYnl0ZWNvZGUgfSkgPT4ge1xuICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAge30sXG4gICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGp1bXBOdW1iZXIpO1xuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdOVU1FUVVBTCcpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgICAgICAgc2IuZW1pdEJ5dGVjb2RlKGJ5dGVjb2RlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBzYi5lbWl0T3Aob3V0ZXJOb2RlLCAnVEhST1cnKTtcbiAgfVxufVxuIl19