}
}
+function fuzzy_match(original, uglified) {
+ original = original.split(" ", 5);
+ uglified = uglified.split(" ", 5);
+ for (var i = 0; i < 5; i++) {
+ if (original[i] === uglified[i]) continue;
+ var a = +original[i];
+ var b = +uglified[i];
+ if (Math.abs((b - a) / a) < 1e-10) continue;
+ return false;
+ }
+ return true;
+}
+
var fallback_options = [ JSON.stringify({
compress: false,
mangle: false
uglify_code = uglify_code.code;
uglify_result = sandbox.run_code(uglify_code, o.toplevel);
ok = sandbox.same_stdout(original_result, uglify_result);
- if (!ok && o.compress.unsafe_math) {
- ok = sandbox.same_stdout(sandbox.run_code(original_code.replace(/( - 0\.1){3}/g, " - 0.3")), uglify_result, o.toplevel);
+ if (!ok && typeof uglify_result == "string" && o.compress.unsafe_math) {
+ ok = fuzzy_match(original_result, uglify_result);
+ if (!ok) {
+ var fuzzy_result = sandbox.run_code(original_code.replace(/( - 0\.1){3}/g, " - 0.3"));
+ ok = sandbox.same_stdout(fuzzy_result, uglify_result, o.toplevel);
+ }
}
} else {
uglify_code = uglify_code.error;
], {
stdio: [ "ignore", "pipe", "pipe" ]
}).on("exit", respawn);
- var line = "";
+ var stdout = "";
child.stdout.on("data", function(data) {
- line += data;
+ stdout += data;
});
- child.stderr.once("data", function() {
- process.exitCode = 1;
- }).pipe(process.stdout);
+ var stderr = "";
+ child.stderr.on("data", trap).pipe(process.stdout);
var keepAlive = setInterval(function() {
- var end = line.lastIndexOf("\r");
- console.log(line.slice(line.lastIndexOf("\r", end - 1) + 1, end));
- line = line.slice(end + 1);
+ var end = stdout.lastIndexOf("\r");
+ console.log(stdout.slice(stdout.lastIndexOf("\r", end - 1) + 1, end));
+ stdout = stdout.slice(end + 1);
}, ping);
var timer = setTimeout(function() {
clearInterval(keepAlive);
}, endTime - Date.now());
function respawn() {
- console.log(line);
+ console.log(stdout.replace(/[^\r\n]*\r/g, ""));
clearInterval(keepAlive);
clearTimeout(timer);
spawn(endTime);
}
+
+ function trap(data) {
+ stderr += data;
+ if (~stderr.indexOf("\nminify(options):\n")) {
+ process.exitCode = 1;
+ child.stderr.removeListener("data", trap);
+ }
+ }
}