UNPKG

@neo-one/smart-contract-compiler-esnext-esm

Version:

NEO•ONE TypeScript smart contract compiler.

161 lines (159 loc) 7.4 kB
import { Types } from '../../../constants'; import { TypedHelper } from '../TypedHelper'; export class ToNumberHelper extends TypedHelper { emit(sb, node, optionsIn) { const throwTypeError = (options) => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.throwTypeError); }; const convertNull = () => { sb.emitOp(node, 'DROP'); sb.emitPushInt(node, 0); }; const convertBoolean = (options) => { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitHelper(node, options, sb.helpers.unwrapBoolean); }, whenTrue: () => { sb.emitPushInt(node, 1); }, whenFalse: () => { sb.emitPushInt(node, 0); }, })); }; const convertArray = (options) => { sb.emitHelper(node, options, sb.helpers.toPrimitive({ type: this.type, knownType: Types.Array, preferredType: 'number' })); doConvert(options, false); }; const convertNumber = (options) => { sb.emitHelper(node, options, sb.helpers.unwrapNumber); }; const convertString = (options) => { const n = sb.scope.addUnique(); const remain = sb.scope.addUnique(); const accum = sb.scope.addUnique(); sb.emitHelper(node, options, sb.helpers.unwrapString); sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitPushString(node, ''); sb.emitOp(node, 'EQUAL'); }, whenTrue: () => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.throwTypeError); }, whenFalse: () => { sb.scope.set(sb, node, options, remain); sb.emitPushInt(node, 1); sb.scope.set(sb, node, options, n); sb.emitPushInt(node, 0); sb.scope.set(sb, node, options, accum); sb.emitHelper(node, options, sb.helpers.forLoop({ condition: () => { sb.scope.get(sb, node, options, remain); sb.emitPushString(node, ''); sb.emitOp(node, 'EQUAL'); sb.emitOp(node, 'NOT'); }, each: (innerOptions) => { sb.scope.get(sb, node, innerOptions, remain); sb.emitOp(node, 'DUP'); sb.emitOp(node, 'DUP'); sb.emitOp(node, 'SIZE'); sb.emitOp(node, 'DEC'); sb.emitOp(node, 'LEFT'); sb.scope.set(sb, node, innerOptions, remain); sb.emitPushInt(node, 1); sb.emitOp(node, 'RIGHT'); sb.emitPushInt(node, 0x30); sb.emitOp(node, 'SUB'); sb.emitHelper(node, innerOptions, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitPushInt(node, 9); sb.emitOp(node, 'GT'); }, whenTrue: () => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.throwTypeError); }, whenFalse: () => { sb.emitHelper(node, innerOptions, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitPushInt(node, 0); sb.emitOp(node, 'LT'); }, whenTrue: () => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.throwTypeError); }, })); }, })); sb.scope.get(sb, node, innerOptions, n); sb.emitOp(node, 'DUP'); sb.emitPushInt(node, 10); sb.emitOp(node, 'MUL'); sb.scope.set(sb, node, innerOptions, n); sb.emitOp(node, 'MUL'); sb.scope.get(sb, node, innerOptions, accum); sb.emitOp(node, 'ADD'); sb.scope.set(sb, node, innerOptions, accum); }, cleanup: () => { }, })); sb.scope.get(sb, node, options, accum); }, })); }; const convertObject = (options) => { sb.emitHelper(node, options, sb.helpers.toPrimitive({ type: this.type, knownType: Types.Object, preferredType: 'number' })); doConvert(options, false); }; const doConvert = (options, initial = true) => { sb.emitHelper(node, options, sb.helpers.forBuiltinType({ type: initial ? this.type : undefined, knownType: initial ? this.knownType : undefined, array: initial ? convertArray : throwTypeError, arrayStorage: throwTypeError, boolean: convertBoolean, buffer: throwTypeError, null: convertNull, number: convertNumber, object: initial ? convertObject : throwTypeError, string: convertString, symbol: throwTypeError, undefined: throwTypeError, map: throwTypeError, mapStorage: throwTypeError, set: throwTypeError, setStorage: throwTypeError, error: throwTypeError, forwardValue: throwTypeError, iteratorResult: throwTypeError, iterable: throwTypeError, iterableIterator: throwTypeError, transaction: throwTypeError, output: throwTypeError, attribute: throwTypeError, input: throwTypeError, account: throwTypeError, asset: throwTypeError, contract: throwTypeError, header: throwTypeError, block: throwTypeError, })); }; doConvert(sb.pushValueOptions(optionsIn), true); if (!optionsIn.pushValue) { sb.emitOp(node, 'DROP'); return; } } } //# sourceMappingURL=ToNumberHelper.js.map