Browse Source

Merge pull request #400 from rollup/gh-397

Side-effect detection in cyclical function calls
gh-438-b
Rich Harris 9 years ago
parent
commit
b108c7d079
  1. 8
      src/Declaration.js
  2. 2
      src/Module.js
  3. 3
      test/form/side-effect-m/_config.js
  4. 21
      test/form/side-effect-m/_expected/amd.js
  5. 19
      test/form/side-effect-m/_expected/cjs.js
  6. 17
      test/form/side-effect-m/_expected/es6.js
  7. 21
      test/form/side-effect-m/_expected/iife.js
  8. 25
      test/form/side-effect-m/_expected/umd.js
  9. 11
      test/form/side-effect-m/even.js
  10. 5
      test/form/side-effect-m/main.js
  11. 5
      test/form/side-effect-m/odd.js

8
src/Declaration.js

@ -43,14 +43,20 @@ export default class Declaration {
run ( strongDependencies ) {
if ( this.tested ) return this.hasSideEffects;
this.tested = true;
if ( !this.functionNode ) {
this.hasSideEffects = true; // err on the side of caution. TODO handle unambiguous `var x; x = y => z` cases
} else {
if ( this.running ) return true; // short-circuit infinite loop
this.running = true;
this.hasSideEffects = run( this.functionNode.body, this.functionNode._scope, this.statement, strongDependencies, false );
this.running = false;
}
this.tested = true;
return this.hasSideEffects;
}

2
src/Module.js

@ -570,7 +570,7 @@ export default class Module {
let marked = false;
this.statements.forEach( statement => {
marked = marked || statement.run( this.strongDependencies, safe );
marked = statement.run( this.strongDependencies, safe ) || marked;
});
return marked;

3
test/form/side-effect-m/_config.js

@ -0,0 +1,3 @@
module.exports = {
description: 'detects side-effects with cyclical dependencies'
};

21
test/form/side-effect-m/_expected/amd.js

@ -0,0 +1,21 @@
define(function () { 'use strict';
function odd ( n ) {
return n !== 0 && even( n - 1 );
}
var counter = 0;
// This should be in the output
var foo = odd( 12 );
function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}
console.log( even( 5 ) );
console.log( counter );
});

19
test/form/side-effect-m/_expected/cjs.js

@ -0,0 +1,19 @@
'use strict';
function odd ( n ) {
return n !== 0 && even( n - 1 );
}
var counter = 0;
// This should be in the output
var foo = odd( 12 );
function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}
console.log( even( 5 ) );
console.log( counter );

17
test/form/side-effect-m/_expected/es6.js

@ -0,0 +1,17 @@
function odd ( n ) {
return n !== 0 && even( n - 1 );
}
var counter = 0;
// This should be in the output
var foo = odd( 12 );
function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}
console.log( even( 5 ) );
console.log( counter );

21
test/form/side-effect-m/_expected/iife.js

@ -0,0 +1,21 @@
(function () { 'use strict';
function odd ( n ) {
return n !== 0 && even( n - 1 );
}
var counter = 0;
// This should be in the output
var foo = odd( 12 );
function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}
console.log( even( 5 ) );
console.log( counter );
})();

25
test/form/side-effect-m/_expected/umd.js

@ -0,0 +1,25 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, function () { 'use strict';
function odd ( n ) {
return n !== 0 && even( n - 1 );
}
var counter = 0;
// This should be in the output
var foo = odd( 12 );
function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}
console.log( even( 5 ) );
console.log( counter );
}));

11
test/form/side-effect-m/even.js

@ -0,0 +1,11 @@
import { odd } from './odd.js'
export var counter = 0;
// This should be in the output
export var foo = odd( 12 );
export function even ( n ) {
alert( counter++ )
return n === 0 || odd( n - 1 );
}

5
test/form/side-effect-m/main.js

@ -0,0 +1,5 @@
import { counter, even } from './even.js';
console.log( even( 5 ) );
console.log( counter );

5
test/form/side-effect-m/odd.js

@ -0,0 +1,5 @@
import { even } from './even.js';
export function odd ( n ) {
return n !== 0 && even( n - 1 );
}
Loading…
Cancel
Save