diff options
Diffstat (limited to 'src/emscripten-optimizer')
-rw-r--r-- | src/emscripten-optimizer/optimizer-shared.cpp | 46 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.cpp | 1 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.h | 1 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.cpp | 2 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 18 |
5 files changed, 33 insertions, 35 deletions
diff --git a/src/emscripten-optimizer/optimizer-shared.cpp b/src/emscripten-optimizer/optimizer-shared.cpp index b2c03cf28..7ba6d4a22 100644 --- a/src/emscripten-optimizer/optimizer-shared.cpp +++ b/src/emscripten-optimizer/optimizer-shared.cpp @@ -53,29 +53,26 @@ HeapInfo parseHeap(const char *name) { } AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFround, bool allowI64) { + if (node->isString()) { + if (asmData) { + AsmType ret = asmData->getType(node->getCString()); + if (ret != ASM_NONE) return ret; + } + if (!inVarDef) { + if (node == INF || node == NaN) return ASM_DOUBLE; + if (node == TEMP_RET0) return ASM_INT; + return ASM_NONE; + } + // We are in a variable definition, where Math_fround(0) optimized into a global constant becomes f0 = Math_fround(0) + if (ASM_FLOAT_ZERO.isNull()) ASM_FLOAT_ZERO = node->getIString(); + else assert(node == ASM_FLOAT_ZERO); + return ASM_FLOAT; + } if (node->isNumber()) { if (!wasm::isInteger(node->getNumber())) return ASM_DOUBLE; return ASM_INT; } switch (node[0]->getCString()[0]) { - case 'n': { - if (node[0] == NAME) { - if (asmData) { - AsmType ret = asmData->getType(node[1]->getCString()); - if (ret != ASM_NONE) return ret; - } - if (!inVarDef) { - if (node[1] == INF || node[1] == NaN) return ASM_DOUBLE; - if (node[1] == TEMP_RET0) return ASM_INT; - return ASM_NONE; - } - // We are in a variable definition, where Math_fround(0) optimized into a global constant becomes f0 = Math_fround(0) - if (ASM_FLOAT_ZERO.isNull()) ASM_FLOAT_ZERO = node[1]->getIString(); - else assert(node[1] == ASM_FLOAT_ZERO); - return ASM_FLOAT; - } - break; - } case 'u': { if (node[0] == UNARY_PREFIX) { switch (node[1]->getCString()[0]) { @@ -89,8 +86,8 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr } case 'c': { if (node[0] == CALL) { - if (node[1][0] == NAME) { - IString name = node[1][1]->getIString(); + if (node[1]->isString()) { + IString name = node[1]->getIString(); if (name == MATH_FROUND || name == minifiedFround) return ASM_FLOAT; else if (allowI64 && (name == INT64 || name == INT64_CONST)) return ASM_INT64; else if (name == SIMD_FLOAT32X4 || name == SIMD_FLOAT32X4_CHECK) return ASM_FLOAT32X4; @@ -122,7 +119,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr if (node[0] == SEQ) { return detectType(node[2], asmData, inVarDef, minifiedFround, allowI64); } else if (node[0] == SUB) { - assert(node[1][0] == NAME); + assert(node[1]->isString()); HeapInfo info = parseHeap(node[1][1]->getCString()); if (info.valid) return ASM_NONE; return info.floaty ? ASM_DOUBLE : ASM_INT; // XXX ASM_FLOAT? @@ -142,6 +139,9 @@ static void abort_on(Ref node) { } AsmSign detectSign(Ref node, IString minifiedFround) { + if (node->isString()) { + return ASM_FLEXIBLE; + } if (node->isNumber()) { double value = node->getNumber(); if (value < 0) return ASM_SIGNED; @@ -170,12 +170,10 @@ AsmSign detectSign(Ref node, IString minifiedFround) { case '~': return ASM_SIGNED; default: abort_on(node); } - } else if (type == NAME) { - return ASM_FLEXIBLE; } else if (type == CONDITIONAL) { return detectSign(node[2], minifiedFround); } else if (type == CALL) { - if (node[1][0] == NAME && (node[1][1] == MATH_FROUND || node[1][1] == minifiedFround)) return ASM_NONSIGNED; + if (node[1]->isString() && (node[1] == MATH_FROUND || node[1] == minifiedFround)) return ASM_NONSIGNED; } else if (type == SEQ) { return detectSign(node[2], minifiedFround); } diff --git a/src/emscripten-optimizer/parser.cpp b/src/emscripten-optimizer/parser.cpp index d0d5aac54..645762f0a 100644 --- a/src/emscripten-optimizer/parser.cpp +++ b/src/emscripten-optimizer/parser.cpp @@ -25,7 +25,6 @@ IString TOPLEVEL("toplevel"), BLOCK("block"), STAT("stat"), ASSIGN("assign"), - NAME("name"), VAR("var"), CONST("const"), CONDITIONAL("conditional"), diff --git a/src/emscripten-optimizer/parser.h b/src/emscripten-optimizer/parser.h index e43709f9b..8b988a6c2 100644 --- a/src/emscripten-optimizer/parser.h +++ b/src/emscripten-optimizer/parser.h @@ -40,7 +40,6 @@ extern IString TOPLEVEL, BLOCK, STAT, ASSIGN, - NAME, VAR, CONST, CONDITIONAL, diff --git a/src/emscripten-optimizer/simple_ast.cpp b/src/emscripten-optimizer/simple_ast.cpp index 4ef6c7f2a..4f36036ae 100644 --- a/src/emscripten-optimizer/simple_ast.cpp +++ b/src/emscripten-optimizer/simple_ast.cpp @@ -277,6 +277,6 @@ void traverseFunctions(Ref ast, std::function<void (Ref)> visit) { // ValueBuilder -IStringSet ValueBuilder::statable("assign call binary unary-prefix name conditional dot new sub seq string object array"); +IStringSet ValueBuilder::statable("assign call binary unary-prefix conditional dot new sub seq string object array"); } // namespace cashew diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index bb757e260..e89ddb666 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -663,6 +663,10 @@ struct JSPrinter { void print(Ref node) { ensure(); + if (node->isString()) { + printName(node); + return; + } if (node->isNumber()) { printNum(node); return; @@ -708,8 +712,7 @@ struct JSPrinter { break; } case 'n': { - if (type == NAME) printName(node); - else if (type == NEW) printNew(node); + if (type == NEW) printNew(node); else abort(); break; } @@ -842,7 +845,7 @@ struct JSPrinter { } void printName(Ref node) { - emit(node[1]->getCString()); + emit(node->getCString()); } static char* numToString(double d, bool finalize=true) { @@ -1357,8 +1360,7 @@ public: } static Ref makeName(IString name) { - return &makeRawArray(2)->push_back(makeRawString(NAME)) - .push_back(makeRawString(name)); + return makeRawString(name); } static void setBlockContent(Ref target, Ref block) { @@ -1460,7 +1462,7 @@ public: } static Ref makeStatement(Ref contents) { - if (contents->isNumber() || statable.has(contents[0]->getIString())) { + if (contents->isNumber() || contents->isString() || statable.has(contents[0]->getIString())) { return &makeRawArray(2)->push_back(makeRawString(STAT)) .push_back(contents); } else { @@ -1636,8 +1638,8 @@ public: } static Ref makeDot(Ref obj, Ref key) { - assert(key[0] == NAME); - return makeDot(obj, key[1]->getIString()); + assert(key->isString()); + return makeDot(obj, key->getIString()); } static Ref makeNew(Ref call) { |