Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kjirou/rails-uglifier-bug-investigation
Repository for investigating Rails's Uglifier bugs
https://github.com/kjirou/rails-uglifier-bug-investigation
Last synced: 12 days ago
JSON representation
Repository for investigating Rails's Uglifier bugs
- Host: GitHub
- URL: https://github.com/kjirou/rails-uglifier-bug-investigation
- Owner: kjirou
- Created: 2018-10-18T09:05:30.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2021-08-31T08:00:17.000Z (about 3 years ago)
- Last Synced: 2023-03-30T12:33:40.406Z (over 1 year ago)
- Language: JavaScript
- Size: 52.7 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# rails-uglifier-bug-investigation
## これは何?
業務で、Rails に乗ってる `uglifier == 4.1.9` によって圧縮した関数が壊れてるっぽい事件があった。
それに対して、壊れてることの確定と、可能ならどういう構文が壊れるのかを調査するために作ったリポジトリ。`lib/SJISToUTF8.js` は、圧縮する前のあるライブラリのある一関数。
それを `rails console` から `Uglifier.new(comments: :copyright).compress(src)` で圧縮したのが `SJISToUTF8-compressed.js`。
それを読みやすいように prettier や手で整形してたのが `SJISToUTF8-compressed-and-formatted.js`。手で整形した時にロジックが変わらないことを検証するために、 `npm run test` で回帰テストが動くようにした。
## 結果
非圧縮のこの部分が、
```
51 if (utf8 < 0xFFFF) {
52 results[results.length] = utf8 >> 8 & 0xFF;
53 results[results.length] = utf8 & 0xFF;
54 } else {
55 results[results.length] = utf8 >> 16 & 0xFF;
56 results[results.length] = utf8 >> 8 & 0xFF;
57 results[results.length] = utf8 & 0xFF;
58 }
```こう圧縮されてるところがおかしい、というところまではわかった。
```
39 o[o.length] = (
40 (o[o.length] = (utf8 < 65535 || (o[o.length] = (utf8 >> 16) & 255),
41 (utf8 >> 8) & 255)),
42 255 & utf8
43 );
````if (utf8 < 0xFFFF) {` と等価になりそうな部分が圧縮先にない。
どうやら `utf8 < 65535 || ` という風に OR になってそう。というところまでしかわかってない。単体では再現できない。
## 関連
- https://github.com/lautis/uglifier/issues/153
- https://github.com/polygonplanet/encoding.js
- 今回の SJISToUTF8 の元