@neo-one/smart-contract-compiler-esnext-esm
Version:
NEO•ONE TypeScript smart contract compiler.
161 lines (159 loc) • 7.4 kB
JavaScript
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