google / google/closure-compiler

Incorrect side-effect computation

Open
#3,539 5 comments 0 reactions 1 assignee Claimed by @concavelenz View on GitHub
Dominant language
JavaScript
Stars
7.7k
Forks
1.2k
Avg merge
2d 12h
Merged PRs (30d)
6

Description

We use custom state manager with modifiers proxy:
```js
function setShowPreloader(data, payload) {
data.view.showPreloader = payload
}

function setImageSrc(data, payload) {
data.src = payload
}

const bindState = (state, modifiers) => {
const res = {}
for (const key of Object.keys(modifiers))
{
res[key] = payload => modifiers[key](state, payload)
}
return res
}

const state = {
view: {
showPreloader: true,
},
src: '',
}
const controller = bindState(state, {
setShowPreloader,
setImageSrc,
})
controller.setShowPreloader(false)
controller.setImageSrc('http://localhost/image.png')
console.log(state.view.showPreloader, state.src) // expected: false 'http://localhost/image.png'
// received: false ''
```

after compilation setImageSrc will be removed (but setShowPreloader not).

repro:
https://closure-compiler-debugger.appspot.com/#input0%3Dfunction%2520setShowPreloader(data%252C%2520payload)%2520%257B%250A%2509data.view.showPreloader%2520%253D%2520payload%250A%257D%250A%250Afunction%2520setImageSrc(data%252C%2520payload)%2520%257B%250A%2509data.src%2520%253D%2520payload%250A%257D%250A%250Aconst%2520bindState%2520%253D%2520(state%252C%2520modifiers)%2520%253D%253E%2520%257B%250A%2509const%2520res%2520%253D%2520%257B%257D%250A%2509for%2520(const%2520key%2520of%2520Object.keys(modifiers))%250A%2509%257B%250A%2509%2509res%255Bkey%255D%2520%253D%2520payload%2520%253D%253E%2520modifiers%255Bkey%255D(state%252C%2520payload)%250A%2509%257D%250A%2509return%2520res%250A%257D%250A%250Aconst%2520state%2520%253D%2520%257B%250A%2509view%253A%2520%257B%250A%2509%2509showPreloader%253A%2520true%252C%250A%2509%257D%252C%250A%2509src%253A%2520''%252C%250A%257D%250Aconst%2520controller%2520%253D%2520bindState(state%252C%2520%257B%250A%2509setShowPreloader%252C%250A%2509setImageSrc%252C%250A%257D)%250Acontroller.setShowPreloader(false)%250Acontroller.setImageSrc('http%253A%252F%252Flocalhost%252Fimage.png')%250Aconsole.log(state.view.showPreloader%252C%2520state.src)%250A%26input1%26conformanceConfig%26externs%26refasterjs-template%26COMPUTE_FUNCTION_SIDE_EFFECTS%3Dtrue%26REMOVE_DEAD_CODE%3Dtrue%26CLOSURE_PASS%3Dtrue%26PRESERVE_TYPE_ANNOTATIONS%3Dtrue%26PRETTY_PRINT%3Dtrue

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.