@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
80 lines (78 loc) • 13.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const constants = tslib_1.__importStar(require("../../../constants"));
const Helper_1 = require("../Helper");
class ForLoopHelper extends Helper_1.Helper {
constructor({ each, cleanup, condition, incrementor, handleReturn }) {
super();
this.each = each;
this.condition = condition;
this.incrementor = incrementor;
this.handleReturn = handleReturn === undefined ? cleanup : handleReturn;
this.cleanup = cleanup;
}
emit(sb, node, options) {
sb.withProgramCounter((loopPC) => {
if (this.condition !== undefined) {
this.condition();
}
if (!loopPC.getFirst().equals(loopPC.getCurrent())) {
sb.emitJmp(node, 'JMPIFNOT', loopPC.getLast());
}
sb.withProgramCounter((finallyPC) => {
this.each(sb.finallyPCOptions(sb.breakPCOptions(sb.continuePCOptions(sb.noCatchPCOptions(options), finallyPC.getLast()), finallyPC.getLast()), finallyPC.getLast()));
if (this.incrementor !== undefined) {
this.incrementor();
}
sb.emitJmp(node, 'JMP', loopPC.getFirst());
});
sb.emitOp(node, 'DROP');
const condition = (value) => () => {
sb.emitOp(node, 'DUP');
sb.emitPushInt(node, value);
sb.emitOp(node, 'NUMEQUAL');
};
const val = sb.scope.addUnique();
sb.emitHelper(node, options, sb.helpers.case([
{
condition: condition(constants.THROW_COMPLETION),
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.scope.set(sb, node, options, val);
this.handleReturn();
sb.scope.get(sb, node, options, val);
sb.emitHelper(node, options, sb.helpers.throwCompletionBase);
},
},
{
condition: condition(constants.NORMAL_COMPLETION),
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.scope.set(sb, node, options, val);
this.handleReturn();
sb.scope.get(sb, node, options, val);
sb.emitHelper(node, options, sb.helpers.return);
},
},
{
condition: condition(constants.BREAK_COMPLETION),
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DROP');
},
},
], () => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DROP');
if (this.incrementor !== undefined) {
this.incrementor();
}
sb.emitJmp(node, 'JMP', loopPC.getFirst());
}));
});
this.cleanup();
}
}
exports.ForLoopHelper = ForLoopHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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RjthQUNGLEVBQ0QsR0FBRyxFQUFFO2dCQUVILEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUV4QixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNwQjtnQkFDRCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUNGLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQWxIRCxzQ0FrSEMiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvY29tcGlsZS9oZWxwZXIvc3RhdGVtZW50L0Zvckxvb3BIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zYic7XG5pbXBvcnQgeyBWaXNpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXInO1xuXG5leHBvcnQgdHlwZSBGb3JMb29wSGVscGVyRnVuY3Rpb24gPSAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5leHBvcnQgaW50ZXJmYWNlIEZvckxvb3BIZWxwZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZWFjaDogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbiAgcmVhZG9ubHkgY29uZGl0aW9uOiBGb3JMb29wSGVscGVyRnVuY3Rpb247XG4gIHJlYWRvbmx5IGluY3JlbWVudG9yPzogRm9yTG9vcEhlbHBlckZ1bmN0aW9uO1xuICByZWFkb25seSBoYW5kbGVSZXR1cm4/OiBGb3JMb29wSGVscGVyRnVuY3Rpb247XG4gIHJlYWRvbmx5IGNsZWFudXA6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JMb29wSGVscGVyIGV4dGVuZHMgSGVscGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlYWNoOiAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmRpdGlvbjogRm9yTG9vcEhlbHBlckZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY3JlbWVudG9yOiBGb3JMb29wSGVscGVyRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlUmV0dXJuOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsZWFudXA6ICgpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgZWFjaCwgY2xlYW51cCwgY29uZGl0aW9uLCBpbmNyZW1lbnRvciwgaGFuZGxlUmV0dXJuIH06IEZvckxvb3BIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVhY2ggPSBlYWNoO1xuICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHRoaXMuaW5jcmVtZW50b3IgPSBpbmNyZW1lbnRvcjtcbiAgICB0aGlzLmhhbmRsZVJldHVybiA9IGhhbmRsZVJldHVybiA9PT0gdW5kZWZpbmVkID8gY2xlYW51cCA6IGhhbmRsZVJldHVybjtcbiAgICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwO1xuICB9XG5cbiAgcHVibGljIGVtaXQoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLk5vZGUsIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIHNiLndpdGhQcm9ncmFtQ291bnRlcigobG9vcFBDKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxvb3BQQy5nZXRGaXJzdCgpLmVxdWFscyhsb29wUEMuZ2V0Q3VycmVudCgpKSkge1xuICAgICAgICBzYi5lbWl0Sm1wKG5vZGUsICdKTVBJRk5PVCcsIGxvb3BQQy5nZXRMYXN0KCkpO1xuICAgICAgfVxuXG4gICAgICBzYi53aXRoUHJvZ3JhbUNvdW50ZXIoKGZpbmFsbHlQQykgPT4ge1xuICAgICAgICB0aGlzLmVhY2goXG4gICAgICAgICAgc2IuZmluYWxseVBDT3B0aW9ucyhcbiAgICAgICAgICAgIHNiLmJyZWFrUENPcHRpb25zKFxuICAgICAgICAgICAgICBzYi5jb250aW51ZVBDT3B0aW9ucyhzYi5ub0NhdGNoUENPcHRpb25zKG9wdGlvbnMpLCBmaW5hbGx5UEMuZ2V0TGFzdCgpKSxcbiAgICAgICAgICAgICAgZmluYWxseVBDLmdldExhc3QoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaW5hbGx5UEMuZ2V0TGFzdCgpLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5jcmVtZW50b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50b3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNiLmVtaXRKbXAobm9kZSwgJ0pNUCcsIGxvb3BQQy5nZXRGaXJzdCgpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEcm9wIGZpbmFsbHkgY29tcGxldGlvblxuICAgICAgLy8gW2NvbXBsZXRpb24sIHZhbF1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gKHZhbHVlOiBudW1iZXIpID0+ICgpID0+IHtcbiAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgdmFsdWUpO1xuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ05VTUVRVUFMJyk7XG4gICAgICB9O1xuICAgICAgY29uc3QgdmFsID0gc2Iuc2NvcGUuYWRkVW5pcXVlKCk7XG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmNhc2UoXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGNvbmRpdGlvbihjb25zdGFudHMuVEhST1dfQ09NUExFVElPTiksXG4gICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgdmFsKTtcbiAgICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgICBzYi5zY29wZS5nZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dDb21wbGV0aW9uQmFzZSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGNvbmRpdGlvbihjb25zdGFudHMuTk9STUFMX0NPTVBMRVRJT04pLFxuICAgICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgICAgICBzYi5zY29wZS5zZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJldHVybigpO1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2Iuc2NvcGUuZ2V0KHNiLCBub2RlLCBvcHRpb25zLCB2YWwpO1xuICAgICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnJldHVybik7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGNvbmRpdGlvbihjb25zdGFudHMuQlJFQUtfQ09NUExFVElPTiksXG4gICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluY3JlbWVudG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2IuZW1pdEptcChub2RlLCAnSk1QJywgbG9vcFBDLmdldEZpcnN0KCkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0pO1xuICAgIC8vIFtdXG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cbn1cbiJdfQ==