swc icon indicating copy to clipboard operation
swc copied to clipboard

Evaluate expression when compress conditional statement

Open Austaras opened this issue 3 years ago • 5 comments

Describe the bug

This would require implementing terser evaluate method.

Input code

let a = 'aaaa'

if (a === 'aaaa') {
	console.log(a)
}

Config

No response

Playground link

https://play.swc.rs/?version=1.2.170&code=H4sIAAAAAAAAA8tJLVFIVLBVUE8EAnUursw0BQ0g3xYmoqlQzcWZnJ9XnJ%2BTqpeTn66RqMlVCwBln0kENQAAAA%3D%3D&config=H4sIAAAAAAAAA22TzZLbIAzH38XnHLqdaQ%2F7AL3tMzAKCEdbAx4ksvFk8u4VthfbSW%2Fox19CX9y7T7bd%2B70bITPmeuIpCty69w5tALaZRulOKlPkYWB8nDqB3KNUCf%2F88fZLr4eUGFfBqQsUyU81mE1hzMhcz%2BpUAkbhpoOc05eakota55QGhPhiG2BDUbDHvLnaNAwwMpor5OZRX4NMnOIBFUFnxpzGvXt0JJSimg06BGdsclshjjJaoSvuRBpHRZE1uSN0eC59X5u4PI1XGAoINvs2t0IfbX6XRCzGl8hPaM12cVzQUuiqIm8ySsnxW%2FOZKB568RdR8xyAOULY5T9zr7M4Kv1%2FVBS9DlKmRnXKW1YRey3OEPlWYc0asxA2UUZXLNYK7RZ8hYeCmBwa9F7b3Zz5i8RedlnJNGLy7V7bBn4bwmKa76U60roHL%2FCPpiX7eaw8gFyeGU%2FhnIaXEAHlktwL1k5IeoZZV%2Fg2PtMSHWqf0e0uClezVqm%2FLUDs2649KkiuVHCfGzJ%2Fw9%2FdY%2Ft2S3eIP1bdHOcfmKDn2%2BoDAAA%3D

Expected behavior

console.log('aaaa')

Actual behavior

let a="aaaa";"aaaa"===a&&console.log(a)

Version

1.2.170

Additional context

No response

Austaras avatar Apr 23 '22 20:04 Austaras

We have inliner,

See https://play.swc.rs/?version=1.2.171&code=H4sIAAAAAAAAA6vm4sxJLVFIVLBVMOTi4sxMU9AAsm2BPE2Fai5OzuT8vOL8nFS9nPx0jURNLs5arloAAXFBdjMAAAA%3D&config=H4sIAAAAAAAAA22TQZbbIAyG78I6i077Oos5QHc9A4%2BAcDS1hYtEJn55uXtF7GA76Q59%2FBLSD1zNJ3vzcTWjywy5rngicRfzYcAPjn3GUcxBZYqi6xluByMudyBVwt%2B%2Fvf3U7T4lhkVwMAMSxqkW82kYMzDXNVKPpKIfB6P5ZQASbiku5%2FSloeSi0TGlHhy9xNaxRRLoIK%2BpPvW9Gxns2eWWUQ92GTnRDhWBYMecxm06BRRMpGGDAVywPoV1poAZvOAZNiKtoyJibW4PAxxL11U%2F56Ph7PriBFp8ubuih7a8U0IWGwvxE1q6nRNnNA%2B6qDDaDFIyPTSfCWnnxR8A7bN3zOSGTf93HvUu9sr4HxVS1DuVqVG98LUrgk6Hs4ixTVi7hiwITZQhFA91Qr8WX%2BBuIMYAFmJUu1syf6H406YrmUZIse2rbS6ulzCH9vGo9rS%2Bgxf4S9uS7X0sfHByemY8DcfUv5QYQE4pvGB1QtIzzPqEL%2BMzLRRAfYaw2Shcw8UF%2BFuA%2FMNT%2FYmDo649vlsFKZQKrneH7l%2F03dzWLzkXQv696O51%2FgGRKYQUBgQAAA%3D%3D

Problem is that, inlining a string literal can make output too large. (25 M => 76M, in real case in the past)

kdy1 avatar Apr 24 '22 03:04 kdy1

Combined with #4414, I'd say number shouldn't be inlined blindly too.

Austaras avatar Apr 24 '22 06:04 Austaras

The actual process of terser is when check constant conditions, evaluate left side of comparison and find out it's aaaa, so the whole if can be removed

Austaras avatar Apr 24 '22 08:04 Austaras

Hmm, I think we need it.

kdy1 avatar Apr 24 '22 15:04 kdy1

version : 1.2.224 playground

this works only when variable contain <= 3 characters

let a = 'aaa'

if (a === 'aaa') {
	console.log(a)
}

gives

console.log("aaa") 

doesn't matter how long the string is in condition, it will evaluate

let a = 'aaa'

if (a === 'aaaaaaaaaaaaaaaaaaaaaaaaa') {
	console.log(a)
}

gives nothing

but if just add one more char in variable

let a = 'aaaa'

if (a === 'aaaaaaaaaaaaaaaaaaaaaaaaa') {
	console.log(a)
}

gives

let l="aaaa";"aaaaaaaaaaaaaaaaaaaaaaaaa"===l&&console.log(l)

nkitku avatar Aug 08 '22 06:08 nkitku

This closed issue has been automatically locked because it had no new activity for a month. If you are running into a similar issue, please create a new issue with the steps to reproduce. Thank you.

swc-bot avatar Oct 30 '22 12:10 swc-bot