Skip to content

Instantly share code, notes, and snippets.

@skalee
Created April 26, 2014 12:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skalee/11318888 to your computer and use it in GitHub Desktop.
Save skalee/11318888 to your computer and use it in GitHub Desktop.
Another Emscripten failure with custom output stream
$ make clean run > RESULT ^ ERRORS
$ head -50 ERRORS
/Users/skale/Projekty/cannot-read-fd/why-not-works.js:8182
$67,$90,$93,$102,$147) } catch(e) { if (typeof e != "number") throw e; if (ABO
^
TypeError: Property '10696' of object 0,0,function __ZNSt3__18messagesIwED0Ev($this){
var label=0;
var $1=(($this)|0);
__ZNSt3__114__shared_countD2Ev($1);
var $2=$this;
__ZdlPv($2);
return;
},0,function __ZNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEED0Ev($this){
var label=0;
var $1=(($this)|0);
__ZNSt3__114__shared_countD2Ev($1);
var $2=$this;
__ZdlPv($2);
return;
},0,function __ZNKSt3__18numpunctIcE12do_falsenameEv($agg_result,$this){
var label=0;
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj($agg_result,1232,5);
return;
},0,function __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_($__os){
var label=0;
var sp=STACKTOP;STACKTOP=(STACKTOP+8)|0; (assert((STACKTOP|0) < (STACK_MAX|0))|0);
label = 1;
while(1)switch(label){
case 1:
var $1;
var $2;
var $3;
var $4;
var $5;
var $6=sp;
var $7;
var $8;
var $9;
$9=$__os;
var $10=$9;
var $11=$9;
var $12=$11;
var $13=HEAP32[(($12)>>2)];
var $14=((($13)-(12))|0);
var $15=$14;
$ tail -50 ERRORS
case 3:
__ZdaPv($10);
label=4;break;
case 4:
var $13=(($this)|0);
var $14=$this;
__ZdlPv($14);
return;
default: assert(0, "bad label: " + label);
}
},0,function __ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev($this){
var label=0;
var $1=(($this+8)|0);
__ZNSt3__18ios_baseD2Ev($1);
var $2=$this;
__ZdlPv($2);
return;
},0,function ___cxx_global_array_dtor120($0){
var label=0;
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12220);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12208);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12196);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12184);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12172);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12160);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12148);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12136);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12124);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12112);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12100);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12088);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12076);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(12064);
return;
},0 is not a function
at __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:12162:31)
at /Users/skale/Projekty/cannot-read-fd/why-not-works.js:8182:44
at __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:8182:290)
at _print_it (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:7965:9)
at ccallFunc (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:612:24)
at Object.ccall (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:569:10)
at null._onTimeout (/Users/skale/Projekty/cannot-read-fd/why-not-works.js:2339:16)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
make: *** [run] Error 8
mergeInto(LibraryManager.library, {
try_from_js: function() {
Module.ccall('print_it', 'number', ['string'], ["From `try_from_js` it works."]);
setTimeout(function() {
// It could be also nodejs' readline's `on('line', …)` callback.
Module.ccall('print_it', 'number', ['string'], ["From `setTimeout` callback it fails."]);
}, 0);
}
});
TARGET = why-not-works.js
OBJS = src.bc
HLPS = helper.js
CXX = emcc
LDFLAGS = \
-s EXPORTED_FUNCTIONS="['_print_it', '_main']" \
--js-library helper.js
.PHONY: run clean default
$(TARGET): $(OBJS) $(HLPS)
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
%.bc: %.cpp
$(CXX) $< -o $@
default: $(TARGET)
clean:
- rm $(TARGET) *.bc
run: $(TARGET)
node $(TARGET)
$ make clean run > RESULT ^ ERRORS
$ cat RESULT
rm why-not-works.js *.bc
emcc src.cpp -o src.bc
emcc -o why-not-works.js src.bc -s EXPORTED_FUNCTIONS="['_print_it', '_main']" --js-library helper.js
node why-not-works.js
* From `main` it works.
* From `try_from_js` it works.
#import <emscripten.h>
#import <iostream>
#import <sstream>
class EventedOStream : public std::ostream {
private:
class EventedBuf : public std::stringbuf {
public:
~EventedBuf() { pubsync(); }
int sync();
};
public:
EventedOStream() : std::ostream(new EventedBuf) {}
~EventedOStream() { delete rdbuf(); }
};
EventedOStream eout;
extern "C" void try_from_js();
extern "C" int print_it(const char* str) {
eout << " * " << str << std::endl;
return 0;
}
int main(int argc, char* argv[]) {
print_it("From `main` it works.");
try_from_js();
return 0;
}
int EventedOStream::EventedBuf::sync() {
if(!str().empty()) {
EM_ASM_INT({
console.log(Pointer_stringify($0));
}, str().c_str());
}
str("");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment