UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

37 lines (35 loc) 4.41 kB
"use strict"; 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