UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

55 lines (53 loc) 8.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const typescript_1 = tslib_1.__importDefault(require("typescript")); const constants = tslib_1.__importStar(require("../../../constants")); const Helper_1 = require("../Helper"); const isValidParent = (catchPC, finallyPC, node) => node !== undefined && ((typescript_1.default.isTryStatement(node) && (catchPC !== undefined || finallyPC !== undefined)) || ts_utils_1.tsUtils.guards.isFunctionLikeDeclarationBase(node) || typescript_1.default.isArrowFunction(node) || typescript_1.default.isSourceFile(node)); class ThrowCompletionBaseHelper extends Helper_1.Helper { emit(sb, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); const finallyPC = options.finallyPC; const catchPC = options.catchPC; let parent = ts_utils_1.tsUtils.node.getParent(node); while (parent !== undefined && !isValidParent(catchPC, finallyPC, parent)) { parent = ts_utils_1.tsUtils.node.getParent(parent); } if (catchPC !== undefined) { sb.emitPushInt(node, constants.THROW_COMPLETION); sb.emitJmp(node, 'JMP', catchPC); } else if (finallyPC !== undefined) { sb.emitPushInt(node, constants.THROW_COMPLETION); sb.emitPushInt(node, constants.FINALLY_COMPLETION); sb.emitJmp(node, 'JMP', finallyPC); } else if (typescript_1.default.isSourceFile(node) || (parent !== undefined && typescript_1.default.isSourceFile(parent))) { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitHelper(node, options, sb.helpers.invocationIsCaller); }, whenTrue: () => { sb.emitOp(node, 'THROW'); }, whenFalse: () => { sb.emitPushBoolean(node, false); sb.emitOp(node, 'RET'); }, })); } else { sb.emitPushInt(node, constants.THROW_COMPLETION); sb.emitOp(node, 'RET'); } } } exports.ThrowCompletionBaseHelper = ThrowCompletionBaseHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRocm93Q29tcGxldGlvbkJhc2VIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTRDO0FBQzVDLG9FQUE0QjtBQUM1QixzRUFBZ0Q7QUFJaEQsc0NBQW1DO0FBRW5DLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBd0IsRUFBRSxTQUEwQixFQUFFLElBQWMsRUFBRSxFQUFFLENBQzdGLElBQUksS0FBSyxTQUFTO0lBQ2xCLENBQUMsQ0FBQyxvQkFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLGtCQUFPLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQztRQUNsRCxvQkFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDeEIsb0JBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUkzQixNQUFhLHlCQUEwQixTQUFRLGVBQU07SUFDNUMsSUFBSSxDQUFDLEVBQWlCLEVBQUUsSUFBYSxFQUFFLFNBQXVCO1FBQ25FLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsa0JBQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBd0IsQ0FBQztRQUVqRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUN6RSxNQUFNLEdBQUcsa0JBQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3pCLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNsQzthQUFNLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUVsQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVqRCxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNuRCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDcEM7YUFBTSxJQUFJLG9CQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQ3JGLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxVQUFVLENBQ1gsSUFBSSxFQUNKLE9BQU8sRUFDUCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWixTQUFTLEVBQUUsR0FBRyxFQUFFO29CQUNkLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtvQkFDYixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxTQUFTLEVBQUUsR0FBRyxFQUFFO29CQUNkLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekIsQ0FBQzthQUNGLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztDQUNGO0FBM0NELDhEQTJDQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9jb21wbGV0aW9uUmVjb3JkL1Rocm93Q29tcGxldGlvbkJhc2VIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBQcm9ncmFtQ291bnRlciB9IGZyb20gJy4uLy4uL3BjJztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zYic7XG5pbXBvcnQgeyBWaXNpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXInO1xuXG5jb25zdCBpc1ZhbGlkUGFyZW50ID0gKGNhdGNoUEM/OiBQcm9ncmFtQ291bnRlciwgZmluYWxseVBDPzogUHJvZ3JhbUNvdW50ZXIsIG5vZGU/OiB0cy5Ob2RlKSA9PlxuICBub2RlICE9PSB1bmRlZmluZWQgJiZcbiAgKCh0cy5pc1RyeVN0YXRlbWVudChub2RlKSAmJiAoY2F0Y2hQQyAhPT0gdW5kZWZpbmVkIHx8IGZpbmFsbHlQQyAhPT0gdW5kZWZpbmVkKSkgfHxcbiAgICB0c1V0aWxzLmd1YXJkcy5pc0Z1bmN0aW9uTGlrZURlY2xhcmF0aW9uQmFzZShub2RlKSB8fFxuICAgIHRzLmlzQXJyb3dGdW5jdGlvbihub2RlKSB8fFxuICAgIHRzLmlzU291cmNlRmlsZShub2RlKSk7XG5cbi8vIElucHV0OiBbZXJyb3JWYWxdXG4vLyBPdXRwdXQ6IFtdXG5leHBvcnQgY2xhc3MgVGhyb3dDb21wbGV0aW9uQmFzZUhlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHB1YmxpYyBlbWl0KHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKG9wdGlvbnNJbik7XG4gICAgY29uc3QgZmluYWxseVBDID0gb3B0aW9ucy5maW5hbGx5UEM7XG4gICAgY29uc3QgY2F0Y2hQQyA9IG9wdGlvbnMuY2F0Y2hQQztcbiAgICBsZXQgcGFyZW50ID0gdHNVdGlscy5ub2RlLmdldFBhcmVudChub2RlKSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICAgIHdoaWxlIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiAhaXNWYWxpZFBhcmVudChjYXRjaFBDLCBmaW5hbGx5UEMsIHBhcmVudCkpIHtcbiAgICAgIHBhcmVudCA9IHRzVXRpbHMubm9kZS5nZXRQYXJlbnQocGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2F0Y2hQQyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzYi5lbWl0UHVzaEludChub2RlLCBjb25zdGFudHMuVEhST1dfQ09NUExFVElPTik7XG4gICAgICBzYi5lbWl0Sm1wKG5vZGUsICdKTVAnLCBjYXRjaFBDKTtcbiAgICB9IGVsc2UgaWYgKGZpbmFsbHlQQyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBbdGhyb3csIHZhbF1cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbnN0YW50cy5USFJPV19DT01QTEVUSU9OKTtcbiAgICAgIC8vIFtmaW5hbGx5LCB0aHJvdywgdmFsXVxuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgY29uc3RhbnRzLkZJTkFMTFlfQ09NUExFVElPTik7XG4gICAgICBzYi5lbWl0Sm1wKG5vZGUsICdKTVAnLCBmaW5hbGx5UEMpO1xuICAgIH0gZWxzZSBpZiAodHMuaXNTb3VyY2VGaWxlKG5vZGUpIHx8IChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiB0cy5pc1NvdXJjZUZpbGUocGFyZW50KSkpIHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5pZih7XG4gICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaW52b2NhdGlvbklzQ2FsbGVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1RIUk9XJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHNiLmVtaXRQdXNoQm9vbGVhbihub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1JFVCcpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgY29uc3RhbnRzLlRIUk9XX0NPTVBMRVRJT04pO1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdSRVQnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==