From 2257a4017ed3bdc4bbf635279d9cd066091a425b Mon Sep 17 00:00:00 2001 From: Michael Daines Date: Fri, 13 Jan 2017 12:05:36 -0500 Subject: [PATCH] Create a new instance of Module for every call of Viz. Access errors via a new vizLastErrorMessage C API. --- Makefile | 2 +- src/post.js | 25 ++++++------------------- src/viz.c | 25 +++++++++---------------- 3 files changed, 16 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 4231702d..fc049149 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ viz.js: src/pre.js module.js src/post.js cat $^ > $@ module.js: src/viz.c - emcc -v -Os --closure 1 --memory-init-file 0 -s USE_ZLIB=1 -s MODULARIZE=1 -s EXPORTED_FUNCTIONS="['_vizRenderFromString', '_aglasterr', '_dtextract', '_Dtqueue']" -s EXPORTED_RUNTIME_METHODS="['Pointer_stringify', 'ccall', 'UTF8ToString']" -o $@ $< -I$(PREFIX)/include -I$(PREFIX)/include/graphviz -L$(PREFIX)/lib -L$(PREFIX)/lib/graphviz -lgvplugin_core -lgvplugin_dot_layout -lgvplugin_neato_layout -lcdt -lcgraph -lgvc -lgvpr -lpathplan -lexpat -lxdot -lz + emcc -v -Os --closure 1 --memory-init-file 0 -s USE_ZLIB=1 -s MODULARIZE=1 -s EXPORTED_FUNCTIONS="['_vizRenderFromString', '_vizLastErrorMessage', '_dtextract', '_Dtqueue']" -s EXPORTED_RUNTIME_METHODS="['Pointer_stringify', 'ccall', 'UTF8ToString']" -o $@ $< -I$(PREFIX)/include -I$(PREFIX)/include/graphviz -L$(PREFIX)/lib -L$(PREFIX)/lib/graphviz -lgvplugin_core -lgvplugin_dot_layout -lgvplugin_neato_layout -lcdt -lcgraph -lgvc -lgvpr -lpathplan -lexpat -lxdot -lz $(PREFIX): diff --git a/src/post.js b/src/post.js index b60d307a..88bb6260 100644 --- a/src/post.js +++ b/src/post.js @@ -10,27 +10,18 @@ return render(src, format, engine); } } - - var graphviz; - var errors; - - function appendError(buf) { - errors += graphviz["Pointer_stringify"](buf); - } function render(src, format, engine) { - if (typeof graphviz === "undefined") { - graphviz = Module(); - } - - errors = ""; + var graphviz = Module(); var resultPointer = graphviz["ccall"]("vizRenderFromString", "number", ["string", "string", "string"], [src, format, engine]); var resultString = graphviz["Pointer_stringify"](resultPointer); - graphviz["_free"](resultPointer); + + var errorMessagePointer = graphviz["ccall"]("vizLastErrorMessage", "number", [], []); + var errorMessageString = graphviz["Pointer_stringify"](errorMessagePointer); - if (errors != "") { - throw errors; + if (errorMessageString != "") { + throw errorMessageString; } return resultString; @@ -105,10 +96,6 @@ } } - Viz.setMemorySize = function(size) { - graphviz = Module({ TOTAL_MEMORY: size }); - } - Viz.svgXmlToPngBase64 = function(svgXml, scale, callback) { Viz.svgXmlToPngImageElement(svgXml, scale, function(err, image) { if (err) { diff --git a/src/viz.c b/src/viz.c index 3ebf6cda..fe0ff7e5 100644 --- a/src/viz.c +++ b/src/viz.c @@ -6,16 +6,20 @@ extern gvplugin_library_t gvplugin_neato_layout_LTX_library; extern gvplugin_library_t gvplugin_core_LTX_library; GVC_t *context = NULL; +char *errorMessage = NULL; int vizErrorf(char *buf) { - EM_ASM_({ appendError($0); }, buf); + errorMessage = buf; return 0; } -char* vizRenderFromString(const char *src, const char *format, const char *engine) { +char* vizLastErrorMessage() { + return errorMessage; +} - Agraph_t *graph; - char *result; +char* vizRenderFromString(const char *src, const char *format, const char *engine) { + Agraph_t *graph = NULL; + char *result = NULL; unsigned int length; if (context == NULL) { @@ -28,25 +32,14 @@ char* vizRenderFromString(const char *src, const char *format, const char *engin agseterr(AGERR); agseterrf(vizErrorf); - // Reset line numbers. - agreadline(1); - while ((graph = agmemread(src))) { if (result == NULL) { gvLayout(context, graph, engine); - - // result is freed in post.js. gvRenderData(context, graph, format, &result, &length); - - gvFreeLayout(context, graph); } - agclose(graph); - - // agmemread will continue to process graphs from the initial input. Set its *new* input to the empty string so that we don't go into an infinite loop. src = ""; } - - return result; + return result; }