diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/emscripten-optimizer/parser.cpp | 2 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.h | 6 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 54 | ||||
-rw-r--r-- | src/wasm2js.h | 37 |
4 files changed, 89 insertions, 10 deletions
diff --git a/src/emscripten-optimizer/parser.cpp b/src/emscripten-optimizer/parser.cpp index de749817f..016966299 100644 --- a/src/emscripten-optimizer/parser.cpp +++ b/src/emscripten-optimizer/parser.cpp @@ -107,6 +107,8 @@ IString ATOMICS("Atomics"); IString COMPARE_EXCHANGE("compareExchange"); IString LOAD("load"); IString STORE("store"); +IString GETTER("get"); +IString SETTER("set"); IStringSet keywords("var const function if else do while for break continue return " diff --git a/src/emscripten-optimizer/parser.h b/src/emscripten-optimizer/parser.h index 3e1623c19..c4d596058 100644 --- a/src/emscripten-optimizer/parser.h +++ b/src/emscripten-optimizer/parser.h @@ -124,6 +124,8 @@ extern IString ATOMICS; extern IString COMPARE_EXCHANGE; extern IString LOAD; extern IString STORE; +extern IString GETTER; +extern IString SETTER; extern IStringSet keywords; @@ -207,8 +209,8 @@ template<class NodeRef, class Builder> class Parser { }; struct Frag { - // MSVC does not allow unrestricted unions: - // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf + // MSVC does not allow unrestricted unions: + // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf #ifndef _MSC_VER union { #endif diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index 7644daac3..64db04d79 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -1463,12 +1463,24 @@ struct JSPrinter { newline(); } bool needQuote = false; + const char* getterSetter = nullptr; + const char* setterParam = nullptr; const char* str; if (args[i][0]->isArray()) { - assert(args[i][0][0] == STRING); - // A quoted string. - needQuote = true; - str = args[i][0][1]->getCString(); + if (args[i][0][0] == STRING) { + // A quoted string. + needQuote = true; + str = args[i][0][1]->getCString(); + } else if (args[i][0][0] == GETTER) { + getterSetter = GETTER.c_str(); + str = args[i][0][1]->getCString(); + } else if (args[i][0][0] == SETTER) { + getterSetter = SETTER.c_str(); + str = args[i][0][1]->getCString(); + setterParam = args[i][0][2]->getCString(); + } else { + abort(); + } } else { // Just a raw string, no quotes. str = args[i][0]->getCString(); @@ -1481,6 +1493,10 @@ struct JSPrinter { } check++; } + if (getterSetter != nullptr) { + emit(getterSetter); + space(); + } if (needQuote) { emit('"'); } @@ -1488,7 +1504,15 @@ struct JSPrinter { if (needQuote) { emit('"'); } - emit(":"); + if (getterSetter != nullptr) { + emit('('); + if (setterParam != nullptr) { + emit(setterParam); + } + emit(')'); + } else { + emit(":"); + } space(); print(args[i][1]); } @@ -1828,6 +1852,26 @@ public: &makeRawArray(2)->push_back(makeString(key)).push_back(value)); } + static void appendToObjectAsGetter(Ref array, IString key, Ref value) { + assert(array[0] == OBJECT); + array[1]->push_back(&makeRawArray(2) + ->push_back(&makeRawArray(2) + ->push_back(makeRawString(GETTER)) + .push_back(makeRawString(key))) + .push_back(value)); + } + + static void + appendToObjectAsSetter(Ref array, IString key, IString param, Ref value) { + assert(array[0] == OBJECT); + array[1]->push_back(&makeRawArray(2) + ->push_back(&makeRawArray(3) + ->push_back(makeRawString(SETTER)) + .push_back(makeRawString(key)) + .push_back(makeRawString(param))) + .push_back(value)); + } + static Ref makeSub(Ref obj, Ref index) { return &makeRawArray(2) ->push_back(makeRawString(SUB)) diff --git a/src/wasm2js.h b/src/wasm2js.h index 43f4d520f..b74572cfe 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -764,10 +764,40 @@ void Wasm2JSBuilder::addExports(Ref ast, Module* wasm) { break; } case ExternalKind::Global: { + Ref object = ValueBuilder::makeObject(); + + IString identName = fromName(export_->value, NameScope::Top); + + // getter + { + Ref block = ValueBuilder::makeBlock(); + + block[1]->push_back( + ValueBuilder::makeReturn(ValueBuilder::makeName(identName))); + + ValueBuilder::appendToObjectAsGetter(object, IString("value"), block); + } + + // setter + { + std::ostringstream buffer; + buffer << '_' << identName.c_str(); + auto setterParam = stringToIString(buffer.str()); + + auto block = ValueBuilder::makeBlock(); + + block[1]->push_back( + ValueBuilder::makeBinary(ValueBuilder::makeName(identName), + SET, + ValueBuilder::makeName(setterParam))); + + ValueBuilder::appendToObjectAsSetter( + object, IString("value"), setterParam, block); + } + ValueBuilder::appendToObjectWithQuotes( - exports, - fromName(export_->name, NameScope::Export), - ValueBuilder::makeName(fromName(export_->value, NameScope::Top))); + exports, fromName(export_->name, NameScope::Export), object); + break; } case ExternalKind::Tag: @@ -2600,6 +2630,7 @@ void Wasm2JSGlue::emitPostES6() { for (auto& exp : wasm.exports) { switch (exp->kind) { case ExternalKind::Function: + case ExternalKind::Global: case ExternalKind::Memory: break; |