aboutsummaryrefslogtreecommitdiff
asm_mixed: {
    options = {
        assignments: true,
        booleans: true,
        comparisons: true,
        conditionals: true,
        dead_code: true,
        drop_debugger: true,
        evaluate: true,
        hoist_funs: true,
        hoist_vars: true,
        if_return: true,
        join_vars: true,
        keep_fargs: true,
        keep_fnames: false,
        loops: true,
        negate_iife: true,
        properties: true,
        sequences: true,
        side_effects: true,
        unused: true,
    }
    input: {
        // adapted from http://asmjs.org/spec/latest/
        function asm_GeometricMean(stdlib, foreign, buffer) {
          "use asm";
          var exp = stdlib.Math.exp;
          var log = stdlib.Math.log;
          var values = new stdlib.Float64Array(buffer);
          function logSum(start, end) {
            start = start|0;
            end = end|0;
            var sum = 0.0, p = 0, q = 0;
            // asm.js forces byte addressing of the heap by requiring shifting by 3
            for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
              sum = sum + +log(values[p>>3]);
            }
            return +sum;
          }
          function geometricMean(start, end) {
            start = start|0;
            end = end|0;
            return +exp(+logSum(start, end) / +((end - start)|0));
          }
          return { geometricMean: geometricMean };
        }
        function no_asm_GeometricMean(stdlib, foreign, buffer) {
          var exp = stdlib.Math.exp;
          var log = stdlib.Math.log;
          var values = new stdlib.Float64Array(buffer);
          function logSum(start, end) {
            start = start|0;
            end = end|0;
            var sum = 0.0, p = 0, q = 0;
            // asm.js forces byte addressing of the heap by requiring shifting by 3
            for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
              sum = sum + +log(values[p>>3]);
            }
            return +sum;
          }
          function geometricMean(start, end) {
            start = start|0;
            end = end|0;
            return +exp(+logSum(start, end) / +((end - start)|0));
          }
          return { geometricMean: geometricMean };
        }
    }
    expect: {
        function asm_GeometricMean(stdlib, foreign, buffer) {
            "use asm";
            var exp = stdlib.Math.exp;
            var log = stdlib.Math.log;
            var values = new stdlib.Float64Array(buffer);
            function logSum(start, end) {
                start = start | 0;
                end = end | 0;
                var sum = 0.0, p = 0, q = 0;
                for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0)
                    sum = sum + +log(values[p >> 3]);
                return +sum;
            }
            function geometricMean(start, end) {
                start = start | 0;
                end = end | 0;
                return +exp(+logSum(start, end) / +(end - start | 0));
            }
            return { geometricMean: geometricMean };
        }
        function no_asm_GeometricMean(stdlib, foreign, buffer) {
            function logSum(start, end) {
                start |= 0, end |= 0;
                for (var sum = 0, p = 0, q = 0, p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0)
                    sum += +log(values[p >> 3]);
                return +sum;
            }
            function geometricMean(start, end) {
                return start |= 0, end |= 0, +exp(+logSum(start, end) / (end - start | 0));
            }
            var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
            return { geometricMean: geometricMean };
        }
    }
}

asm_toplevel: {
    options = {}
    input: {
        "use asm";
        0.0;
        function f() {
            0.0;
            (function(){
                0.0;
            });
        }
        0.0;
    }
    expect_exact: '"use asm";0.0;function f(){0.0;(function(){0.0})}0.0;'
}

asm_function_expression: {
    options = {}
    input: {
        0.0;
        var a = function() {
            "use asm";
            0.0;
        }
        function f() {
            0.0;
            return function(){
                "use asm";
                0.0;
            }
            0.0;
        }
        0.0;
    }
    expect_exact: '0;var a=function(){"use asm";0.0};function f(){0;return function(){"use asm";0.0};0}0;'
}

asm_nested_functions: {
    options = {}
    input: {
        0.0;
        function a() {
            "use asm";
            0.0;
        }
        0.0;
        function b() {
            0.0;
            function c(){
                "use asm";
                0.0;
            }
            0.0;
            function d(){
                0.0;
            }
            0.0;
        }
        0.0;
    }
    expect_exact: '0;function a(){"use asm";0.0}0;function b(){0;function c(){"use asm";0.0}0;function d(){0}0}0;'
}

issue_3636_1: {
    mangle = {}
    input: {
        function n(stdlib, foreign, buffer) {
            "use asm";
            function add(x, y) {
                x = x | 0;
                y = y | 0;
                return x + y | 0;
            }
            return {
                add: add
            };
        }
        console.log(new n().add("foo", 42));
    }
    expect: {
        function n(o, e, u) {
            "use asm";
            function d(n, o) {
                n = n | 0;
                o = o | 0;
                return n + o | 0;
            }
            return {
                add: d
            };
        }
        console.log(new n().add("foo", 42));
    }
    expect_stdout: "42"
}

issue_3636_2: {
    mangle = {}
    input: {
        var n = function(stdlib, foreign, buffer) {
            "use asm";
            function add(x, y) {
                x = x | 0;
                y = y | 0;
                return x + y | 0;
            }
            return {
                add: add
            };
        };
        console.log(new n().add("foo", 42));
    }
    expect: {
        var n = function(n, o, e) {
            "use asm";
            function r(n, o) {
                n = n | 0;
                o = o | 0;
                return n + o | 0;
            }
            return {
                add: r
            };
        };
        console.log(new n().add("foo", 42));
    }
    expect_stdout: "42"
}
class='msg-tooltip'>* gnu/packages/aux-files/run-in-namespace.c (struct engine): New type. (exec_default): New function. (engines): New variable. (execution_engine): New function. (main): Use it instead of calling 'exec_in_user_namespace' and 'exec_with_proot' directly. * tests/guix-pack-relocatable.sh: Add test with 'GUIX_EXECUTION_ENGINE'. * doc/guix.texi (Invoking guix pack): Document 'GUIX_EXECUTION_ENGINE'. Ludovic Courtès 2020-04-24pack: 'guix pack -R' wrapper correctly reports exit code....Fixes <https://bugs.gnu.org/40816>. Reported by Jan (janneke) Nieuwenhuizen <janneke@gnu.org>. * gnu/packages/aux-files/run-in-namespace.c (main): In the 'default' case, check 'WIFEXITED (status)' and exit with the corresponding code in that case. Exit with 255 in other cases. * tests/guix-pack-relocatable.sh: Add test. Ludovic Courtès 2019-08-23pack: '-R' honors the requested output....Fixes <https://bugs.gnu.org/36925>. Reported by Jesse Gibbons <jgibbons2357@gmail.com>. * guix/scripts/pack.scm (wrapped-package): Add 'output*' parameter. [build]: Define 'input' and 'target'; use them instead of #$package and #$output, respectively. (wrapped-manifest-entry): New procedure. (map-manifest-entries): Call PROC directly. (guix-pack): Pass WRAPPED-MANIFEST-ENTRY to 'map-manifest-entries'. Ludovic Courtès 2019-05-18pack: '--localstatedir' and '-R' tests gracefully handle missing /gnu/store....Fixes <https://bugs.gnu.org/35776>. Reported by Ting-Wei Lan <lantw44@gmail.com>. * tests/guix-pack-localstatedir.sh: Set 'storedir' before 'NIX_STORE_DIR'. * tests/guix-pack-relocatable.sh: Likewise. Ludovic Courtès 2019-05-09tests: Ensure 'unshare' works before relying on it....Fixes <https://bugs.gnu.org/35642>. Reported by Josh Holland <josh@inv.alid.pw>. * tests/guix-pack-relocatable.sh: Before invoking 'unshare' at the bottom, add "if unshare -r true" condition. * tests/guix-pack.sh: Likewise. Ludovic Courtès 2019-03-15pack: "-RR" produces PRoot-enabled relocatable binaries....* gnu/packages/aux-files/run-in-namespace.c (exec_with_proot): New function. (main): When 'clone' fails, call 'rm_rf'. [PROOT_PROGRAM]: When 'clone' fails, call 'exec_with_proot'. * guix/scripts/pack.scm (wrapped-package): Add #:proot?. [proot]: New procedure. [build]: Compile with -DPROOT_PROGRAM when PROOT? is true. * guix/scripts/pack.scm (%options): Set the 'relocatable?' value to 'proot when "-R" is passed several times. (guix-pack): Pass #:proot? to 'wrapped-package'. * tests/guix-pack-relocatable.sh: Use "-RR" on Intel systems that lack user namespace support. * doc/guix.texi (Invoking guix pack): Document -RR. Ludovic Courtès 2018-11-06pack: Add test for '--relocatable'....* tests/guix-pack-relocatable.sh: New file. * Makefile.am (SH_TESTS): Add it. Ludovic Courtès