diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 37 | ||||
-rw-r--r-- | src/binaryen-c.h | 12 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 990612829..fb8b730c7 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -35,6 +35,8 @@ #include "wasm-validator.h" #include "wasm.h" #include "wasm2js.h" +#include <iostream> +#include <sstream> #ifdef __EMSCRIPTEN__ #include <emscripten.h> @@ -3288,6 +3290,26 @@ BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize) { .outputBytes; } +size_t BinaryenModuleWriteText(BinaryenModuleRef module, + char* output, + size_t outputSize) { + + if (tracing) { + std::cout << " // BinaryenModuleWriteTextr\n"; + } + + // use a stringstream as an std::ostream. Extract the std::string + // representation, and then store in the output. + std::stringstream ss; + WasmPrinter::printModule((Module*)module, ss); + + const auto temp = ss.str(); + const auto ctemp = temp.c_str(); + + strncpy(output, ctemp, outputSize); + return std::min(outputSize, temp.size()); +} + BinaryenBufferSizes BinaryenModuleWriteWithSourceMap(BinaryenModuleRef module, const char* url, char* output, @@ -3333,6 +3355,21 @@ BinaryenModuleAllocateAndWrite(BinaryenModuleRef module, return {binary, buffer.size(), sourceMap}; } +char* BinaryenModuleAllocateAndWriteText(BinaryenModuleRef* module) { + if (tracing) { + std::cout << " // BinaryenModuleAllocateAndWriteText(the_module);"; + } + + std::stringstream ss; + WasmPrinter::printModule((Module*)module, ss); + + const std::string out = ss.str(); + const int len = out.length() + 1; + char* cout = (char*)malloc(len); + strncpy(cout, out.c_str(), len); + return cout; +} + BinaryenModuleRef BinaryenModuleRead(char* input, size_t inputSize) { if (tracing) { std::cout << " // BinaryenModuleRead\n"; diff --git a/src/binaryen-c.h b/src/binaryen-c.h index e287e2541..ae6747cea 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -1012,6 +1012,13 @@ void BinaryenModuleAutoDrop(BinaryenModuleRef module); size_t BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize); +// Serialize a module in s-expression text format. +// @return how many bytes were written. This will be less than or equal to +// outputSize +size_t BinaryenModuleWriteText(BinaryenModuleRef module, + char* output, + size_t outputSize); + typedef struct BinaryenBufferSizes { size_t outputBytes; size_t sourceMapBytes; @@ -1046,6 +1053,11 @@ BinaryenModuleAllocateAndWriteResult BinaryenModuleAllocateAndWrite(BinaryenModuleRef module, const char* sourceMapUrl); +// Serialize a module in s-expression form. Implicity allocates the returned +// char* with malloc(), and expects the user to free() them manually +// once not needed anymore. +char* BinaryenModuleAllocateAndWriteText(BinaryenModuleRef* module); + // Deserialize a module from binary form. BinaryenModuleRef BinaryenModuleRead(char* input, size_t inputSize); |