UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

112 lines (110 loc) 17.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const utils_1 = require("@neo-one/utils"); const typescript_1 = tslib_1.__importDefault(require("typescript")); const constants = tslib_1.__importStar(require("../../constants")); const NodeCompiler_1 = require("../NodeCompiler"); class TryStatementCompiler extends NodeCompiler_1.NodeCompiler { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.TryStatement; } visitNode(sb, node, options) { const catchClause = ts_utils_1.tsUtils.statement.getCatchClause(node); const finallyBlock = ts_utils_1.tsUtils.statement.getFinallyBlock(node); const pushFinally = () => { if (finallyBlock !== undefined) { sb.emitPushInt(node, constants.FINALLY_COMPLETION); sb.emitPushInt(node, constants.FINALLY_COMPLETION); sb.emitPushInt(node, constants.FINALLY_COMPLETION); } }; sb.withProgramCounter((finallyPC) => { sb.withProgramCounter((catchPC) => { let pcOptions = catchClause === undefined ? sb.noCatchPCOptions(options) : sb.catchPCOptions(options, catchPC.getLast()); pcOptions = finallyBlock === undefined ? pcOptions : sb.finallyPCOptions(pcOptions, finallyPC.getLast()); sb.visit(ts_utils_1.tsUtils.statement.getTryBlock(node), pcOptions); pushFinally(); sb.emitJmp(node, 'JMP', finallyPC.getLast()); }); const finallyOptions = finallyBlock === undefined ? options : sb.finallyPCOptions(options, finallyPC.getLast()); if (catchClause !== undefined) { const variable = ts_utils_1.tsUtils.statement.getOnlyVariableDeclaration(catchClause); sb.emitOp(node, 'DROP'); if (variable === undefined) { sb.emitOp(node, 'DROP'); sb.visit(ts_utils_1.tsUtils.statement.getBlock(catchClause), finallyOptions); } else { sb.withScope(node, finallyOptions, (innerOptions) => { sb.visit(variable, sb.setValueOptions(innerOptions)); sb.visit(ts_utils_1.tsUtils.statement.getBlock(catchClause), innerOptions); }); } pushFinally(); } }); if (finallyBlock !== undefined) { const completion = sb.scope.addUnique(); const val = sb.scope.addUnique(); sb.emitOp(finallyBlock, 'DROP'); sb.scope.set(sb, finallyBlock, options, completion); sb.scope.set(sb, finallyBlock, options, val); sb.visit(finallyBlock, options); sb.scope.get(sb, finallyBlock, options, completion); const condition = (value) => () => { sb.emitOp(finallyBlock, 'DUP'); sb.emitPushInt(finallyBlock, value); sb.emitOp(finallyBlock, 'NUMEQUAL'); }; sb.emitHelper(finallyBlock, options, sb.helpers.case([ { condition: condition(constants.FINALLY_COMPLETION), whenTrue: () => { sb.emitOp(finallyBlock, 'DROP'); }, }, { condition: condition(constants.THROW_COMPLETION), whenTrue: () => { sb.emitOp(finallyBlock, 'DROP'); sb.scope.get(sb, finallyBlock, options, val); sb.emitHelper(finallyBlock, options, sb.helpers.throwCompletionBase); }, }, { condition: condition(constants.NORMAL_COMPLETION), whenTrue: () => { sb.emitOp(finallyBlock, 'DROP'); sb.scope.get(sb, finallyBlock, options, val); sb.emitHelper(finallyBlock, options, sb.helpers.return); }, }, options.breakPC === undefined ? undefined : { condition: condition(constants.BREAK_COMPLETION), whenTrue: () => { sb.emitOp(finallyBlock, 'DROP'); sb.emitHelper(finallyBlock, options, sb.helpers.break); }, }, options.continuePC === undefined ? undefined : { condition: condition(constants.CONTINUE_COMPLETION), whenTrue: () => { sb.emitOp(finallyBlock, 'DROP'); sb.emitHelper(finallyBlock, options, sb.helpers.continue); }, }, ].filter(utils_1.utils.notNull), () => { sb.emitOp(finallyBlock, 'DROP'); })); } } } exports.TryStatementCompiler = TryStatementCompiler; //# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxDQUFDO29CQUMxRCxDQUFDO2lCQUNGO2dCQUNELE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUztvQkFDM0IsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDO3dCQUNFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO3dCQUNoRCxRQUFRLEVBQUUsR0FBRyxFQUFFOzRCQUNiLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUNoQyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekQsQ0FBQztxQkFDRjtnQkFDTCxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVM7b0JBQzlCLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQzt3QkFDRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDbkQsUUFBUSxFQUFFLEdBQUcsRUFBRTs0QkFDYixFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQzs0QkFDaEMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzVELENBQUM7cUJBQ0Y7YUFDTixDQUFDLE1BQU0sQ0FBQyxhQUFLLENBQUMsT0FBTyxDQUFDLEVBQ3ZCLEdBQUcsRUFBRTtnQkFDSCxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQ0YsQ0FDRixDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0Y7QUEzSEQsb0RBMkhDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvc3RhdGVtZW50L1RyeVN0YXRlbWVudENvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQG5lby1vbmUvdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFRyeVN0YXRlbWVudENvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlRyeVN0YXRlbWVudD4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuVHJ5U3RhdGVtZW50O1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLlRyeVN0YXRlbWVudCwgb3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgY2F0Y2hDbGF1c2UgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXRDYXRjaENsYXVzZShub2RlKTtcbiAgICBjb25zdCBmaW5hbGx5QmxvY2sgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXRGaW5hbGx5QmxvY2sobm9kZSk7XG5cbiAgICBjb25zdCBwdXNoRmluYWxseSA9ICgpID0+IHtcbiAgICAgIGlmIChmaW5hbGx5QmxvY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBbZmluYWxseV1cbiAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgY29uc3RhbnRzLkZJTkFMTFlfQ09NUExFVElPTik7XG4gICAgICAgIC8vIFtmaW5hbGx5LCBmaW5hbGx5XVxuICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCBjb25zdGFudHMuRklOQUxMWV9DT01QTEVUSU9OKTtcbiAgICAgICAgLy8gW2ZpbmFsbHksIGZpbmFsbHksIGZpbmFsbHldXG4gICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbnN0YW50cy5GSU5BTExZX0NPTVBMRVRJT04pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzYi53aXRoUHJvZ3JhbUNvdW50ZXIoKGZpbmFsbHlQQykgPT4ge1xuICAgICAgc2Iud2l0aFByb2dyYW1Db3VudGVyKChjYXRjaFBDKSA9PiB7XG4gICAgICAgIGxldCBwY09wdGlvbnMgPVxuICAgICAgICAgIGNhdGNoQ2xhdXNlID09PSB1bmRlZmluZWQgPyBzYi5ub0NhdGNoUENPcHRpb25zKG9wdGlvbnMpIDogc2IuY2F0Y2hQQ09wdGlvbnMob3B0aW9ucywgY2F0Y2hQQy5nZXRMYXN0KCkpO1xuICAgICAgICBwY09wdGlvbnMgPSBmaW5hbGx5QmxvY2sgPT09IHVuZGVmaW5lZCA/IHBjT3B0aW9ucyA6IHNiLmZpbmFsbHlQQ09wdGlvbnMocGNPcHRpb25zLCBmaW5hbGx5UEMuZ2V0TGFzdCgpKTtcbiAgICAgICAgc2IudmlzaXQodHNVdGlscy5zdGF0ZW1lbnQuZ2V0VHJ5QmxvY2sobm9kZSksIHBjT3B0aW9ucyk7XG4gICAgICAgIHB1c2hGaW5hbGx5KCk7XG4gICAgICAgIHNiLmVtaXRKbXAobm9kZSwgJ0pNUCcsIGZpbmFsbHlQQy5nZXRMYXN0KCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZpbmFsbHlPcHRpb25zID0gZmluYWxseUJsb2NrID09PSB1bmRlZmluZWQgPyBvcHRpb25zIDogc2IuZmluYWxseVBDT3B0aW9ucyhvcHRpb25zLCBmaW5hbGx5UEMuZ2V0TGFzdCgpKTtcbiAgICAgIGlmIChjYXRjaENsYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlID0gdHNVdGlscy5zdGF0ZW1lbnQuZ2V0T25seVZhcmlhYmxlRGVjbGFyYXRpb24oY2F0Y2hDbGF1c2UpO1xuICAgICAgICAvLyBbdmFsXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBbXVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgc2IudmlzaXQodHNVdGlscy5zdGF0ZW1lbnQuZ2V0QmxvY2soY2F0Y2hDbGF1c2UpLCBmaW5hbGx5T3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2Iud2l0aFNjb3BlKG5vZGUsIGZpbmFsbHlPcHRpb25zLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IudmlzaXQodmFyaWFibGUsIHNiLnNldFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi52aXNpdCh0c1V0aWxzLnN0YXRlbWVudC5nZXRCbG9jayhjYXRjaENsYXVzZSksIGlubmVyT3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoRmluYWxseSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZpbmFsbHlCbG9jayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0aW9uID0gc2Iuc2NvcGUuYWRkVW5pcXVlKCk7XG4gICAgICBjb25zdCB2YWwgPSBzYi5zY29wZS5hZGRVbmlxdWUoKTtcbiAgICAgIC8vIFtjb21wbGV0aW9uLCB2YWxdXG4gICAgICBzYi5lbWl0T3AoZmluYWxseUJsb2NrLCAnRFJPUCcpO1xuICAgICAgLy8gW3ZhbF1cbiAgICAgIHNiLnNjb3BlLnNldChzYiwgZmluYWxseUJsb2NrLCBvcHRpb25zLCBjb21wbGV0aW9uKTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5zY29wZS5zZXQoc2IsIGZpbmFsbHlCbG9jaywgb3B0aW9ucywgdmFsKTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi52aXNpdChmaW5hbGx5QmxvY2ssIG9wdGlvbnMpO1xuICAgICAgLy8gW2NvbXBsZXRpb25dXG4gICAgICBzYi5zY29wZS5nZXQoc2IsIGZpbmFsbHlCbG9jaywgb3B0aW9ucywgY29tcGxldGlvbik7XG5cbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9ICh2YWx1ZTogbnVtYmVyKSA9PiAoKSA9PiB7XG4gICAgICAgIHNiLmVtaXRPcChmaW5hbGx5QmxvY2ssICdEVVAnKTtcbiAgICAgICAgc2IuZW1pdFB1c2hJbnQoZmluYWxseUJsb2NrLCB2YWx1ZSk7XG4gICAgICAgIHNiLmVtaXRPcChmaW5hbGx5QmxvY2ssICdOVU1FUVVBTCcpO1xuICAgICAgfTtcbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIGZpbmFsbHlCbG9jayxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5jYXNlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24oY29uc3RhbnRzLkZJTkFMTFlfQ09NUExFVElPTiksXG4gICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKGZpbmFsbHlCbG9jaywgJ0RST1AnKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uKGNvbnN0YW50cy5USFJPV19DT01QTEVUSU9OKSxcbiAgICAgICAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AoZmluYWxseUJsb2NrLCAnRFJPUCcpO1xuICAgICAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgZmluYWxseUJsb2NrLCBvcHRpb25zLCB2YWwpO1xuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZmluYWxseUJsb2NrLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRocm93Q29tcGxldGlvbkJhc2UpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24oY29uc3RhbnRzLk5PUk1BTF9DT01QTEVUSU9OKSxcbiAgICAgICAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AoZmluYWxseUJsb2NrLCAnRFJPUCcpO1xuICAgICAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgZmluYWxseUJsb2NrLCBvcHRpb25zLCB2YWwpO1xuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZmluYWxseUJsb2NrLCBvcHRpb25zLCBzYi5oZWxwZXJzLnJldHVybik7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9ucy5icmVha1BDID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBjb25kaXRpb246IGNvbmRpdGlvbihjb25zdGFudHMuQlJFQUtfQ09NUExFVElPTiksXG4gICAgICAgICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzYi5lbWl0T3AoZmluYWxseUJsb2NrLCAnRFJPUCcpO1xuICAgICAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKGZpbmFsbHlCbG9jaywgb3B0aW9ucywgc2IuaGVscGVycy5icmVhayk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zLmNvbnRpbnVlUEMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uKGNvbnN0YW50cy5DT05USU5VRV9DT01QTEVUSU9OKSxcbiAgICAgICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChmaW5hbGx5QmxvY2ssICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZmluYWxseUJsb2NrLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNvbnRpbnVlKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLmZpbHRlcih1dGlscy5ub3ROdWxsKSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0T3AoZmluYWxseUJsb2NrLCAnRFJPUCcpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19