shift-interpreter
Version:
Shift-interpreter is an experimental JavaScript meta-interpreter useful for reverse engineering and analysis. One notable difference from other projects is that shift-interpreter retains state over an entire script but can be fed expressions and statement
53 lines (50 loc) • 1.88 kB
text/typescript
export const binaryOperatorMap = new Map<string, any>([
['+', (l: any, r: any) => l + r()],
['-', (l: any, r: any) => l - r()],
['/', (l: any, r: any) => l / r()],
['*', (l: any, r: any) => l * r()],
['**', (l: any, r: any) => l ** r()],
['==', (l: any, r: any) => l == r()],
['!=', (l: any, r: any) => l != r()],
['===', (l: any, r: any) => l === r()],
['!==', (l: any, r: any) => l !== r()],
['<', (l: any, r: any) => l < r()],
['<=', (l: any, r: any) => l <= r()],
['>', (l: any, r: any) => l > r()],
['>=', (l: any, r: any) => l >= r()],
['in', (l: any, r: any) => l in r()],
['instanceof', (l: any, r: any) => l instanceof r()],
['<<', (l: any, r: any) => l << r()],
['>>', (l: any, r: any) => l >> r()],
['>>>', (l: any, r: any) => l >>> r()],
['%', (l: any, r: any) => l % r()],
[',', (l: any, r: any) => r()],
['||', (l: any, r: any) => l || r()],
['&&', (l: any, r: any) => l && r()],
['|', (l: any, r: any) => l | r()],
['&', (l: any, r: any) => l & r()],
['^', (l: any, r: any) => l ^ r()],
]);
export const unaryOperatorMap = new Map<string, any>([
['+', (oper: any) => +oper],
['-', (oper: any) => -oper],
['!', (oper: any) => !oper],
['~', (oper: any) => ~oper],
['typeof', (oper: any) => typeof oper],
['void', (oper: any) => void oper],
// ["delete", (l: any) => l * r],
]);
export const compoundAssignmentOperatorMap = new Map<string, any>([
['+=', (l: any, r: any) => l + r],
['-=', (l: any, r: any) => l - r],
['/=', (l: any, r: any) => l / r],
['*=', (l: any, r: any) => l * r],
['**=', (l: any, r: any) => l ** r],
['<<=', (l: any, r: any) => l << r],
['>>=', (l: any, r: any) => l >> r],
['>>>=', (l: any, r: any) => l >>> r],
['%=', (l: any, r: any) => l % r],
['|=', (l: any, r: any) => l | r],
['&=', (l: any, r: any) => l & r],
['^=', (l: any, r: any) => l ^ r],
]);