aboutsummaryrefslogtreecommitdiff
path: root/test/ufuzz/index.js
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-01-22 18:00:26 +0000
committerGitHub <noreply@github.com>2021-01-23 02:00:26 +0800
commitc0614654d9d6730fa46e010b6f9ad41206144730 (patch)
tree51afd86f0746105645179c97eb9f2a3d3f14e88c /test/ufuzz/index.js
parent0358637725bd6d4e7a7dab6bc4d11909cbc520d9 (diff)
downloadtracifyjs-c0614654d9d6730fa46e010b6f9ad41206144730.tar.gz
tracifyjs-c0614654d9d6730fa46e010b6f9ad41206144730.zip
improve `ufuzz` on destructuring (#4580)
Diffstat (limited to 'test/ufuzz/index.js')
-rw-r--r--test/ufuzz/index.js42
1 files changed, 33 insertions, 9 deletions
diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js
index 6dc2c63e..a6784ee7 100644
--- a/test/ufuzz/index.js
+++ b/test/ufuzz/index.js
@@ -431,6 +431,14 @@ function createAssignmentPairs(recurmax, stmtDepth, canThrow, nameLenBefore, was
unique_vars.length = len;
return pairs;
+ function mapShuffled(array, fn) {
+ var result = [];
+ for (var i = array.length; --i >= 0;) {
+ result.splice(rng(result.length + 1), 0, fn(array[i], i));
+ }
+ return result;
+ }
+
function convertToRest(names) {
var last = names.length - 1;
if (last >= 0 && SUPPORT.rest && rng(20) == 0) {
@@ -561,19 +569,24 @@ function createAssignmentPairs(recurmax, stmtDepth, canThrow, nameLenBefore, was
}
});
fill(function() {
- var last = pairs.names.length - 1, has_rest = false;
- var s = pairs.names.map(function(name, index) {
+ var last = pairs.names.length - 1, rest;
+ if (last >= 0 && !(last in keys) && SUPPORT.rest_object && rng(20) == 0) {
+ rest = pairs.names.pop();
+ if (!/=/.test(rest)) rest = "..." + rest;
+ }
+ var s = mapShuffled(pairs.names, function(name, index) {
if (index in keys) return keys[index] + ": " + name;
- if (index == last && SUPPORT.rest_object && rng(20) == 0 && name.indexOf("=") < 0) {
- has_rest = true;
- return "..." + name;
- }
return rng(10) == 0 ? name : createKey(recurmax, keys) + ": " + name;
- }).join(", ");
- if (!has_rest) s = addTrailingComma(s);
+ });
+ if (rest) {
+ s.push(rest);
+ s = s.join(", ");
+ } else {
+ s = addTrailingComma(s.join(", "));
+ }
names.unshift("{ " + s + " }" + createDefaultValue(recurmax, noDefault));
}, function() {
- values.unshift("{ " + addTrailingComma(pairs.values.map(function(value, index) {
+ values.unshift("{ " + addTrailingComma(mapShuffled(pairs.values, function(value, index) {
var key = index in keys ? keys[index] : createKey(recurmax, keys);
return key + ": " + value;
}).join(", ")) + " }");
@@ -1807,6 +1820,10 @@ function is_error_recursion(ex) {
return ex.name == "RangeError" && /Invalid string length|Maximum call stack size exceeded/.test(ex.message);
}
+function is_error_destructuring(ex) {
+ return ex.name == "TypeError" && /^Cannot destructure /.test(ex.message);
+}
+
function patch_try_catch(orig, toplevel) {
var stack = [ {
code: orig,
@@ -1865,6 +1882,9 @@ function patch_try_catch(orig, toplevel) {
} else if (is_error_recursion(result)) {
index = result.ufuzz_try;
return orig.slice(0, index) + 'throw new Error("skipping infinite recursion");' + orig.slice(index);
+ } else if (is_error_destructuring(result)) {
+ index = result.ufuzz_catch;
+ return orig.slice(0, index) + result.ufuzz_var + ' = new Error("cannot destructure");' + orig.slice(index);
}
}
stack.filled = true;
@@ -1971,6 +1991,10 @@ for (var round = 1; round <= num_iterations; round++) {
if (!ok && errored && is_error_recursion(original_result)) {
if (is_error_recursion(uglify_result) || typeof uglify_result == "string") ok = true;
}
+ // ignore difference in error message caused by destructuring
+ if (!ok && errored && is_error_destructuring(uglify_result) && is_error_destructuring(original_result)) {
+ ok = true;
+ }
// ignore errors above when caught by try-catch
if (!ok) {
var orig_skipped = patch_try_catch(original_code, toplevel);