aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc16
-rwxr-xr-xemconfigure4
-rw-r--r--src/embind/embind.js619
-rw-r--r--src/embind/emval.js111
-rw-r--r--src/library.js263
-rw-r--r--src/library_browser.js24
-rw-r--r--src/library_sdl.js1
-rw-r--r--src/settings.js1
-rw-r--r--system/include/emscripten/bind.h645
-rw-r--r--system/include/emscripten/emscripten.h31
-rw-r--r--system/include/emscripten/val.h177
-rw-r--r--system/include/emscripten/wire.h223
-rwxr-xr-xsystem/lib/embind/bind.cpp34
-rw-r--r--tests/embind/embind_test.cpp335
-rw-r--r--tests/embind/embind_test.js341
-rw-r--r--tests/enet/ChangeLog116
-rw-r--r--tests/enet/Doxyfile993
-rw-r--r--tests/enet/LICENSE7
-rw-r--r--tests/enet/Makefile.am22
-rw-r--r--tests/enet/Makefile.in742
-rw-r--r--tests/enet/README15
-rw-r--r--tests/enet/aclocal.m4996
-rw-r--r--tests/enet/callbacks.c47
-rw-r--r--tests/enet/compress.c654
-rwxr-xr-xtests/enet/config.guess1517
-rwxr-xr-xtests/enet/config.sub1760
-rwxr-xr-xtests/enet/configure13592
-rw-r--r--tests/enet/configure.ac30
-rwxr-xr-xtests/enet/depcomp630
-rw-r--r--tests/enet/design.txt117
-rw-r--r--tests/enet/docs/FAQ.dox24
-rw-r--r--tests/enet/docs/design.dox126
-rw-r--r--tests/enet/docs/install.dox60
-rw-r--r--tests/enet/docs/license.dox26
-rw-r--r--tests/enet/docs/mainpage.dox75
-rw-r--r--tests/enet/docs/tutorial.dox357
-rw-r--r--tests/enet/enet.dsp168
-rw-r--r--tests/enet/enet_dll.cbp86
-rw-r--r--tests/enet/host.c481
-rw-r--r--tests/enet/include/enet/callbacks.h27
-rw-r--r--tests/enet/include/enet/enet.h546
-rw-r--r--tests/enet/include/enet/list.h43
-rw-r--r--tests/enet/include/enet/protocol.h199
-rw-r--r--tests/enet/include/enet/time.h18
-rw-r--r--tests/enet/include/enet/types.h13
-rw-r--r--tests/enet/include/enet/unix.h45
-rw-r--r--tests/enet/include/enet/utility.h12
-rw-r--r--tests/enet/include/enet/win32.h58
-rwxr-xr-xtests/enet/install-sh520
-rw-r--r--tests/enet/libenet.pc.in10
-rw-r--r--tests/enet/list.c75
-rwxr-xr-xtests/enet/ltmain.sh9661
-rw-r--r--tests/enet/m4/.keep0
-rw-r--r--tests/enet/m4/libtool.m48001
-rw-r--r--tests/enet/m4/ltoptions.m4384
-rw-r--r--tests/enet/m4/ltsugar.m4123
-rw-r--r--tests/enet/m4/ltversion.m423
-rw-r--r--tests/enet/m4/lt~obsolete.m498
-rwxr-xr-xtests/enet/missing376
-rw-r--r--tests/enet/packet.c161
-rw-r--r--tests/enet/peer.c885
-rw-r--r--tests/enet/protocol.c1848
-rw-r--r--tests/enet/unix.c446
-rw-r--r--tests/enet/win32.c356
-rw-r--r--tests/enet_client.c101
-rw-r--r--tests/enet_server.c99
-rwxr-xr-xtests/runner.py223
-rw-r--r--tests/sdl_image_prepare.c49
-rw-r--r--tests/socket_relay.py56
-rwxr-xr-xtests/socket_server.sh2
-rw-r--r--tests/websockets_bi.c134
-rw-r--r--tests/websockets_bi_listener.c151
-rw-r--r--tests/websockets_bi_side.c65
-rw-r--r--tests/websockets_gethostbyname.c132
-rw-r--r--tools/file_packager.py2
75 files changed, 50354 insertions, 54 deletions
diff --git a/emcc b/emcc
index 53a48122..071db703 100755
--- a/emcc
+++ b/emcc
@@ -367,7 +367,7 @@ def is_minus_s_for_emcc(newargs,i):
CONFIGURE_CONFIG = os.environ.get('EMMAKEN_JUST_CONFIGURE') or 'conftest.c' in sys.argv
CMAKE_CONFIG = 'CMakeFiles/cmTryCompileExec.dir' in ' '.join(sys.argv)# or 'CMakeCCompilerId' in ' '.join(sys.argv)
if CONFIGURE_CONFIG or CMAKE_CONFIG:
- compiler = shared.CLANG
+ compiler = os.environ.get('CONFIGURE_CC') or shared.CLANG # if CONFIGURE_CC is defined, use that. let's you use local gcc etc. if you need that
if not ('CXXCompiler' in ' '.join(sys.argv) or os.environ.get('EMMAKEN_CXX')):
compiler = shared.to_cc(compiler)
def filter_emscripten_options(argv):
@@ -508,11 +508,15 @@ try:
for i in range(len(newargs)):
if newargs[i].startswith('-O'):
- try:
- opt_level = int(newargs[i][2])
- assert 0 <= opt_level <= 3
- except:
- raise Exception('Invalid optimization level: ' + newargs[i])
+ requested_level = newargs[i][2]
+ if requested_level == 's':
+ print >> sys.stderr, 'emcc: warning: -Os is ignored (use -O0, -O1, -O2)'
+ else:
+ try:
+ opt_level = int(requested_level)
+ assert 0 <= opt_level <= 3
+ except:
+ raise Exception('Invalid optimization level: ' + newargs[i])
newargs[i] = ''
elif newargs[i].startswith('--llvm-opts'):
check_bad_eq(newargs[i])
diff --git a/emconfigure b/emconfigure
index e68aaa54..64ca8c4f 100755
--- a/emconfigure
+++ b/emconfigure
@@ -10,6 +10,10 @@ You can also use this for cmake and other configure-like
stages. What happens is that all compilations done during
this command are to native code, not JS, so that configure
tests will work properly.
+
+Relevant defines:
+
+ CONFIGURE_CC - see emcc
'''
import os, sys
diff --git a/src/embind/embind.js b/src/embind/embind.js
new file mode 100644
index 00000000..fff19d86
--- /dev/null
+++ b/src/embind/embind.js
@@ -0,0 +1,619 @@
+/*global Module*/
+/*global _malloc, _free, _memcpy*/
+/*global FUNCTION_TABLE, HEAP32*/
+/*global Pointer_stringify, writeStringToMemory*/
+/*global __emval_register, _emval_handle_array, __emval_decref*/
+
+function createNamedFunction(name, body) {
+ /*jshint evil:true*/
+ return new Function(
+ "body",
+ "return function " + name + "() {\n" +
+ " return body.apply(this, arguments);\n" +
+ "};\n"
+ )(body);
+}
+
+function _embind_repr(v) {
+ var t = typeof v;
+ if (t === 'object' || t === 'array' || t === 'function') {
+ return v.toString();
+ } else {
+ return '' + v;
+ }
+}
+
+var typeRegistry = {};
+
+function validateType(type, name) {
+ if (!type) {
+ throw new BindingError('type "' + name + '" must have a positive integer typeid pointer');
+ }
+ if (undefined !== typeRegistry[type]) {
+ throw new BindingError('cannot register type "' + name + '" twice');
+ }
+}
+
+function __embind_register_void(voidType, name) {
+ name = Pointer_stringify(name);
+ validateType(voidType, name);
+ typeRegistry[voidType] = {
+ name: name,
+ fromWireType: function() {
+ return undefined;
+ }
+ };
+}
+
+function __embind_register_bool(boolType, name, trueValue, falseValue) {
+ name = Pointer_stringify(name);
+ validateType(boolType, name);
+ typeRegistry[boolType] = {
+ name: name,
+ toWireType: function(destructors, o) {
+ return o ? trueValue : falseValue;
+ },
+ fromWireType: function(wt) {
+ return wt === trueValue;
+ },
+ };
+}
+
+function __embind_register_integer(primitiveType, name) {
+ name = Pointer_stringify(name);
+ validateType(primitiveType, name);
+ typeRegistry[primitiveType] = {
+ name: name,
+ toWireType: function(destructors, value) {
+ if (typeof value !== "number") {
+ throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + name);
+ }
+ return value | 0;
+ },
+ fromWireType: function(value) {
+ return value;
+ }
+ };
+}
+
+function __embind_register_float(primitiveType, name) {
+ name = Pointer_stringify(name);
+ validateType(primitiveType, name);
+ typeRegistry[primitiveType] = {
+ name: name,
+ toWireType: function(destructors, value) {
+ if (typeof value !== "number") {
+ throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + name);
+ }
+ return value;
+ },
+ fromWireType: function(value) {
+ return value;
+ }
+ };
+}
+
+function __embind_register_cstring(stringType, name) {
+ name = Pointer_stringify(name);
+ validateType(stringType, name);
+ typeRegistry[stringType] = {
+ name: name,
+ toWireType: function(destructors, value) {
+ var ptr = _malloc(value.length + 1);
+ writeStringToMemory(value, ptr);
+ destructors.push(_free);
+ destructors.push(ptr);
+ return ptr;
+ },
+ fromWireType: function(value) {
+ var rv = Pointer_stringify(value);
+ _free(value);
+ return rv;
+ }
+ };
+}
+
+function __embind_register_emval(emvalType, name) {
+ name = Pointer_stringify(name);
+ validateType(emvalType, name);
+ typeRegistry[emvalType] = {
+ name: name,
+ toWireType: function(destructors, value) {
+ return __emval_register(value);
+ },
+ fromWireType: function(handle) {
+ var rv = _emval_handle_array[handle].value;
+ __emval_decref(handle);
+ return rv;
+ }
+ };
+}
+
+var BindingError = Error;
+/** @expose */
+Module.BindingError = BindingError;
+
+function typeName(typeID) {
+ // could use our carnal knowledge of RTTI but for now just return the pointer...
+ return typeID;
+}
+
+function requireRegisteredType(type, humanName) {
+ var impl = typeRegistry[type];
+ if (undefined === impl) {
+ throw new BindingError(humanName + " has unknown type: " + typeName(type));
+ }
+ return impl;
+}
+
+function requireArgumentTypes(argCount, argTypes, name) {
+ var argTypeImpls = new Array(argCount);
+ for (var i = 0; i < argCount; ++i) {
+ var argType = HEAP32[(argTypes >> 2) + i];
+ argTypeImpls[i] = requireRegisteredType(argType, name + " parameter " + i);
+ }
+ return argTypeImpls;
+}
+
+function runDestructors(destructors) {
+ while (destructors.length) {
+ var ptr = destructors.pop();
+ var del = destructors.pop();
+ del(ptr);
+ }
+}
+
+function __embind_register_function(name, returnType, argCount, argTypes, invoker, fn) {
+ name = Pointer_stringify(name);
+ returnType = requireRegisteredType(returnType, "Function " + name + " return value");
+ invoker = FUNCTION_TABLE[invoker];
+ argTypes = requireArgumentTypes(argCount, argTypes, name);
+
+ Module[name] = function() {
+ if (arguments.length !== argCount) {
+ throw new BindingError('emscripten binding function ' + name + ' called with ' + arguments.length + ' arguments, expected ' + argCount);
+ }
+ var destructors = [];
+ var args = new Array(argCount + 1);
+ args[0] = fn;
+ for (var i = 0; i < argCount; ++i) {
+ args[i + 1] = argTypes[i].toWireType(destructors, arguments[i]);
+ }
+ var rv = returnType.fromWireType(invoker.apply(null, args));
+ runDestructors(destructors);
+ return rv;
+ };
+}
+
+function __embind_register_tuple(tupleType, name, constructor, destructor) {
+ name = Pointer_stringify(name);
+ constructor = FUNCTION_TABLE[constructor];
+ destructor = FUNCTION_TABLE[destructor];
+
+ var elements = [];
+
+ typeRegistry[tupleType] = {
+ name: name,
+ elements: elements,
+ fromWireType: function(ptr) {
+ var len = elements.length;
+ var rv = new Array(len);
+ for (var i = 0; i < len; ++i) {
+ rv[i] = elements[i].read(ptr);
+ }
+ destructor(ptr);
+ return rv;
+ },
+ toWireType: function(destructors, o) {
+ var len = elements.length;
+ if (len !== o.length) {
+ throw new TypeError("Incorrect number of tuple elements");
+ }
+ var ptr = constructor();
+ for (var i = 0; i < len; ++i) {
+ elements[i].write(ptr, o[i]);
+ }
+ destructors.push(destructor);
+ destructors.push(ptr);
+ return ptr;
+ }
+ };
+}
+
+function copyMemberPointer(memberPointer, memberPointerSize) {
+ var copy = _malloc(memberPointerSize);
+ if (!copy) {
+ throw new Error('Failed to allocate member pointer copy');
+ }
+ _memcpy(copy, memberPointer, memberPointerSize);
+ return copy;
+}
+
+function __embind_register_tuple_element(
+ tupleType,
+ elementType,
+ getter,
+ setter,
+ memberPointerSize,
+ memberPointer
+) {
+ tupleType = requireRegisteredType(tupleType, 'tuple');
+ elementType = requireRegisteredType(elementType, "element " + tupleType.name + "[" + tupleType.elements.length + "]");
+ getter = FUNCTION_TABLE[getter];
+ setter = FUNCTION_TABLE[setter];
+ memberPointer = copyMemberPointer(memberPointer, memberPointerSize);
+
+ tupleType.elements.push({
+ read: function(ptr) {
+ return elementType.fromWireType(getter(ptr, memberPointer));
+ },
+ write: function(ptr, o) {
+ var destructors = [];
+ setter(ptr, memberPointer, elementType.toWireType(destructors, o));
+ runDestructors(destructors);
+ }
+ });
+}
+
+function __embind_register_tuple_element_accessor(
+ tupleType,
+ elementType,
+ staticGetter,
+ getterSize,
+ getter,
+ staticSetter,
+ setterSize,
+ setter
+) {
+ tupleType = requireRegisteredType(tupleType, 'tuple');
+ elementType = requireRegisteredType(elementType, "element " + tupleType.name + "[" + tupleType.elements.length + "]");
+ staticGetter = FUNCTION_TABLE[staticGetter];
+ getter = copyMemberPointer(getter, getterSize);
+ staticSetter = FUNCTION_TABLE[staticSetter];
+ setter = copyMemberPointer(setter, setterSize);
+
+ tupleType.elements.push({
+ read: function(ptr) {
+ return elementType.fromWireType(staticGetter(ptr, HEAP32[getter >> 2]));
+ },
+ write: function(ptr, o) {
+ var destructors = [];
+ staticSetter(
+ ptr,
+ HEAP32[setter >> 2],
+ elementType.toWireType(destructors, o));
+ runDestructors(destructors);
+ }
+ });
+}
+
+function __embind_register_struct(
+ structType,
+ name,
+ constructor,
+ destructor
+) {
+ name = Pointer_stringify(name);
+ constructor = FUNCTION_TABLE[constructor];
+ destructor = FUNCTION_TABLE[destructor];
+
+ typeRegistry[structType] = {
+ fields: {},
+ fromWireType: function(ptr) {
+ var fields = this.fields;
+ var rv = {};
+ for (var i in fields) {
+ rv[i] = fields[i].read(ptr);
+ }
+ destructor(ptr);
+ return rv;
+ },
+ toWireType: function(destructors, o) {
+ var fields = this.fields;
+ for (var fieldName in fields) {
+ if (!(fieldName in o)) {
+ throw new TypeError('Missing field');
+ }
+ }
+ var ptr = constructor();
+ for (var fieldName in fields) {
+ fields[fieldName].write(ptr, o[fieldName]);
+ }
+ destructors.push(destructor);
+ destructors.push(ptr);
+ return ptr;
+ }
+ };
+}
+
+function __embind_register_struct_field(
+ structType,
+ fieldName,
+ fieldType,
+ getter,
+ setter,
+ memberPointerSize,
+ memberPointer
+) {
+ structType = requireRegisteredType(structType, 'struct');
+ fieldName = Pointer_stringify(fieldName);
+ fieldType = requireRegisteredType(fieldType, 'field "' + structType.name + '.' + fieldName + '"');
+ getter = FUNCTION_TABLE[getter];
+ setter = FUNCTION_TABLE[setter];
+ memberPointer = copyMemberPointer(memberPointer, memberPointerSize);
+
+ structType.fields[fieldName] = {
+ read: function(ptr) {
+ return fieldType.fromWireType(getter(ptr, memberPointer));
+ },
+ write: function(ptr, o) {
+ var destructors = [];
+ setter(ptr, memberPointer, fieldType.toWireType(destructors, o));
+ runDestructors(destructors);
+ }
+ };
+}
+
+function __embind_register_class(
+ classType,
+ name,
+ destructor
+) {
+ name = Pointer_stringify(name);
+ destructor = FUNCTION_TABLE[destructor];
+
+ var Handle = createNamedFunction(name, function(ptr) {
+ this.count = {value: 1};
+ this.ptr = ptr;
+ });
+
+ Handle.prototype.clone = function() {
+ if (!this.ptr) {
+ throw new BindingError(classType.name + ' instance already deleted');
+ }
+
+ var clone = Object.create(Handle.prototype);
+ clone.count = this.count;
+ clone.ptr = this.ptr;
+
+ clone.count.value += 1;
+ return clone;
+ };
+
+ Handle.prototype.move = function() {
+ var rv = this.clone();
+ this.delete();
+ return rv;
+ };
+
+ Handle.prototype['delete'] = function() {
+ if (!this.ptr) {
+ throw new BindingError(classType.name + ' instance already deleted');
+ }
+
+ this.count.value -= 1;
+ if (0 === this.count.value) {
+ destructor(this.ptr);
+ }
+ this.ptr = undefined;
+ };
+
+ var constructor = createNamedFunction(name, function() {
+ var body = constructor.body;
+ body.apply(this, arguments);
+ })