Skip to content

(Old) uglfiy-js hangs forever #35

@truongsinh

Description

@truongsinh

uglfiy-js (1.0.7) fails to process the following code (taken from jinjs):

function parse_BINARY_OPERATOR() {
    var cacheKey = 'BINARY_OPERATOR@' + pos;
    var cachedResult = cache[cacheKey];
    if (cachedResult) {
        pos = cachedResult.nextPos;
        return cachedResult.result;
    }

    if (input.substr(pos, 3) === ">>>") {
        var result28 = ">>>";
        pos += 3;
    } else {
        var result28 = null;
        if (reportMatchFailures) {
            matchFailed("\">>>\"");
        }
    }
    if (result28 !== null) {
        var result0 = result28;
    } else {
        if (input.substr(pos, 3) === "===") {
            var result27 = "===";
            pos += 3;
        } else {
            var result27 = null;
            if (reportMatchFailures) {
                matchFailed("\"===\"");
            }
        }
        if (result27 !== null) {
            var result0 = result27;
        } else {
            if (input.substr(pos, 3) === "!==") {
                var result26 = "!==";
                pos += 3;
            } else {
                var result26 = null;
                if (reportMatchFailures) {
                    matchFailed("\"!==\"");
                }
            }
            if (result26 !== null) {
                var result0 = result26;
            } else {
                if (input.substr(pos, 2) === "==") {
                    var result25 = "==";
                    pos += 2;
                } else {
                    var result25 = null;
                    if (reportMatchFailures) {
                        matchFailed("\"==\"");
                    }
                }
                if (result25 !== null) {
                    var result0 = result25;
                } else {
                    if (input.substr(pos, 2) === "!=") {
                        var result24 = "!=";
                        pos += 2;
                    } else {
                        var result24 = null;
                        if (reportMatchFailures) {
                            matchFailed("\"!=\"");
                        }
                    }
                    if (result24 !== null) {
                        var result0 = result24;
                    } else {
                        if (input.substr(pos, 2) === ">=") {
                            var result23 = ">=";
                            pos += 2;
                        } else {
                            var result23 = null;
                            if (reportMatchFailures) {
                                matchFailed("\">=\"");
                            }
                        }
                        if (result23 !== null) {
                            var result0 = result23;
                        } else {
                            if (input.substr(pos, 2) === "<=") {
                                var result22 = "<=";
                                pos += 2;
                            } else {
                                var result22 = null;
                                if (reportMatchFailures) {
                                    matchFailed("\"<=\"");
                                }
                            }
                            if (result22 !== null) {
                                var result0 = result22;
                            } else {
                                if (input.substr(pos, 2) === "&&") {
                                    var result21 = "&&";
                                    pos += 2;
                                } else {
                                    var result21 = null;
                                    if (reportMatchFailures) {
                                        matchFailed("\"&&\"");
                                    }
                                }
                                if (result21 !== null) {
                                    var result0 = result21;
                                } else {
                                    if (input.substr(pos, 2) === "||") {
                                        var result20 = "||";
                                        pos += 2;
                                    } else {
                                        var result20 = null;
                                        if (reportMatchFailures) {
                                            matchFailed("\"||\"");
                                        }
                                    }
                                    if (result20 !== null) {
                                        var result0 = result20;
                                    } else {
                                        if (input.substr(pos, 2) === "<<") {
                                            var result19 = "<<";
                                            pos += 2;
                                        } else {
                                            var result19 = null;
                                            if (reportMatchFailures) {
                                                matchFailed("\"<<\"");
                                            }
                                        }
                                        if (result19 !== null) {
                                            var result0 = result19;
                                        } else {
                                            if (input.substr(pos, 2) === ">>") {
                                                var result18 = ">>";
                                                pos += 2;
                                            } else {
                                                var result18 = null;
                                                if (reportMatchFailures) {
                                                    matchFailed("\">>\"");
                                                }
                                            }
                                            if (result18 !== null) {
                                                var result0 = result18;
                                            } else {
                                                if (input.substr(pos, 2) === "+=") {
                                                    var result17 = "+=";
                                                    pos += 2;
                                                } else {
                                                    var result17 = null;
                                                    if (reportMatchFailures) {
                                                        matchFailed("\"+=\"");
                                                    }
                                                }
                                                if (result17 !== null) {
                                                    var result0 = result17;
                                                } else {
                                                    if (input.substr(pos, 2) === "-=") {
                                                        var result16 = "-=";
                                                        pos += 2;
                                                    } else {
                                                        var result16 = null;
                                                        if (reportMatchFailures) {
                                                            matchFailed("\"-=\"");
                                                        }
                                                    }
                                                    if (result16 !== null) {
                                                        var result0 = result16;
                                                    } else {
                                                        if (input.substr(pos, 2) === "%=") {
                                                            var result15 = "%=";
                                                            pos += 2;
                                                        } else {
                                                            var result15 = null;
                                                            if (reportMatchFailures) {
                                                                matchFailed("\"%=\"");
                                                            }
                                                        }
                                                        if (result15 !== null) {
                                                            var result0 = result15;
                                                        } else {
                                                            if (input.substr(pos, 2) === "/=") {
                                                                var result14 = "/=";
                                                                pos += 2;
                                                            } else {
                                                                var result14 = null;
                                                                if (reportMatchFailures) {
                                                                    matchFailed("\"/=\"");
                                                                }
                                                            }
                                                            if (result14 !== null) {
                                                                var result0 = result14;
                                                            } else {
                                                                if (input.substr(pos, 2) === "*=") {
                                                                    var result13 = "*=";
                                                                    pos += 2;
                                                                } else {
                                                                    var result13 = null;
                                                                    if (reportMatchFailures) {
                                                                        matchFailed("\"*=\"");
                                                                    }
                                                                }
                                                                if (result13 !== null) {
                                                                    var result0 = result13;
                                                                } else {
                                                                    if (input.substr(pos, 1) === "=") {
                                                                        var result12 = "=";
                                                                        pos += 1;
                                                                    } else {
                                                                        var result12 = null;
                                                                        if (reportMatchFailures) {
                                                                            matchFailed("\"=\"");
                                                                        }
                                                                    }
                                                                    if (result12 !== null) {
                                                                        var result0 = result12;
                                                                    } else {
                                                                        if (input.substr(pos, 1) === "|") {
                                                                            var result11 = "|";
                                                                            pos += 1;
                                                                        } else {
                                                                            var result11 = null;
                                                                            if (reportMatchFailures) {
                                                                                matchFailed("\"|\"");
                                                                            }
                                                                        }
                                                                        if (result11 !== null) {
                                                                            var result0 = result11;
                                                                        } else {
                                                                            if (input.substr(pos, 1) === "/") {
                                                                                var result10 = "/";
                                                                                pos += 1;
                                                                            } else {
                                                                                var result10 = null;
                                                                                if (reportMatchFailures) {
                                                                                    matchFailed("\"/\"");
                                                                                }
                                                                            }
                                                                            if (result10 !== null) {
                                                                                var result0 = result10;
                                                                            } else {
                                                                                if (input.substr(pos, 1) === "^") {
                                                                                    var result9 = "^";
                                                                                    pos += 1;
                                                                                } else {
                                                                                    var result9 = null;
                                                                                    if (reportMatchFailures) {
                                                                                        matchFailed("\"^\"");
                                                                                    }
                                                                                }
                                                                                if (result9 !== null) {
                                                                                    var result0 = result9;
                                                                                } else {
                                                                                    if (input.substr(pos, 1) === "&") {
                                                                                        var result8 = "&";
                                                                                        pos += 1;
                                                                                    } else {
                                                                                        var result8 = null;
                                                                                        if (reportMatchFailures) {
                                                                                            matchFailed("\"&\"");
                                                                                        }
                                                                                    }
                                                                                    if (result8 !== null) {
                                                                                        var result0 = result8;
                                                                                    } else {
                                                                                        if (input.substr(pos, 1) === "|") {
                                                                                            var result7 = "|";
                                                                                            pos += 1;
                                                                                        } else {
                                                                                            var result7 = null;
                                                                                            if (reportMatchFailures) {
                                                                                                matchFailed("\"|\"");
                                                                                            }
                                                                                        }
                                                                                        if (result7 !== null) {
                                                                                            var result0 = result7;
                                                                                        } else {
                                                                                            if (input.substr(pos, 1) === "+") {
                                                                                                var result6 = "+";
                                                                                                pos += 1;
                                                                                            } else {
                                                                                                var result6 = null;
                                                                                                if (reportMatchFailures) {
                                                                                                    matchFailed("\"+\"");
                                                                                                }
                                                                                            }
                                                                                            if (result6 !== null) {
                                                                                                var result0 = result6;
                                                                                            } else {
                                                                                                if (input.substr(pos, 1) === ">") {
                                                                                                    var result5 = ">";
                                                                                                    pos += 1;
                                                                                                } else {
                                                                                                    var result5 = null;
                                                                                                    if (reportMatchFailures) {
                                                                                                        matchFailed("\">\"");
                                                                                                    }
                                                                                                }
                                                                                                if (result5 !== null) {
                                                                                                    var result0 = result5;
                                                                                                } else {
                                                                                                    if (input.substr(pos, 1) === "<") {
                                                                                                        var result4 = "<";
                                                                                                        pos += 1;
                                                                                                    } else {
                                                                                                        var result4 = null;
                                                                                                        if (reportMatchFailures) {
                                                                                                            matchFailed("\"<\"");
                                                                                                        }
                                                                                                    }
                                                                                                    if (result4 !== null) {
                                                                                                        var result0 = result4;
                                                                                                    } else {
                                                                                                        if (input.substr(pos, 1) === "%") {
                                                                                                            var result3 = "%";
                                                                                                            pos += 1;
                                                                                                        } else {
                                                                                                            var result3 = null;
                                                                                                            if (reportMatchFailures) {
                                                                                                                matchFailed("\"%\"");
                                                                                                            }
                                                                                                        }
                                                                                                        if (result3 !== null) {
                                                                                                            var result0 = result3;
                                                                                                        } else {
                                                                                                            if (input.substr(pos, 1) === "-") {
                                                                                                                var result2 = "-";
                                                                                                                pos += 1;
                                                                                                            } else {
                                                                                                                var result2 = null;
                                                                                                                if (reportMatchFailures) {
                                                                                                                    matchFailed("\"-\"");
                                                                                                                }
                                                                                                            }
                                                                                                            if (result2 !== null) {
                                                                                                                var result0 = result2;
                                                                                                            } else {
                                                                                                                if (input.substr(pos, 1) === "*") {
                                                                                                                    var result1 = "*";
                                                                                                                    pos += 1;
                                                                                                                } else {
                                                                                                                    var result1 = null;
                                                                                                                    if (reportMatchFailures) {
                                                                                                                        matchFailed("\"*\"");
                                                                                                                    }
                                                                                                                }
                                                                                                                if (result1 !== null) {
                                                                                                                    var result0 = result1;
                                                                                                                } else {
                                                                                                                    var result0 = null;
                                                                                                                    ;
                                                                                                                };
                                                                                                            };
                                                                                                        };
                                                                                                    };
                                                                                                };
                                                                                            };
                                                                                        };
                                                                                    };
                                                                                };
                                                                            };
                                                                        };
                                                                    };
                                                                };
                                                            };
                                                        };
                                                    };
                                                };
                                            };
                                        };
                                    };
                                };
                            };
                        };
                    };
                };
            };
        };
    }
    return result0;
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions