UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

78 lines (76 loc) 13 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 NodeCompiler_1 = require("../NodeCompiler"); class SwitchStatementCompiler extends NodeCompiler_1.NodeCompiler { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.SwitchStatement; } visitNode(sb, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); sb.withProgramCounter((pc) => { const switchExpr = ts_utils_1.tsUtils.expression.getExpression(node); const switchExprType = sb.context.analysis.getType(switchExpr); const breakOptions = sb.breakPCOptions(sb.noPushValueOptions(options), pc.getLast()); const caseBlock = ts_utils_1.tsUtils.statement.getCaseBlock(node); const clauses = ts_utils_1.tsUtils.statement.getClauses(caseBlock); const { found: defaultFound, statements: defaultClauseStatements } = clauses.reduce((acc, clause) => { const { found, statements } = acc; if (found) { return { found, statements: statements.concat(ts_utils_1.tsUtils.statement.getStatements(clause)), }; } if (typescript_1.default.isDefaultClause(clause)) { return { found: true, statements: ts_utils_1.tsUtils.statement.getStatements(clause) }; } return { found: false, statements }; }, { found: false, statements: [] }); const matched = sb.scope.addUnique(); const val = sb.scope.addUnique(); sb.visit(switchExpr, options); sb.scope.set(sb, node, options, val); sb.emitPushBoolean(switchExpr, false); sb.scope.set(sb, node, options, matched); clauses.forEach((clause) => { if (typescript_1.default.isDefaultClause(clause)) { return; } sb.emitHelper(clause, options, sb.helpers.if({ condition: () => { const expr = ts_utils_1.tsUtils.expression.getExpression(clause); sb.scope.get(sb, node, options, val); sb.visit(expr, options); sb.emitHelper(expr, options, sb.helpers.equalsEqualsEquals({ leftType: switchExprType, rightType: sb.context.analysis.getType(expr), })); sb.scope.get(sb, node, options, matched); sb.emitOp(node, 'BOOLOR'); }, whenTrue: () => { sb.emitPushBoolean(node, true); sb.scope.set(sb, node, options, matched); ts_utils_1.tsUtils.statement.getStatements(clause).forEach((statement) => { sb.visit(statement, breakOptions); }); }, })); }); if (defaultFound) { defaultClauseStatements.forEach((statement) => { sb.visit(statement, breakOptions); }); } sb.emitPushInt(node, constants.BREAK_COMPLETION); }); sb.emitOp(node, 'DROP'); } } exports.SwitchStatementCompiler = SwitchStatementCompiler; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN3aXRjaFN0YXRlbWVudENvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE0QztBQUM1QyxvRUFBNEI7QUFDNUIsbUVBQTZDO0FBQzdDLGtEQUErQztBQVMvQyxNQUFhLHVCQUF3QixTQUFRLDJCQUFnQztJQUE3RTs7UUFDa0IsU0FBSSxHQUFHLG9CQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztJQWtHdkQsQ0FBQztJQWhHUSxTQUFTLENBQUMsRUFBaUIsRUFBRSxJQUF3QixFQUFFLFNBQXVCO1FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMzQixNQUFNLFVBQVUsR0FBRyxrQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUQsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXJGLE1BQU0sU0FBUyxHQUFHLGtCQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxNQUFNLE9BQU8sR0FBRyxrQkFBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEQsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDakYsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLEtBQUssRUFB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QVMsRUFBRSxFQUFFOzRCQUM1RCxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDcEMsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztpQkFDRixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUM1QyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBR0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBbkdELDBEQW1HQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL3N0YXRlbWVudC9Td2l0Y2hTdGF0ZW1lbnRDb21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5vZGVDb21waWxlciB9IGZyb20gJy4uL05vZGVDb21waWxlcic7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbnRlcmZhY2UgRGVmYXVsdEFjY3VtIHtcbiAgcmVhZG9ubHkgZm91bmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFN3aXRjaFN0YXRlbWVudENvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlN3aXRjaFN0YXRlbWVudD4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuU3dpdGNoU3RhdGVtZW50O1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLlN3aXRjaFN0YXRlbWVudCwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIHNiLndpdGhQcm9ncmFtQ291bnRlcigocGMpID0+IHtcbiAgICAgIGNvbnN0IHN3aXRjaEV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihub2RlKTtcbiAgICAgIGNvbnN0IHN3aXRjaEV4cHJUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHN3aXRjaEV4cHIpO1xuXG4gICAgICBjb25zdCBicmVha09wdGlvbnMgPSBzYi5icmVha1BDT3B0aW9ucyhzYi5ub1B1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksIHBjLmdldExhc3QoKSk7XG5cbiAgICAgIGNvbnN0IGNhc2VCbG9jayA9IHRzVXRpbHMuc3RhdGVtZW50LmdldENhc2VCbG9jayhub2RlKTtcbiAgICAgIGNvbnN0IGNsYXVzZXMgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXRDbGF1c2VzKGNhc2VCbG9jayk7XG4gICAgICBjb25zdCB7IGZvdW5kOiBkZWZhdWx0Rm91bmQsIHN0YXRlbWVudHM6IGRlZmF1bHRDbGF1c2VTdGF0ZW1lbnRzIH0gPSBjbGF1c2VzLnJlZHVjZTxEZWZhdWx0QWNjdW0+KFxuICAgICAgICAoYWNjLCBjbGF1c2UpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZvdW5kLCBzdGF0ZW1lbnRzIH0gPSBhY2M7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBmb3VuZCxcbiAgICAgICAgICAgICAgc3RhdGVtZW50czogc3RhdGVtZW50cy5jb25jYXQodHNVdGlscy5zdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cyhjbGF1c2UpKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRzLmlzRGVmYXVsdENsYXVzZShjbGF1c2UpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RhdGVtZW50czogdHNVdGlscy5zdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cyhjbGF1c2UpIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHsgZm91bmQ6IGZhbHNlLCBzdGF0ZW1lbnRzIH07XG4gICAgICAgIH0sXG4gICAgICAgIHsgZm91bmQ6IGZhbHNlLCBzdGF0ZW1lbnRzOiBbXSB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWF0Y2hlZCA9IHNiLnNjb3BlLmFkZFVuaXF1ZSgpO1xuICAgICAgY29uc3QgdmFsID0gc2Iuc2NvcGUuYWRkVW5pcXVlKCk7XG5cbiAgICAgIC8vIFt2YWxdXG4gICAgICBzYi52aXNpdChzd2l0Y2hFeHByLCBvcHRpb25zKTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5zY29wZS5zZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAvLyBbbWF0Y2hlZF1cbiAgICAgIHNiLmVtaXRQdXNoQm9vbGVhbihzd2l0Y2hFeHByLCBmYWxzZSk7XG4gICAgICAvLyBbXVxuICAgICAgc2Iuc2NvcGUuc2V0KHNiLCBub2RlLCBvcHRpb25zLCBtYXRjaGVkKTtcbiAgICAgIC8vIFtdXG4gICAgICBjbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgICBpZiAodHMuaXNEZWZhdWx0Q2xhdXNlKGNsYXVzZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIGNsYXVzZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihjbGF1c2UpO1xuICAgICAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgICAgICBzYi5zY29wZS5nZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAgICAgICAgIC8vIFtjbGF1c2VWYWwsIHZhbF1cbiAgICAgICAgICAgICAgc2IudmlzaXQoZXhwciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgIGV4cHIsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLmVxdWFsc0VxdWFsc0VxdWFscyh7XG4gICAgICAgICAgICAgICAgICBsZWZ0VHlwZTogc3dpdGNoRXhwclR5cGUsXG4gICAgICAgICAgICAgICAgICByaWdodFR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShleHByKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIGJvb2xlYW5dXG4gICAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgbm9kZSwgb3B0aW9ucywgbWF0Y2hlZCk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0JPT0xPUicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFt0cnVlXVxuICAgICAgICAgICAgICBzYi5lbWl0UHVzaEJvb2xlYW4obm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgbWF0Y2hlZCk7XG4gICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldFN0YXRlbWVudHMoY2xhdXNlKS5mb3JFYWNoKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzYi52aXNpdChzdGF0ZW1lbnQsIGJyZWFrT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVmYXVsdEZvdW5kKSB7XG4gICAgICAgIGRlZmF1bHRDbGF1c2VTdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgIHNiLnZpc2l0KHN0YXRlbWVudCwgYnJlYWtPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbnN0YW50cy5CUkVBS19DT01QTEVUSU9OKTtcbiAgICB9KTtcblxuICAgIC8vIFtdXG4gICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gIH1cbn1cbiJdfQ==