fix(es/minifier): Disable some operations for asm.js codes (#3572)

This commit is contained in:
Donny/강동윤 2022-02-28 16:40:04 +09:00 committed by GitHub
parent 1d3a76ddf8
commit e7f7f69db4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 306057 additions and 33 deletions

View File

@ -13,6 +13,9 @@ where
if !self.options.collapse_vars {
return;
}
if self.ctx.in_asm {
return;
}
if self.ctx.in_try_block || self.ctx.executed_multiple_time || self.ctx.in_cond {
return;

View File

@ -1313,6 +1313,9 @@ where
if !self.options.join_vars && !self.options.hoist_vars {
return;
}
if self.ctx.in_asm {
return;
}
// Merge var declarations fully, if possible.
if stmts.windows(2).any(|stmts| match (&stmts[0], &stmts[1]) {
@ -2524,6 +2527,21 @@ where
}
fn visit_mut_stmts(&mut self, stmts: &mut Vec<Stmt>) {
// Skip if `use asm` exists.
if stmts.iter().any(|stmt| match stmt.as_stmt() {
Some(Stmt::Expr(stmt)) => match &*stmt.expr {
Expr::Lit(Lit::Str(Str {
value,
has_escape: false,
..
})) => &**value == "use asm",
_ => false,
},
_ => false,
}) {
return;
}
let ctx = Ctx {
top_level: false,
..self.ctx

View File

@ -66,6 +66,9 @@ where
if !self.options.sequences() {
return;
}
if self.ctx.in_asm {
return;
}
{
let can_work =

View File

@ -105,7 +105,7 @@ where
name: &mut Pat,
init: Option<&mut Expr>,
) {
if self.ctx.is_exported {
if self.ctx.is_exported || self.ctx.in_asm {
return;
}

View File

@ -123,6 +123,16 @@ where
}
fn optimize_fn_stmts(&mut self, stmts: &mut Vec<Stmt>) {
if !stmts.is_empty() {
if let Stmt::Expr(ExprStmt { expr, .. }) = &stmts[0] {
if let Expr::Lit(Lit::Str(v)) = &**expr {
if v.value == *"use asm" {
return;
}
}
}
}
self.remove_useless_return(stmts);
self.negate_if_terminate(stmts, true, false);
@ -566,6 +576,16 @@ where
}
fn visit_mut_stmts(&mut self, items: &mut Vec<Stmt>) {
if !items.is_empty() {
if let Stmt::Expr(ExprStmt { expr, .. }) = &items[0] {
if let Expr::Lit(Lit::Str(v)) = &**expr {
if v.value == *"use asm" {
return;
}
}
}
}
self.visit_par(items);
self.handle_stmt_likes(items);

View File

@ -1556,55 +1556,157 @@
function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_exports__.a = function(stdlib, foreign, buffer) {
"use asm";
var images = new stdlib.Uint8Array(buffer), size = 0 | foreign.size, imul = stdlib.Math.imul;
'use asm';
var images = new stdlib.Uint8Array(buffer);
var size = foreign.size | 0;
var imul = stdlib.Math.imul;
function erode(inImagePtr, outImagePtr) {
inImagePtr |= 0, outImagePtr |= 0;
var v = 0, u = 0, sum = 0, yStart1 = 0, yStart2 = 0, xStart1 = 0, xStart2 = 0, offset = 0;
for(v = 1; (0 | v) < (size - 1 | 0); v = v + 1 | 0)for(u = 1, offset = offset + size | 0; (0 | u) < (size - 1 | 0); u = u + 1 | 0)yStart1 = offset - size | 0, yStart2 = offset + size | 0, xStart1 = u - 1 | 0, xStart2 = u + 1 | 0, sum = (0 | images[inImagePtr + yStart1 + xStart1 | 0]) + (0 | images[inImagePtr + yStart1 + xStart2 | 0]) + (0 | images[inImagePtr + offset + u | 0]) + (0 | images[inImagePtr + yStart2 + xStart1 | 0]) + (0 | images[inImagePtr + yStart2 + xStart2 | 0]) | 0, (0 | sum) == 5 ? images[outImagePtr + offset + u | 0] = 1 : images[outImagePtr + offset + u | 0] = 0;
inImagePtr |= 0;
outImagePtr |= 0;
var v = 0;
var u = 0;
var sum = 0;
var yStart1 = 0;
var yStart2 = 0;
var xStart1 = 0;
var xStart2 = 0;
var offset = 0;
for(v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0){
offset = offset + size | 0;
for(u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0){
yStart1 = offset - size | 0;
yStart2 = offset + size | 0;
xStart1 = u - 1 | 0;
xStart2 = u + 1 | 0;
sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
if ((sum | 0) == 5) {
images[outImagePtr + offset + u | 0] = 1;
} else {
images[outImagePtr + offset + u | 0] = 0;
}
}
}
}
function subtract(aImagePtr, bImagePtr, outImagePtr) {
aImagePtr |= 0, bImagePtr |= 0, outImagePtr |= 0;
aImagePtr |= 0;
bImagePtr |= 0;
outImagePtr |= 0;
var length = 0;
for(length = 0 | imul(size, size); (0 | length) > 0;)images[outImagePtr + (length = length - 1 | 0) | 0] = (0 | images[aImagePtr + length | 0]) - (0 | images[bImagePtr + length | 0]) | 0;
length = imul(size, size) | 0;
while((length | 0) > 0){
length = length - 1 | 0;
images[outImagePtr + length | 0] = (images[aImagePtr + length | 0] | 0) - (images[bImagePtr + length | 0] | 0) | 0;
}
}
function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {
aImagePtr |= 0, bImagePtr |= 0, outImagePtr |= 0;
aImagePtr |= 0;
bImagePtr |= 0;
outImagePtr |= 0;
var length = 0;
for(length = 0 | imul(size, size); (0 | length) > 0;)images[outImagePtr + (length = length - 1 | 0) | 0] = 0 | images[aImagePtr + length | 0] | (0 | images[bImagePtr + length | 0]) | 0;
length = imul(size, size) | 0;
while((length | 0) > 0){
length = length - 1 | 0;
images[outImagePtr + length | 0] = images[aImagePtr + length | 0] | 0 | (images[bImagePtr + length | 0] | 0) | 0;
}
}
function countNonZero(imagePtr) {
imagePtr |= 0;
var sum = 0, length = 0;
for(length = 0 | imul(size, size); (0 | length) > 0;)sum = (0 | sum) + (0 | images[imagePtr + (length = length - 1 | 0) | 0]) | 0;
return 0 | sum;
var sum = 0;
var length = 0;
length = imul(size, size) | 0;
while((length | 0) > 0){
length = length - 1 | 0;
sum = (sum | 0) + (images[imagePtr + length | 0] | 0) | 0;
}
return sum | 0;
}
function init(imagePtr, value) {
imagePtr |= 0;
value |= 0;
var length = 0;
length = imul(size, size) | 0;
while((length | 0) > 0){
length = length - 1 | 0;
images[imagePtr + length | 0] = value;
}
}
function dilate(inImagePtr, outImagePtr) {
inImagePtr |= 0, outImagePtr |= 0;
var v = 0, u = 0, sum = 0, yStart1 = 0, yStart2 = 0, xStart1 = 0, xStart2 = 0, offset = 0;
for(v = 1; (0 | v) < (size - 1 | 0); v = v + 1 | 0)for(u = 1, offset = offset + size | 0; (0 | u) < (size - 1 | 0); u = u + 1 | 0)yStart1 = offset - size | 0, yStart2 = offset + size | 0, xStart1 = u - 1 | 0, xStart2 = u + 1 | 0, sum = (0 | images[inImagePtr + yStart1 + xStart1 | 0]) + (0 | images[inImagePtr + yStart1 + xStart2 | 0]) + (0 | images[inImagePtr + offset + u | 0]) + (0 | images[inImagePtr + yStart2 + xStart1 | 0]) + (0 | images[inImagePtr + yStart2 + xStart2 | 0]) | 0, (0 | sum) > 0 ? images[outImagePtr + offset + u | 0] = 1 : images[outImagePtr + offset + u | 0] = 0;
inImagePtr |= 0;
outImagePtr |= 0;
var v = 0;
var u = 0;
var sum = 0;
var yStart1 = 0;
var yStart2 = 0;
var xStart1 = 0;
var xStart2 = 0;
var offset = 0;
for(v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0){
offset = offset + size | 0;
for(u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0){
yStart1 = offset - size | 0;
yStart2 = offset + size | 0;
xStart1 = u - 1 | 0;
xStart2 = u + 1 | 0;
sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
if ((sum | 0) > 0) {
images[outImagePtr + offset + u | 0] = 1;
} else {
images[outImagePtr + offset + u | 0] = 0;
}
}
}
}
function memcpy(srcImagePtr, dstImagePtr) {
srcImagePtr |= 0, dstImagePtr |= 0;
srcImagePtr |= 0;
dstImagePtr |= 0;
var length = 0;
for(length = 0 | imul(size, size); (0 | length) > 0;)images[dstImagePtr + (length = length - 1 | 0) | 0] = 0 | images[srcImagePtr + length | 0];
length = imul(size, size) | 0;
while((length | 0) > 0){
length = length - 1 | 0;
images[dstImagePtr + length | 0] = images[srcImagePtr + length | 0] | 0;
}
}
function zeroBorder(imagePtr) {
imagePtr |= 0;
var x = 0;
var y = 0;
for(x = 0; (x | 0) < (size - 1 | 0); x = x + 1 | 0){
images[imagePtr + x | 0] = 0;
images[imagePtr + y | 0] = 0;
y = y + size - 1 | 0;
images[imagePtr + y | 0] = 0;
y = y + 1 | 0;
}
for(x = 0; (x | 0) < (size | 0); x = x + 1 | 0){
images[imagePtr + y | 0] = 0;
y = y + 1 | 0;
}
}
function skeletonize() {
var subImagePtr = 0;
var erodedImagePtr = 0;
var tempImagePtr = 0;
var skelImagePtr = 0;
var sum = 0;
var done = 0;
erodedImagePtr = imul(size, size) | 0;
tempImagePtr = erodedImagePtr + erodedImagePtr | 0;
skelImagePtr = tempImagePtr + erodedImagePtr | 0;
init(skelImagePtr, 0);
zeroBorder(subImagePtr);
do {
erode(subImagePtr, erodedImagePtr);
dilate(erodedImagePtr, tempImagePtr);
subtract(subImagePtr, tempImagePtr, tempImagePtr);
bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);
memcpy(erodedImagePtr, subImagePtr);
sum = countNonZero(subImagePtr) | 0;
done = (sum | 0) == 0 | 0;
}while (!done)
}
return {
skeletonize: function() {
var erodedImagePtr = 0, tempImagePtr = 0, skelImagePtr = 0, done = 0;
!function(imagePtr, value) {
imagePtr |= 0, value |= 0;
var length = 0;
for(length = 0 | imul(size, size); (0 | length) > 0;)images[imagePtr + (length = length - 1 | 0) | 0] = value;
}(skelImagePtr = (tempImagePtr = (erodedImagePtr = 0 | imul(size, size)) + erodedImagePtr | 0) + erodedImagePtr | 0, 0), (function(imagePtr) {
imagePtr |= 0;
var x = 0, y = 0;
for(x = 0; (0 | x) < (size - 1 | 0); x = x + 1 | 0)images[imagePtr + x | 0] = 0, images[imagePtr + y | 0] = 0, images[imagePtr + (y = y + size - 1 | 0) | 0] = 0, y = y + 1 | 0;
for(x = 0; (0 | x) < (0 | size); x = x + 1 | 0)images[imagePtr + y | 0] = 0, y = y + 1 | 0;
})(0);
do erode(0, erodedImagePtr), dilate(erodedImagePtr, tempImagePtr), subtract(0, tempImagePtr, tempImagePtr), bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr), memcpy(erodedImagePtr, 0), done = (0 | (0 | countNonZero(0))) == 0 | 0;
while (!done)
}
skeletonize: skeletonize
};
};
},

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff