aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-12-31 13:10:05 +0800
committerGitHub <noreply@github.com>2019-12-31 13:10:05 +0800
commit99ac73a635d641935331e71d519c24297b50dd32 (patch)
tree20951dddabf14fc146adb80fd98e44deb2a3ee81
parenta2e4c2fd979782c1dd526fc1ac0b14490adb3344 (diff)
downloadtracifyjs-99ac73a635d641935331e71d519c24297b50dd32.tar.gz
tracifyjs-99ac73a635d641935331e71d519c24297b50dd32.zip
enhance `booleans` (#3661)
-rw-r--r--lib/ast.js5
-rw-r--r--lib/compress.js29
-rw-r--r--test/compress/collapse_vars.js4
-rw-r--r--test/compress/transform.js1
4 files changed, 23 insertions, 16 deletions
diff --git a/lib/ast.js b/lib/ast.js
index 11d1f361..f2052350 100644
--- a/lib/ast.js
+++ b/lib/ast.js
@@ -964,12 +964,13 @@ TreeWalker.prototype = {
in_boolean_context: function() {
var self = this.self();
for (var i = 0, p; p = this.parent(i); i++) {
- if (p instanceof AST_SimpleStatement
- || p instanceof AST_Conditional && p.condition === self
+ if (p instanceof AST_Conditional && p.condition === self
|| p instanceof AST_DWLoop && p.condition === self
|| p instanceof AST_For && p.condition === self
|| p instanceof AST_If && p.condition === self
|| p instanceof AST_Return && p.in_bool
+ || p instanceof AST_Sequence && p.tail_node() !== self
+ || p instanceof AST_SimpleStatement
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
return true;
}
diff --git a/lib/compress.js b/lib/compress.js
index 3f6bc893..38d09068 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -2021,6 +2021,7 @@ merge(Compressor.prototype, {
if (stat instanceof AST_If && stat.body instanceof AST_Return) {
var value = stat.body.value;
+ var in_bool = stat.body.in_bool || next instanceof AST_Return && next.in_bool;
//---
// pretty silly case, but:
// if (foo()) return; return; => foo(); return;
@@ -2034,7 +2035,7 @@ merge(Compressor.prototype, {
}
//---
// if (foo()) return x; return y; => return foo() ? x : y;
- if (value && !stat.alternative && next instanceof AST_Return && next.value) {
+ if ((in_bool || value) && !stat.alternative && next instanceof AST_Return) {
CHANGED = true;
stat = stat.clone();
stat.alternative = next;
@@ -2044,16 +2045,13 @@ merge(Compressor.prototype, {
}
//---
// if (foo()) return x; [ return ; ] => return foo() ? x : undefined;
- if (value && !stat.alternative
- && (!next && in_lambda && multiple_if_returns
- || next instanceof AST_Return)) {
+ if (!stat.alternative && !next && in_lambda && (in_bool || value && multiple_if_returns)) {
CHANGED = true;
stat = stat.clone();
- stat.alternative = next || make_node(AST_Return, stat, {
+ stat.alternative = make_node(AST_Return, stat, {
value: null
});
statements.splice(i, 1, stat.transform(compressor));
- if (next) statements.splice(j, 1);
continue;
}
//---
@@ -5104,13 +5102,17 @@ merge(Compressor.prototype, {
if (self.body instanceof AST_Exit
&& self.alternative instanceof AST_Exit
&& self.body.TYPE == self.alternative.TYPE) {
- return make_node(self.body.CTOR, self, {
+ var exit = make_node(self.body.CTOR, self, {
value: make_node(AST_Conditional, self, {
condition : self.condition,
consequent : self.body.value || make_node(AST_Undefined, self.body),
alternative : self.alternative.value || make_node(AST_Undefined, self.alternative)
- }).transform(compressor)
- }).optimize(compressor);
+ })
+ });
+ if (exit instanceof AST_Return) {
+ exit.in_bool = self.body.in_bool || self.alternative.in_bool;
+ }
+ return exit;
}
if (self.body instanceof AST_If
&& !self.body.alternative
@@ -7321,12 +7323,15 @@ merge(Compressor.prototype, {
&& node.expression instanceof AST_Constant
&& !node.expression.value);
}
- // AST_False or !1
+ // AST_False or !1 or void 0
function is_false(node) {
return node instanceof AST_False
|| in_bool
- && node instanceof AST_Constant
- && !node.value
+ && (node instanceof AST_Constant
+ && !node.value
+ || node instanceof AST_UnaryPrefix
+ && node.operator == "void"
+ && !node.expression.has_side_effects(compressor))
|| (node instanceof AST_UnaryPrefix
&& node.operator == "!"
&& node.expression instanceof AST_Constant
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 796fdb3f..a5975279 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -5863,8 +5863,8 @@ issue_2974: {
var c = 0;
(function(b) {
var a = 2;
- for (; b.null = -4, c++, b.null && --a > 0;);
- })(!0),
+ for (;c++, (!0).null && --a > 0;);
+ })(),
console.log(c);
}
expect_stdout: "1"
diff --git a/test/compress/transform.js b/test/compress/transform.js
index 867b8ade..66f19bd1 100644
--- a/test/compress/transform.js
+++ b/test/compress/transform.js
@@ -103,6 +103,7 @@ if_return: {
booleans: true,
conditionals: true,
if_return: true,
+ passes: 2,
sequences: true,
side_effects: true,
}
ewise. * gnu/packages/terminals.scm (foot)[arguments]: Likewise. * gnu/packages/virtualization.scm (qemu)[native-inputs]: Change from MESON-NEXT to MESON. (libvirt)[arguments]: Remove #:meson. * gnu/packages/wm.scm (wlroots, sway)[arguments]: Likewise. 2021-05-15Merge branch 'master' into core-updatesLudovic Courtès 2021-05-13gnu: gn: Build with Python 3.Marius Bakke * gnu/packages/build-tools.scm (gn)[native-inputs]: Change from PYTHON-2 to PYTHON-WRAPPER. [arguments]: Remove trailing #t's and make some cosmetic changes. 2021-04-16Merge remote-tracking branch 'origin/master' into core-updatesEfraim Flashner Conflicts: gnu/local.mk gnu/packages/boost.scm gnu/packages/chez.scm gnu/packages/compression.scm gnu/packages/crates-io.scm gnu/packages/docbook.scm gnu/packages/engineering.scm gnu/packages/gcc.scm gnu/packages/gl.scm gnu/packages/gtk.scm gnu/packages/nettle.scm gnu/packages/python-check.scm gnu/packages/python-xyz.scm gnu/packages/radio.scm gnu/packages/rust.scm gnu/packages/sqlite.scm guix/build-system/node.scm 2021-04-11gnu: meson@0.57: Update to 0.57.2.Tobias Geerinckx-Rice * gnu/packages/build-tools.scm (meson-next): Update to 0.57.2. 2021-04-10gnu: meson-for-build: Remove package.宋文武 It was removed in commit f2b22801, but a merge (2aab587f) add it wrongly again. 2021-03-27gnu: Add build.Maxim Cournoyer * gnu/packages/build-tools.scm (build): New variable. Co-authored-by: Raghav Gururajan <rg@raghavgururajan.name> 2021-03-24Merge remote-tracking branch 'origin/master' into core-updatesEfraim Flashner 2021-03-16gnu: Add meson-next.Maxim Cournoyer * gnu/packages/build-tools.scm (meson-next): New variable. 2021-03-10gnu: osc: Update to 0.172.0 [fixes CVE-2019-3681].Léo Le Bouter * gnu/packages/build-tools.scm (osc): Update to 0.172.0. [native-inputs]: Add python-chardet. Required by tests. 2021-03-06Merge branch 'master' into core-updatesChristopher Baines 2021-03-02gnu: Add bmake.qblade * gnu/packages/build-tools.scm (bmake): New variable. Signed-off-by: Nicolas Goaziou <mail@nicolasgoaziou.fr> 2021-02-01gnu: meson-for-build: Remove package.Maxim Cournoyer The meson-for-build package doesn't carry any special patch anymore; it appears to be obsolete. * gnu/packages/build-tools.scm (meson-for-build): Remove variable. * guix/build-system/meson.scm (default-meson): Use meson. * doc/guix.texi (Build Systems): Update doc. 2021-02-01gnu: meson-0.55: Update to 0.55.3.Maxim Cournoyer * gnu/packages/build-tools.scm (meson-0.55): Update to 0.55.3. 2021-02-01gnu: meson: Update to 0.56.2.Maxim Cournoyer * gnu/packages/build-tools.scm (meson): Update to 0.56.2. acc# modified: gnu/packages/build-tools.scm 2021-01-13Merge branch 'staging' into 'core-updates'.Maxim Cournoyer Conflicts: gnu/local.mk gnu/packages/cmake.scm gnu/packages/curl.scm gnu/packages/gl.scm gnu/packages/glib.scm gnu/packages/guile.scm gnu/packages/node.scm gnu/packages/openldap.scm gnu/packages/package-management.scm gnu/packages/python-xyz.scm gnu/packages/python.scm gnu/packages/tls.scm gnu/packages/vpn.scm gnu/packages/xorg.scm 2020-12-20gnu: bear: Update to 3.0.4.Brett Gilio * gnu/local.mk (bear-disable-preinstall-tests.patch): Add patch. * gnu/packages/build-tools.scm (bear): Reference patch, and update. 2020-11-29Merge remote-tracking branch 'origin/master' into core-updatesChristopher Baines 2020-11-16gnu: bam: Cross-compile.Efraim Flashner * gnu/packages/build-tools.scm (bam)[arguments]: Use cc-for-target in make-flags. 2020-11-16gnu: premake4: Cross compile.Efraim Flashner * gnu/packages/build-tools.scm (premake4)[arguments]: Use cc-for-target in make-flags. 2020-10-19Merge branch 'staging'Maxim Cournoyer Conflicts: gnu/packages/admin.scm gnu/packages/commencement.scm gnu/packages/gdb.scm gnu/packages/llvm.scm gnu/packages/package-management.scm gnu/packages/tls.scm 2020-10-19gnu: gn: Update to 0.0-1819.e327ffd.Marius Bakke * gnu/packages/build-tools.scm (gn): Update to 0.0-1819.e327ffd. 2020-09-14Merge remote-tracking branch 'origin/master' into core-updatesMaxim Cournoyer 2020-09-14gnu: bear: Update to 2.4.4.Tobias Geerinckx-Rice * gnu/packages/build-tools.scm (bear): Update to 2.4.4. 2020-09-13gnu: Add meson 0.55.1.Alexandros Theodotou * gnu/packages/build-tools.scm (meson-0.55): New variable. Co-authored-by: Ludovic Courtès <ludo@gnu.org> 2020-09-10gnu: meson: Update to 0.55.1.Alexandros Theodotou * gnu/packages/build-tools.scm (meson): Update to 0.55.1. * gnu/packages/patches/meson-for-build-rpath.patch: Remove. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. Signed-off-by: Ludovic Courtès <ludo@gnu.org> 2020-07-12gnu: Remove ".git" from "https://github/…/….git".Ludovic Courtès Until now, 'lookup-origin' and thus 'lookup-origin-revision' in (guix swh) would sometimes return #f for these because the ".git" URLs are redirects to the non-".git" URLs. Consequently, 'guix lint -c archival' would keep saying "scheduled Software Heritage archival"; likewise, the fallback download code would fail. * gnu/packages/ada.scm, gnu/packages/admin.scm, gnu/packages/aidc.scm, gnu/packages/algebra.scm, gnu/packages/android.scm, gnu/packages/animation.scm, gnu/packages/arcan.scm, gnu/packages/assembly.scm, gnu/packages/audio.scm, gnu/packages/authentication.scm, gnu/packages/avr.scm, gnu/packages/axoloti.scm, gnu/packages/backup.scm, gnu/packages/bash.scm, gnu/packages/benchmark.scm, gnu/packages/bioconductor.scm, gnu/packages/bioinformatics.scm, gnu/packages/bittorrent.scm, gnu/packages/boost.scm, gnu/packages/build-tools.scm, gnu/packages/c.scm, gnu/packages/calendar.scm, gnu/packages/cdrom.scm, gnu/packages/check.scm, gnu/packages/chemistry.scm, gnu/packages/chez.scm, gnu/packages/clojure.scm, gnu/packages/code.scm, gnu/packages/compression.scm, gnu/packages/compton.scm, gnu/packages/coq.scm, gnu/packages/cpp.scm, gnu/packages/cran.scm, gnu/packages/crypto.scm, gnu/packages/curl.scm, gnu/packages/databases.scm, gnu/packages/datastructures.scm, gnu/packages/debug.scm, gnu/packages/disk.scm, gnu/packages/distributed.scm, gnu/packages/django.scm, gnu/packages/dlang.scm, gnu/packages/dns.scm, gnu/packages/docker.scm, gnu/packages/education.scm, gnu/packages/efi.scm, gnu/packages/elixir.scm, gnu/packages/emacs-xyz.scm, gnu/packages/embedded.scm, gnu/packages/emulators.scm, gnu/packages/engineering.scm, gnu/packages/erlang.scm, gnu/packages/fabric-management.scm, gnu/packages/file-systems.scm, gnu/packages/finance.scm, gnu/packages/firmware.scm, gnu/packages/flashing-tools.scm, gnu/packages/fonts.scm, gnu/packages/fontutils.scm, gnu/packages/fpga.scm, gnu/packages/game-development.scm, gnu/packages/games.scm, gnu/packages/genealogy.scm, gnu/packages/genimage.scm, gnu/packages/geo.scm, gnu/packages/gimp.scm, gnu/packages/gl.scm, gnu/packages/gnome-xyz.scm, gnu/packages/gnome.scm, gnu/packages/gnuzilla.scm, gnu/packages/golang.scm, gnu/packages/gpodder.scm, gnu/packages/graph.scm, gnu/packages/graphics.scm, gnu/packages/graphviz.scm, gnu/packages/groff.scm, gnu/packages/groovy.scm, gnu/packages/gtk.scm, gnu/packages/guile-xyz.scm, gnu/packages/guile.scm, gnu/packages/hardware.scm, gnu/packages/haskell-apps.scm, gnu/packages/haskell-xyz.scm, gnu/packages/hexedit.scm, gnu/packages/i2p.scm, gnu/packages/ibus.scm, gnu/packages/image-processing.scm, gnu/packages/image-viewers.scm, gnu/packages/image.scm, gnu/packages/ipfs.scm, gnu/packages/java-graphics.scm, gnu/packages/java-maths.scm, gnu/packages/java.scm, gnu/packages/javascript.scm, gnu/packages/jrnl.scm, gnu/packages/julia.scm, gnu/packages/jupyter.scm, gnu/packages/kodi.scm, gnu/packages/language.scm, gnu/packages/lego.scm, gnu/packages/less.scm, gnu/packages/libusb.scm, gnu/packages/linux.scm, gnu/packages/lirc.scm, gnu/packages/lisp-xyz.scm, gnu/packages/llvm.scm, gnu/packages/logging.scm, gnu/packages/lolcode.scm, gnu/packages/lua.scm, gnu/packages/lxde.scm, gnu/packages/lxqt.scm, gnu/packages/machine-learning.scm, gnu/packages/mail.scm, gnu/packages/markup.scm, gnu/packages/maths.scm, gnu/packages/maven.scm, gnu/packages/mes.scm, gnu/packages/messaging.scm, gnu/packages/monitoring.scm, gnu/packages/mpd.scm, gnu/packages/music.scm, gnu/packages/networking.scm, gnu/packages/node-xyz.scm, gnu/packages/ocaml.scm, gnu/packages/ocr.scm, gnu/packages/onc-rpc.scm, gnu/packages/opencl.scm, gnu/packages/opencog.scm, gnu/packages/pantheon.scm, gnu/packages/password-utils.scm, gnu/packages/patchutils.scm, gnu/packages/pdf.scm, gnu/packages/perl6.scm, gnu/packages/phabricator.scm, gnu/packages/popt.scm, gnu/packages/printers.scm, gnu/packages/prolog.scm, gnu/packages/protobuf.scm, gnu/packages/pulseaudio.scm, gnu/packages/python-crypto.scm, gnu/packages/python-web.scm, gnu/packages/python-xyz.scm, gnu/packages/qt.scm, gnu/packages/radio.scm, gnu/packages/rails.scm, gnu/packages/rdf.scm, gnu/packages/rednotebook.scm, gnu/packages/rpc.scm, gnu/packages/rsync.scm, gnu/packages/ruby.scm, gnu/packages/rust.scm, gnu/packages/scheme.scm, gnu/packages/screen.scm, gnu/packages/security-token.scm, gnu/packages/selinux.scm, gnu/packages/serialization.scm, gnu/packages/shells.scm, gnu/packages/shellutils.scm, gnu/packages/simh.scm, gnu/packages/sml.scm, gnu/packages/ssh.scm, gnu/packages/statistics.scm, gnu/packages/stenography.scm, gnu/packages/sync.scm, gnu/packages/syncthing.scm, gnu/packages/synergy.scm, gnu/packages/telephony.scm, gnu/packages/terminals.scm, gnu/packages/tex.scm, gnu/packages/texinfo.scm, gnu/packages/text-editors.scm, gnu/packages/textutils.scm, gnu/packages/time.scm, gnu/packages/tmux.scm, gnu/packages/tor.scm, gnu/packages/toys.scm, gnu/packages/version-control.scm, gnu/packages/video.scm, gnu/packages/vim.scm, gnu/packages/virtualization.scm, gnu/packages/vlang.scm, gnu/packages/vnc.scm, gnu/packages/vpn.scm, gnu/packages/web-browsers.scm, gnu/packages/web.scm, gnu/packages/wireservice.scm, gnu/packages/wm.scm, gnu/packages/wxwidgets.scm, gnu/packages/xdisorg.scm, gnu/packages/xml.scm, gnu/packages/xorg.scm, tests/lint.scm: Remove trailing ".git" from 'git-reference' URL.