js-confuser 1.2.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -0
- package/README.md +7 -6
- package/dist/options.js +5 -1
- package/dist/parser.js +1 -2
- package/dist/presets.js +2 -2
- package/dist/transforms/calculator.js +48 -60
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +482 -95
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -0
- package/dist/transforms/controlFlowFlattening/{switchCaseObfucation.js → switchCaseObfuscation.js} +2 -2
- package/dist/transforms/deadCode.js +1 -1
- package/dist/transforms/dispatcher.js +14 -13
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +5 -10
- package/dist/transforms/flatten.js +5 -1
- package/dist/transforms/hideInitializingCode.js +17 -2
- package/dist/transforms/identifier/globalConcealing.js +46 -25
- package/dist/transforms/identifier/movedDeclarations.js +69 -68
- package/dist/transforms/identifier/renameVariables.js +22 -98
- package/dist/transforms/identifier/variableAnalysis.js +133 -0
- package/dist/transforms/label.js +11 -2
- package/dist/transforms/lock/antiDebug.js +32 -13
- package/dist/transforms/lock/lock.js +13 -2
- package/dist/transforms/minify.js +117 -120
- package/dist/transforms/opaquePredicates.js +4 -2
- package/dist/transforms/preparation/preparation.js +8 -0
- package/dist/transforms/renameLabels.js +17 -3
- package/dist/transforms/rgf.js +8 -3
- package/dist/transforms/shuffle.js +25 -9
- package/dist/transforms/stack.js +5 -9
- package/dist/transforms/string/encoding.js +209 -0
- package/dist/transforms/string/stringCompression.js +10 -10
- package/dist/transforms/string/stringConcealing.js +94 -65
- package/dist/transforms/string/stringSplitting.js +7 -7
- package/dist/transforms/transform.js +10 -0
- package/dist/traverse.js +1 -35
- package/dist/util/gen.js +3 -1
- package/dist/util/identifiers.js +9 -19
- package/dist/util/insert.js +6 -40
- package/dist/util/scope.js +17 -0
- package/package.json +2 -2
- package/src/options.ts +19 -3
- package/src/parser.ts +1 -2
- package/src/presets.ts +2 -2
- package/src/transforms/calculator.ts +87 -91
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +742 -142
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +6 -0
- package/src/transforms/controlFlowFlattening/{switchCaseObfucation.ts → switchCaseObfuscation.ts} +6 -2
- package/src/transforms/deadCode.ts +8 -0
- package/src/transforms/dispatcher.ts +29 -14
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +43 -19
- package/src/transforms/flatten.ts +15 -2
- package/src/transforms/hideInitializingCode.ts +432 -406
- package/src/transforms/identifier/globalConcealing.ts +148 -46
- package/src/transforms/identifier/movedDeclarations.ts +78 -101
- package/src/transforms/identifier/renameVariables.ts +21 -96
- package/src/transforms/identifier/variableAnalysis.ts +124 -0
- package/src/transforms/label.ts +20 -2
- package/src/transforms/lock/antiDebug.ts +69 -26
- package/src/transforms/lock/lock.ts +37 -3
- package/src/transforms/minify.ts +154 -130
- package/src/transforms/opaquePredicates.ts +25 -3
- package/src/transforms/preparation/preparation.ts +8 -1
- package/src/transforms/renameLabels.ts +26 -3
- package/src/transforms/rgf.ts +6 -1
- package/src/transforms/shuffle.ts +87 -29
- package/src/transforms/stack.ts +6 -8
- package/src/transforms/string/encoding.ts +310 -0
- package/src/transforms/string/stringCompression.ts +37 -24
- package/src/transforms/string/stringConcealing.ts +157 -160
- package/src/transforms/string/stringSplitting.ts +12 -8
- package/src/transforms/transform.ts +15 -2
- package/src/traverse.ts +1 -31
- package/src/util/gen.ts +5 -3
- package/src/util/identifiers.ts +20 -20
- package/src/util/insert.ts +12 -78
- package/src/util/scope.ts +9 -0
- package/test/{transforms/compare.test.ts → compare.test.ts} +2 -2
- package/test/index.test.ts +109 -1
- package/test/templates/template.test.ts +14 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +392 -10
- package/test/transforms/dispatcher.test.ts +30 -0
- package/test/transforms/flatten.test.ts +28 -0
- package/test/transforms/hideInitializingCode.test.ts +336 -336
- package/test/transforms/identifier/globalConcealing.test.ts +1 -2
- package/test/transforms/identifier/movedDeclarations.test.ts +137 -112
- package/test/transforms/identifier/renameVariables.test.ts +124 -13
- package/test/transforms/lock/antiDebug.test.ts +43 -0
- package/test/transforms/lock/selfDefending.test.ts +68 -0
- package/test/transforms/minify.test.ts +137 -0
- package/test/transforms/renameLabels.test.ts +33 -0
- package/test/transforms/rgf.test.ts +29 -0
- package/test/transforms/string/stringSplitting.test.ts +33 -0
- package/test/util/identifiers.test.ts +105 -17
- package/dist/util/expr.js +0 -60
- package/src/util/expr.ts +0 -56
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,174 @@
|
|
|
1
|
+
# `1.4.1`
|
|
2
|
+
AntiDebug Fix
|
|
3
|
+
|
|
4
|
+
- Fixed [#28](https://github.com/MichaelXF/js-confuser/issues/28)
|
|
5
|
+
- - AntiDebug was causing syntax errors in some scenarios, fixed in this version.
|
|
6
|
+
|
|
7
|
+
# `1.4.0`
|
|
8
|
+
Confusing Control Flow
|
|
9
|
+
|
|
10
|
+
- `Control Flow Flattening` overhaul, now flattens embedded control structures
|
|
11
|
+
|
|
12
|
+
- - `If statements`
|
|
13
|
+
- - `For statements`
|
|
14
|
+
- - `While statements`
|
|
15
|
+
- - `Switch statements`
|
|
16
|
+
- - `Do While statements`
|
|
17
|
+
|
|
18
|
+
- - Certain functions
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
// Input
|
|
22
|
+
console.log(1);
|
|
23
|
+
console.log(2);
|
|
24
|
+
console.log(Number("3"));
|
|
25
|
+
|
|
26
|
+
for (var i = 4; i < 6; i++) {
|
|
27
|
+
console.log(i);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var i = 0;
|
|
31
|
+
do {
|
|
32
|
+
console.log(i + 6);
|
|
33
|
+
} while (i++ < 4);
|
|
34
|
+
|
|
35
|
+
// Output
|
|
36
|
+
var a = -123, b = 414, c = -191;
|
|
37
|
+
while (a + b + c != 104) {
|
|
38
|
+
var d = (a + b + c) * -28 + 172;
|
|
39
|
+
switch (d) {
|
|
40
|
+
case -276:
|
|
41
|
+
!(a *= 138 > b ? 2 : 158, a -= -5 < c ? -90 : -152, b *= b + 206, b -= a + -539, c += b + -372);
|
|
42
|
+
break;
|
|
43
|
+
case -2628:
|
|
44
|
+
var e = (console['log'](-106 > c ? 1 : 182), console['log'](a + 125), console['log'](Number('3')), -87 < a ? -189 < a ? -133 : 93 : 107 < c ? 227 : 4);
|
|
45
|
+
~(a *= (-114 > c ? -164 : -107) < c ? -164 : 2, a -= 188 > b ? b + -211 : -369, b += -62 > c ? 168 > c ? -539 : 56 : 26, c += (c + 362 > a ? 73 : -157) < b ? 207 : 341);
|
|
46
|
+
break;
|
|
47
|
+
case -4420:
|
|
48
|
+
+(a *= a + (a + 18), a -= 190 > a ? -344 : 71, b *= -206 < b ? c + -173 : -221, b -= b + 94, c += 89 > b ? -311 : 170);
|
|
49
|
+
break;
|
|
50
|
+
case -3972:
|
|
51
|
+
if (e < c + -144) {
|
|
52
|
+
!(a *= b + 127, a -= b + (b + 671), b += c + 82, c *= 61 < a ? -139 : 2, c -= b + -35);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
typeof (a *= c + -148, a -= c + 271, b += c + 184, c += -89 < c ? -42 : -114);
|
|
56
|
+
break;
|
|
57
|
+
case -3244:
|
|
58
|
+
+(a += a + 220, b += b + 317, c += b + -218);
|
|
59
|
+
break;
|
|
60
|
+
case -4308:
|
|
61
|
+
!(a += 134 < b ? -233 : 89, b += -79 < b ? -69 : -241, c *= -107 > a ? -97 : 2, c -= (56 < a ? -27 : -184) > c ? -163 : 231);
|
|
62
|
+
break;
|
|
63
|
+
case -3664:
|
|
64
|
+
~(a += b + -362, b += -87 < b ? -666 : -172, c += c + 710);
|
|
65
|
+
break;
|
|
66
|
+
case -5344:
|
|
67
|
+
+(a *= c + (-165 < a ? -266 : 182) > c ? 124 : 2, a -= -154 > b ? c + 92 : -388, b += c + -193, c *= c + (c + -30), c -= a + -11);
|
|
68
|
+
break;
|
|
69
|
+
case -2572:
|
|
70
|
+
if (e++ < ((-125 < a ? -62 : 87) < c ? -112 : 4)) {
|
|
71
|
+
~(a += c + -268, b += 215 < b ? 136 : 18 < b ? -233 : 536, c += b + -535);
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
~(a *= (123 > a ? -105 : 238) < b ? 216 : 2, a -= a + 57, b *= a + 59, b -= a + -369, c *= b + -236, c -= 200 > c ? -288 : -11);
|
|
75
|
+
break;
|
|
76
|
+
case -4784:
|
|
77
|
+
+(console['log'](e), a *= c + -223, a -= 7 > c ? -227 > b ? -4 : 192 : -157, b *= a + (-186 > b ? 211 : 17), b -= -127 > c ? 76 : 280, c *= -63 > c ? a + 264 : 2, c -= (119 < c ? -206 : 85) < a ? 215 : 179);
|
|
78
|
+
break;
|
|
79
|
+
case -724:
|
|
80
|
+
void (console['log'](e + (c + -246)), a *= -177 < c ? 2 : 207, a -= 152 > a ? 122 : -190, b *= c + -250, b -= b + 160, c += -141 < a ? a + 258 : 21);
|
|
81
|
+
break;
|
|
82
|
+
case -3804:
|
|
83
|
+
var e = -143 > a ? 0 : 24;
|
|
84
|
+
typeof (a += c + -9, b += c + 125, c += a + -261);
|
|
85
|
+
break;
|
|
86
|
+
case -1648:
|
|
87
|
+
~(e++, a += a + 3, b *= c + 68, b -= 89 < b ? -173 > b ? -147 : 267 : -228 > c ? -80 : -216 > b ? 93 : 68, c += 65 > a ? b + 156 : 216);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- New encoding type `Hex Table`
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
"{0x7E494534,0x688,0x7E6D53,0x401,0x7E584D4B,0x688,0x7E775853,0x688,0x7E5333,0x81}"
|
|
97
|
+
|
|
98
|
+
// => "Hello World"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- Improvements to renaming labels
|
|
102
|
+
- Fixed [#24](https://github.com/MichaelXF/js-confuser/issues/24)
|
|
103
|
+
- Fixed [#25](https://github.com/MichaelXF/js-confuser/issues/25)
|
|
104
|
+
- Fixed [#26](https://github.com/MichaelXF/js-confuser/issues/26)
|
|
105
|
+
|
|
106
|
+
# `1.3.0`
|
|
107
|
+
String Splitting Improvement
|
|
108
|
+
|
|
109
|
+
- `String Splitting` now supports percentages and a custom callback. ([#22](https://github.com/MichaelXF/js-confuser/issues/22))
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
{
|
|
113
|
+
// percentage
|
|
114
|
+
stringSplitting: 0.75, // = 75%
|
|
115
|
+
|
|
116
|
+
// exclude certain strings
|
|
117
|
+
stringSplitting: (str)=>{
|
|
118
|
+
if ( str == "dont-split-string" ) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
# `1.2.2`
|
|
128
|
+
Global name fix
|
|
129
|
+
|
|
130
|
+
- **Bug fix**: `Rename Variables` breaking access to global variables
|
|
131
|
+
|
|
132
|
+
```js
|
|
133
|
+
// Say `a` is a global library
|
|
134
|
+
// Input
|
|
135
|
+
function myFunction(param1){
|
|
136
|
+
a(param1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Output on 1.2.1
|
|
140
|
+
function a(a){
|
|
141
|
+
a(a);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Output on 1.2.2
|
|
145
|
+
function b(b){
|
|
146
|
+
a(b);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
- **Bug fix**: `Flatten` to not accidentally remove function parameters
|
|
151
|
+
- **Bug fix**: `Dispatcher` on function calls within classes
|
|
152
|
+
- **Bug fix**: `Minify` fixed syntax error
|
|
153
|
+
|
|
154
|
+
```js
|
|
155
|
+
// Input
|
|
156
|
+
var o = {Infinity: 0};
|
|
157
|
+
|
|
158
|
+
// Output on 1.2.1
|
|
159
|
+
var o = {1/0: 0};
|
|
160
|
+
|
|
161
|
+
// Output on 1.2.2
|
|
162
|
+
var o = {[1/0]: 0};
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- Added `base32` encoding to `String Concealing`
|
|
166
|
+
- `Minify` improvements
|
|
167
|
+
- - `true` -> `!0`
|
|
168
|
+
- - `false` -> `!1`
|
|
169
|
+
- Subtle changes to `String Compression`
|
|
170
|
+
- Updated presets
|
|
171
|
+
|
|
1
172
|
# `1.2.1`
|
|
2
173
|
Bug fixes
|
|
3
174
|
|
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ JS-Confuser is a JavaScript obfuscation tool to make your programs _impossible_
|
|
|
14
14
|
## Presets
|
|
15
15
|
|
|
16
16
|
JS-Confuser comes with three presets built into the obfuscator.
|
|
17
|
+
|
|
17
18
|
| Preset | Transforms | Performance Reduction | Sample |
|
|
18
19
|
| --- | --- | --- | --- |
|
|
19
20
|
| High | 21/22 | 98% | [Sample](https://github.com/MichaelXF/js-confuser/blob/master/samples/high.js) |
|
|
@@ -254,7 +255,9 @@ Use a number to control the percentage of strings.
|
|
|
254
255
|
|
|
255
256
|
### `stringSplitting`
|
|
256
257
|
|
|
257
|
-
[String Splitting](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-splitting) splits your strings into multiple expressions. (`true/false`)
|
|
258
|
+
[String Splitting](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-splitting) splits your strings into multiple expressions. (`true/false/0-1`)
|
|
259
|
+
|
|
260
|
+
Use a number to control the percentage of strings.
|
|
258
261
|
|
|
259
262
|
`"console"` -> `String.fromCharCode(99) + 'ons' + 'ole'`
|
|
260
263
|
|
|
@@ -539,11 +542,11 @@ function iVQoGQD(...iVQoGQD){
|
|
|
539
542
|
renameVariables: true,
|
|
540
543
|
renameGlobals: true,
|
|
541
544
|
shuffle: { hash: 0.5, true: 0.5 },
|
|
545
|
+
stack: true,
|
|
542
546
|
stringConcealing: true,
|
|
543
547
|
stringCompression: true,
|
|
544
548
|
stringEncoding: true,
|
|
545
549
|
stringSplitting: 0.75,
|
|
546
|
-
stack: true,
|
|
547
550
|
|
|
548
551
|
// Use at own risk
|
|
549
552
|
eval: false,
|
|
@@ -563,7 +566,6 @@ function iVQoGQD(...iVQoGQD){
|
|
|
563
566
|
deadCode: 0.025,
|
|
564
567
|
dispatcher: 0.75,
|
|
565
568
|
duplicateLiteralsRemoval: 0.5,
|
|
566
|
-
flatten: true,
|
|
567
569
|
globalConcealing: true,
|
|
568
570
|
identifierGenerator: "randomized",
|
|
569
571
|
minify: true,
|
|
@@ -573,6 +575,7 @@ function iVQoGQD(...iVQoGQD){
|
|
|
573
575
|
renameVariables: true,
|
|
574
576
|
renameGlobals: true,
|
|
575
577
|
shuffle: true,
|
|
578
|
+
stack: 0.5,
|
|
576
579
|
stringConcealing: true,
|
|
577
580
|
stringSplitting: 0.25
|
|
578
581
|
}
|
|
@@ -591,8 +594,6 @@ function iVQoGQD(...iVQoGQD){
|
|
|
591
594
|
deadCode: 0.01,
|
|
592
595
|
dispatcher: 0.5,
|
|
593
596
|
duplicateLiteralsRemoval: true,
|
|
594
|
-
flatten: true,
|
|
595
|
-
globalConcealing: true,
|
|
596
597
|
identifierGenerator: "randomized",
|
|
597
598
|
minify: true,
|
|
598
599
|
movedDeclarations: true,
|
|
@@ -600,7 +601,7 @@ function iVQoGQD(...iVQoGQD){
|
|
|
600
601
|
opaquePredicates: 0.1,
|
|
601
602
|
renameVariables: true,
|
|
602
603
|
renameGlobals: true,
|
|
603
|
-
stringConcealing:
|
|
604
|
+
stringConcealing: true
|
|
604
605
|
}
|
|
605
606
|
```
|
|
606
607
|
|
package/dist/options.js
CHANGED
|
@@ -12,7 +12,7 @@ var _presets = _interopRequireDefault(require("./presets"));
|
|
|
12
12
|
|
|
13
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
14
|
|
|
15
|
-
const validProperties = new Set(["preset", "target", "indent", "compact", "minify", "es5", "renameVariables", "renameGlobals", "identifierGenerator", "nameRecycling", "controlFlowFlattening", "hideInitializingCode", "globalConcealing", "stringCompression", "stringConcealing", "stringEncoding", "stringSplitting", "duplicateLiteralsRemoval", "dispatcher", "eval", "rgf", "objectExtraction", "flatten", "deadCode", "calculator", "lock", "movedDeclarations", "opaquePredicates", "shuffle", "stack", "verbose", "debugComments"]);
|
|
15
|
+
const validProperties = new Set(["preset", "target", "indent", "compact", "minify", "es5", "renameVariables", "renameGlobals", "identifierGenerator", "nameRecycling", "controlFlowFlattening", "hideInitializingCode", "globalConcealing", "stringCompression", "stringConcealing", "stringEncoding", "stringSplitting", "duplicateLiteralsRemoval", "dispatcher", "eval", "rgf", "objectExtraction", "flatten", "deadCode", "calculator", "lock", "movedDeclarations", "opaquePredicates", "shuffle", "stack", "verbose", "globalVariables", "debugComments"]);
|
|
16
16
|
const validOses = new Set(["windows", "linux", "osx", "ios", "android"]);
|
|
17
17
|
const validBrowsers = new Set(["firefox", "chrome", "iexplorer", "edge", "safari", "opera"]);
|
|
18
18
|
|
|
@@ -105,6 +105,10 @@ async function correctOptions(options) {
|
|
|
105
105
|
|
|
106
106
|
if (options.globalVariables && !(options.globalVariables instanceof Set)) {
|
|
107
107
|
options.globalVariables = new Set(Object.keys(options.globalVariables));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (options.lock && options.lock.selfDefending) {
|
|
111
|
+
options.compact = true; // self defending forcibly enables this
|
|
108
112
|
} // options.globalVariables was never used.
|
|
109
113
|
// GlobalConcealing implicitly determines a global to be a variable referenced but never defined or modified.
|
|
110
114
|
|
package/dist/parser.js
CHANGED
package/dist/presets.js
CHANGED
|
@@ -50,11 +50,11 @@ const highPreset = {
|
|
|
50
50
|
hash: 0.5,
|
|
51
51
|
true: 0.5
|
|
52
52
|
},
|
|
53
|
+
stack: true,
|
|
53
54
|
stringConcealing: true,
|
|
54
55
|
stringCompression: true,
|
|
55
56
|
stringEncoding: true,
|
|
56
57
|
stringSplitting: 0.75,
|
|
57
|
-
stack: true,
|
|
58
58
|
// Use at own risk
|
|
59
59
|
eval: false,
|
|
60
60
|
rgf: false
|
|
@@ -73,7 +73,6 @@ const mediumPreset = {
|
|
|
73
73
|
deadCode: 0.025,
|
|
74
74
|
dispatcher: 0.75,
|
|
75
75
|
duplicateLiteralsRemoval: 0.5,
|
|
76
|
-
flatten: true,
|
|
77
76
|
globalConcealing: true,
|
|
78
77
|
identifierGenerator: "randomized",
|
|
79
78
|
minify: true,
|
|
@@ -83,6 +82,7 @@ const mediumPreset = {
|
|
|
83
82
|
renameVariables: true,
|
|
84
83
|
renameGlobals: true,
|
|
85
84
|
shuffle: true,
|
|
85
|
+
stack: 0.5,
|
|
86
86
|
stringConcealing: true,
|
|
87
87
|
stringSplitting: 0.25
|
|
88
88
|
};
|
|
@@ -11,8 +11,6 @@ var _gen = require("../util/gen");
|
|
|
11
11
|
|
|
12
12
|
var _insert = require("../util/insert");
|
|
13
13
|
|
|
14
|
-
var _traverse = require("../traverse");
|
|
15
|
-
|
|
16
14
|
var _random = require("../util/random");
|
|
17
15
|
|
|
18
16
|
var _order = require("../order");
|
|
@@ -43,76 +41,66 @@ class Calculator extends _transform.default {
|
|
|
43
41
|
this.gen = this.getGenerator();
|
|
44
42
|
}
|
|
45
43
|
|
|
44
|
+
apply(tree) {
|
|
45
|
+
super.apply(tree);
|
|
46
|
+
|
|
47
|
+
if (Object.keys(this.ops).length == 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
var opArg = this.getPlaceholder();
|
|
52
|
+
var leftArg = this.getPlaceholder();
|
|
53
|
+
var rightArg = this.getPlaceholder();
|
|
54
|
+
var switchCases = [];
|
|
55
|
+
Object.keys(this.ops).forEach(operator => {
|
|
56
|
+
var code = this.ops[operator];
|
|
57
|
+
var factory = operator == "&&" || operator == "||" ? _gen.LogicalExpression : _gen.BinaryExpression;
|
|
58
|
+
var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
|
|
59
|
+
switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
|
|
60
|
+
});
|
|
61
|
+
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [opArg, leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(opArg), switchCases)]);
|
|
62
|
+
(0, _insert.prepend)(tree, func);
|
|
63
|
+
}
|
|
64
|
+
|
|
46
65
|
match(object, parents) {
|
|
47
|
-
return object.type == "
|
|
66
|
+
return object.type == "BinaryExpression";
|
|
48
67
|
}
|
|
49
68
|
|
|
50
69
|
transform(object, parents) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
var block = (0, _traverse.getBlock)(object, parents);
|
|
54
|
-
|
|
55
|
-
if (Object.keys(this.ops).length == 0) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
var opArg = this.getPlaceholder();
|
|
60
|
-
var leftArg = this.getPlaceholder();
|
|
61
|
-
var rightArg = this.getPlaceholder();
|
|
62
|
-
var switchCases = [];
|
|
63
|
-
Object.keys(this.ops).forEach(operator => {
|
|
64
|
-
var code = this.ops[operator];
|
|
65
|
-
var factory = operator == "&&" || operator == "||" ? _gen.LogicalExpression : _gen.BinaryExpression;
|
|
66
|
-
var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
|
|
67
|
-
switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
|
|
68
|
-
});
|
|
69
|
-
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [opArg, leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(opArg), switchCases)]);
|
|
70
|
-
(0, _insert.prepend)(block, func);
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (object.type == "BinaryExpression") {
|
|
75
|
-
var operator = object.operator;
|
|
70
|
+
var operator = object.operator;
|
|
71
|
+
var allowedOperators = new Set(["+", "-", "*", "/"]);
|
|
76
72
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"*": 1,
|
|
81
|
-
"/": 1
|
|
82
|
-
}[object.operator]) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
73
|
+
if (!allowedOperators.has(operator)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
85
76
|
|
|
86
|
-
|
|
87
|
-
|
|
77
|
+
var myPrecedence = _precedence.OPERATOR_PRECEDENCE[operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(operator) / 100;
|
|
78
|
+
var precedences = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100); // corrupt AST
|
|
88
79
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
80
|
+
if (precedences.find(x => x >= myPrecedence)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
92
83
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
84
|
+
if (parents.find(x => x.$dispatcherSkip || x.type == "BinaryExpression")) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
97
87
|
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
return () => {
|
|
89
|
+
if (typeof this.ops[operator] !== "number") {
|
|
90
|
+
var newState;
|
|
100
91
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
92
|
+
do {
|
|
93
|
+
newState = (0, _random.getRandomInteger)(-1000, 1000 + Object.keys(this.ops).length * 5);
|
|
94
|
+
} while (this.statesUsed.has(newState));
|
|
104
95
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
96
|
+
(0, _assert.ok)(!isNaN(newState));
|
|
97
|
+
this.statesUsed.add(newState);
|
|
98
|
+
this.ops[operator] = newState;
|
|
99
|
+
this.log(operator, "calc(".concat(newState, ", left, right)"));
|
|
100
|
+
}
|
|
110
101
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}]));
|
|
114
|
-
};
|
|
115
|
-
}
|
|
102
|
+
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [(0, _gen.Literal)(this.ops[operator]), object.left, object.right]));
|
|
103
|
+
};
|
|
116
104
|
}
|
|
117
105
|
|
|
118
106
|
}
|