aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS5
-rw-r--r--LICENSE6
-rw-r--r--cmake/Platform/Emscripten.cmake10
-rwxr-xr-xemcc14
-rwxr-xr-xemscripten.py66
-rw-r--r--src/jsifier.js2
-rw-r--r--src/library.js114
-rw-r--r--src/library_browser.js21
-rw-r--r--src/library_egl.js16
-rw-r--r--src/library_fs.js8
-rw-r--r--src/library_gl.js111
-rw-r--r--src/library_html5.js180
-rw-r--r--src/library_memfs.js5
-rw-r--r--src/library_sockfs.js2
-rw-r--r--src/postamble.js12
-rw-r--r--src/preamble.js275
-rw-r--r--src/proxyClient.js54
-rw-r--r--src/proxyWorker.js12
-rw-r--r--src/runtime.js28
-rw-r--r--src/settings.js11
-rw-r--r--src/utility.js6
-rw-r--r--system/include/emscripten/emscripten.h25
-rw-r--r--system/include/execinfo.h44
-rw-r--r--system/include/unwind.h154
-rw-r--r--system/lib/gl.c4
-rw-r--r--tests/cases/atomicrmw_dec.ll21
-rw-r--r--tests/cases/atomicrmw_dec.txt1
-rw-r--r--tests/cases/boolret_fastcomp.ll31
-rw-r--r--tests/cases/boolret_fastcomp.txt2
-rw-r--r--tests/cases/dollar.ll22
-rw-r--r--tests/cases/i96_ashr_ta2.ll35
-rw-r--r--tests/cases/i96_ashr_ta2.txt3
-rw-r--r--tests/cases/ptrtoint_blockaddr.ll14
-rw-r--r--tests/core/emscripten_get_compiler_setting.c11
-rw-r--r--tests/core/emscripten_get_compiler_setting.out2
-rw-r--r--tests/emscripten_api_browser.cpp16
-rw-r--r--tests/fuzz/18.cpp1125
-rw-r--r--tests/fuzz/18.cpp.txt1
-rw-r--r--tests/fuzz/9.c1296
-rw-r--r--tests/fuzz/9.c.txt1
-rwxr-xr-xtests/fuzz/creduce_tester.py2
-rwxr-xr-xtests/fuzz/csmith_driver.py44
-rwxr-xr-xtests/fuzz/test.sh6
-rwxr-xr-xtests/fuzz/testpp.sh51
-rw-r--r--tests/hello_world.ll4
-rw-r--r--tests/module/test_stdin.c8
-rw-r--r--tests/printf/output.txt1
-rw-r--r--tests/printf/test.c1
-rw-r--r--tests/sockets/test_sockets_echo_client.c4
-rw-r--r--tests/sockets/test_sockets_echo_server.c4
-rw-r--r--tests/sockets/test_sockets_partial_client.c4
-rw-r--r--tests/sockets/test_sockets_partial_server.c4
-rw-r--r--tests/sockets/test_sockets_select_server_closes_connection_client_rw.c4
-rw-r--r--tests/sockets/test_sockets_select_server_down_client.c4
-rw-r--r--tests/sockets/test_sockets_select_server_down_server.c4
-rw-r--r--tests/sockets/webrtc_host.c6
-rw-r--r--tests/sockets/webrtc_peer.c6
-rw-r--r--tests/test_benchmark.py2
-rw-r--r--tests/test_browser.py9
-rw-r--r--tests/test_core.py48
-rw-r--r--tests/test_locale.c24
-rw-r--r--tests/test_locale.out12
-rw-r--r--tests/test_other.py29
-rw-r--r--tests/test_sanity.py12
-rw-r--r--tools/js-optimizer.js27
-rw-r--r--tools/make_minigzip.py2
-rw-r--r--tools/shared.py2
67 files changed, 3439 insertions, 651 deletions
diff --git a/AUTHORS b/AUTHORS
index b41199d6..6b548922 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -124,5 +124,6 @@ a license to everyone to use it as detailed in LICENSE.)
* jonas echterhoff <jonas@unity3d.com>
* Sami Vaarala <sami.vaarala@iki.fi>
* Jack A. Arrington <jack@epicpineapple.com>
-
-
+* Richard Janicek <r@janicek.co>
+* Joel Croteau <jcroteau@gmail.com>
+* Haneef Mubarak <haneef503@gmail.com>
diff --git a/LICENSE b/LICENSE
index f742692e..447ddba1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -13,7 +13,7 @@ The full text of both licenses follows.
==============================================================================
-Copyright (c) 2010-2011 Emscripten authors, see AUTHORS file.
+Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -35,7 +35,7 @@ THE SOFTWARE.
==============================================================================
-Copyright (c) 2010-2011 Emscripten authors, see AUTHORS file.
+Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
@@ -91,4 +91,4 @@ in accordance with the terms of the MIT license. Node's license follows:
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
- """ \ No newline at end of file
+ """
diff --git a/cmake/Platform/Emscripten.cmake b/cmake/Platform/Emscripten.cmake
index 4f434d14..7d86c467 100644
--- a/cmake/Platform/Emscripten.cmake
+++ b/cmake/Platform/Emscripten.cmake
@@ -125,20 +125,20 @@ set(CMAKE_C_SIZEOF_DATA_PTR 4)
set(CMAKE_CXX_SIZEOF_DATA_PTR 4)
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELEASE")
-set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL")
+set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELWITHDEBINFO")
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELEASE")
-set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL")
+set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELWITHDEBINFO")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELEASE")
-set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_MINSIZEREL")
+set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELEASE")
-set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL")
+set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELEASE")
-set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL")
+set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO")
function(em_validate_asmjs_after_build target)
diff --git a/emcc b/emcc
index 7aaf681b..6d8ff6f6 100755
--- a/emcc
+++ b/emcc
@@ -573,7 +573,7 @@ elif sys.argv[1] == '--version':
finally:
os.chdir(here)
print '''emcc (Emscripten GCC-like replacement) %s (%s)
-Copyright (C) 2013 the Emscripten authors (see AUTHORS.txt)
+Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
''' % (shared.EMSCRIPTEN_VERSION, revision)
@@ -1204,11 +1204,9 @@ try:
if fastcomp:
shared.Settings.ASM_JS = 1 if opt_level > 0 else 2
- assert shared.Settings.ALLOW_MEMORY_GROWTH == 0, 'memory growth not supported in fastcomp yet'
assert shared.Settings.UNALIGNED_MEMORY == 0, 'forced unaligned memory not supported in fastcomp'
assert shared.Settings.CHECK_HEAP_ALIGN == 0, 'check heap align not supported in fastcomp yet'
assert shared.Settings.SAFE_DYNCALLS == 0, 'safe dyncalls not supported in fastcomp'
- assert shared.Settings.RESERVED_FUNCTION_POINTERS == 0, 'reserved function pointers not supported in fastcomp'
assert shared.Settings.ASM_HEAP_LOG == 0, 'asm heap log not supported in fastcomp'
assert shared.Settings.LABEL_DEBUG == 0, 'label debug not supported in fastcomp'
assert shared.Settings.EXECUTION_TIMEOUT == -1, 'execution timeout not supported in fastcomp'
@@ -1218,6 +1216,8 @@ try:
assert shared.Settings.USE_TYPED_ARRAYS == 2, 'fastcomp assumes ta2'
assert not split_js_file, '--split-js is deprecated and not supported in fastcomp'
assert not bind, 'embind not supported in fastcomp yet'
+ assert shared.Settings.MAX_SETJMPS == 20, 'changing MAX_SETJMPS is not supported in fastcomp yet'
+ assert shared.Settings.INIT_HEAP == 0, 'HEAP_INIT is not supported in fastcomp (and should never be needed except for debugging)'
if jcache:
logging.warning('jcache is not supported in fastcomp (you should not need it anyhow), disabling')
jcache = False
@@ -1246,8 +1246,8 @@ try:
logging.warning('enabling js opts to allow SAFE_HEAP to work properly')
if shared.Settings.ALLOW_MEMORY_GROWTH:
- logging.error('Cannot enable ALLOW_MEMORY_GROWTH with asm.js, build with -s ASM_JS=0 if you need a growable heap');
- sys.exit(1);
+ logging.warning('Disabling asm.js validation for memory growth (memory can grow, but you lose some amount of speed)');
+ shared.Settings.ASM_JS = 2
if shared.Settings.CORRECT_SIGNS >= 2 or shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2:
debug_level = 4 # must keep debug info to do line-by-line operations
@@ -1308,6 +1308,10 @@ try:
if js_opts:
shared.Settings.RUNNING_JS_OPTS = 1
+ shared.Settings.EMSCRIPTEN_VERSION = shared.EMSCRIPTEN_VERSION
+ shared.Settings.OPT_LEVEL = opt_level
+ shared.Settings.DEBUG_LEVEL = debug_level
+
## Compile source code to bitcode
logging.debug('compiling to bitcode')
diff --git a/emscripten.py b/emscripten.py
index c96c56a0..59a0666c 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -744,6 +744,8 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
backend_args += ['-emscripten-precise-f32']
if settings['WARN_UNALIGNED']:
backend_args += ['-emscripten-warn-unaligned']
+ if settings['RESERVED_FUNCTION_POINTERS'] > 0:
+ backend_args += ['-emscripten-reserved-function-pointers=%d' % settings['RESERVED_FUNCTION_POINTERS']]
if DEBUG:
logging.debug('emscript: llvm backend: ' + ' '.join(backend_args))
t = time.time()
@@ -801,9 +803,13 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
# Settings changes
assert settings['TARGET_LE32'] == 1
settings['TARGET_LE32'] = 2
- if 'i64Add' in metadata['declares']: # TODO: others, once we split them up
- settings['PRECISE_I64_MATH'] = 2
- metadata['declares'] = filter(lambda i64_func: i64_func not in ['getHigh32', 'setHigh32', '__muldi3', '__divdi3', '__remdi3', '__udivdi3', '__uremdi3'], metadata['declares']) # FIXME: do these one by one as normal js lib funcs
+ i64_funcs = ['i64Add', 'i64Subtract', '__muldi3', '__divdi3', '__udivdi3', '__remdi3', '__uremdi3']
+ for i64_func in i64_funcs:
+ if i64_func in metadata['declares']:
+ settings['PRECISE_I64_MATH'] = 2
+ break
+
+ metadata['declares'] = filter(lambda i64_func: i64_func not in ['getHigh32', 'setHigh32', '__muldi3', '__divdi3', '__remdi3', '__udivdi3', '__uremdi3'], metadata['declares']) # FIXME: do these one by one as normal js lib funcs
# Integrate info from backend
settings['DEFAULT_LIBRARY_FUNCS_TO_INCLUDE'] = list(
@@ -912,28 +918,48 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
def unfloat(s):
return 'd' if s == 'f' else s # lower float to double for ffis
+ if settings['ASSERTIONS'] >= 2:
+ debug_tables = {}
+
def make_table(sig, raw):
- i = Counter.i
- Counter.i += 1
- bad = 'b' + str(i)
+ Counter.pre = ''
params = ','.join(['p%d' % p for p in range(len(sig)-1)])
coerced_params = ','.join([shared.JS.make_coercion('p%d', unfloat(sig[p+1]), settings) % p for p in range(len(sig)-1)])
coercions = ';'.join(['p%d = %s' % (p, shared.JS.make_coercion('p%d' % p, sig[p+1], settings)) for p in range(len(sig)-1)]) + ';'
def make_func(name, code):
return 'function %s(%s) { %s %s }' % (name, params, coercions, code)
- Counter.pre = [make_func(bad, ('abort' if not settings['ASSERTIONS'] else 'nullFunc') + '(' + str(i) + ');' + (
- '' if sig[0] == 'v' else ('return %s' % shared.JS.make_initializer(sig[0], settings))
- ))]
+ def make_bad(target=None):
+ i = Counter.i
+ Counter.i += 1
+ if target is None: target = i
+ name = 'b' + str(i)
+ if not settings['ASSERTIONS']:
+ code = 'abort(%s);' % target
+ else:
+ code = 'nullFunc_' + sig + '(%d);' % target
+ if sig[0] != 'v':
+ code += 'return %s' % shared.JS.make_initializer(sig[0], settings) + ';'
+ return name, make_func(name, code)
+ bad, bad_func = make_bad() # the default bad func
+ Counter.pre = [bad_func]
start = raw.index('[')
end = raw.rindex(']')
body = raw[start+1:end].split(',')
for j in range(settings['RESERVED_FUNCTION_POINTERS']):
- body[settings['FUNCTION_POINTER_ALIGNMENT'] * (1 + j)] = 'jsCall_%s_%s' % (sig, j)
+ curr = 'jsCall_%s_%s' % (sig, j)
+ body[settings['FUNCTION_POINTER_ALIGNMENT'] * (1 + j)] = curr
+ implemented_functions.add(curr)
Counter.j = 0
def fix_item(item):
Counter.j += 1
newline = Counter.j % 30 == 29
- if item == '0': return bad if not newline else (bad + '\n')
+ if item == '0':
+ if settings['ASSERTIONS'] <= 1:
+ return bad if not newline else (bad + '\n')
+ else:
+ specific_bad, specific_bad_func = make_bad(Counter.j)
+ Counter.pre.append(specific_bad_func)
+ return specific_bad if not newline else (specific_bad + '\n')
if item not in implemented_functions:
# this is imported into asm, we must wrap it
call_ident = item
@@ -948,6 +974,8 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
Counter.pre.append(make_func(item + '__wrapper', code))
return item + '__wrapper'
return item if not newline else (item + '\n')
+ if settings['ASSERTIONS'] >= 2:
+ debug_tables[sig] = body
body = ','.join(map(fix_item, body))
return ('\n'.join(Counter.pre), ''.join([raw[:start+1], body, raw[end:]]))
@@ -969,8 +997,20 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE']
if settings['CHECK_HEAP_ALIGN']: basic_funcs += ['CHECK_ALIGN_2', 'CHECK_ALIGN_4', 'CHECK_ALIGN_8']
if settings['ASSERTIONS']:
- basic_funcs += ['nullFunc']
- asm_setup += 'function nullFunc(x) { Module["printErr"]("Invalid function pointer called. Perhaps a miscast function pointer (check compilation warnings) or bad vtable lookup (maybe due to derefing a bad pointer, like NULL)?"); abort(x) }\n'
+ for sig in last_forwarded_json['Functions']['tables'].iterkeys():
+ basic_funcs += ['nullFunc_' + sig]
+ if settings['ASSERTIONS'] <= 1:
+ extra = ' Module["printErr"]("Build with ASSERTIONS=2 for more info.");'
+ pointer = ' '
+ else:
+ pointer = ' \'" + x + "\' '
+ asm_setup += '\nvar debug_table_' + sig + ' = ' + json.dumps(debug_tables[sig]) + ';'
+ extra = ' Module["printErr"]("This pointer might make sense in another type signature: '
+ for other in last_forwarded_json['Functions']['tables'].iterkeys():
+ if other != sig:
+ extra += other + ': " + debug_table_' + other + '[x] + " '
+ extra += '"); '
+ asm_setup += '\nfunction nullFunc_' + sig + '(x) { Module["printErr"]("Invalid function pointer' + pointer + 'called with signature \'' + sig + '\'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an different type, which will fail?"); ' + extra + ' abort(x) }\n'
basic_vars = ['STACKTOP', 'STACK_MAX', 'tempDoublePtr', 'ABORT']
basic_float_vars = ['NaN', 'Infinity']
diff --git a/src/jsifier.js b/src/jsifier.js
index 35846d39..c1ca893b 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -1419,7 +1419,7 @@ function JSify(data, functionsOnly) {
// store current list offset in tempInt, advance list offset by STACK_ALIGN, return list entry stored at tempInt
return '(tempInt=' + makeGetValue(ident, Runtime.QUANTUM_SIZE, '*') + ',' +
- makeSetValue(ident, Runtime.QUANTUM_SIZE, 'tempInt + ' + move, '*', null, null, null, null, ',') + ',' +
+ makeSetValue(ident, Runtime.QUANTUM_SIZE, asmCoercion('tempInt + ' + move, 'i32'), '*', null, null, null, null, ',') + ',' +
makeGetValue(makeGetValue(ident, 0, '*'), 'tempInt', item.type) + ')';
}
diff --git a/src/library.js b/src/library.js
index f69b52e5..91d5f925 100644
--- a/src/library.js
+++ b/src/library.js
@@ -131,7 +131,7 @@ LibraryManager.library = {
stream.position++;
return 0;
},
- readdir__deps: ['readdir_r', '__setErrNo', '$ERRNO_CODES'],
+ readdir__deps: ['readdir_r', '__setErrNo', '$ERRNO_CODES', 'malloc'],
readdir: function(dirp) {
// struct dirent *readdir(DIR *dirp);
// http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html
@@ -1021,7 +1021,7 @@ LibraryManager.library = {
return -1;
}
},
- ttyname__deps: ['ttyname_r'],
+ ttyname__deps: ['ttyname_r', 'malloc'],
ttyname: function(fildes) {
// char *ttyname(int fildes);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/ttyname.html
@@ -1287,7 +1287,7 @@ LibraryManager.library = {
return -1;
}
},
- getlogin__deps: ['getlogin_r'],
+ getlogin__deps: ['getlogin_r', 'malloc'],
getlogin: function() {
// char *getlogin(void);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/getlogin.html
@@ -1970,7 +1970,7 @@ LibraryManager.library = {
}
next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
}
- if (precision === -1) {
+ if (precision < 0) {
precision = 6; // Standard default.
precisionSet = false;
}
@@ -2695,7 +2695,7 @@ LibraryManager.library = {
if (buf) _setvbuf(stream, buf, 0, 8192); // _IOFBF, BUFSIZ.
else _setvbuf(stream, buf, 2, 8192); // _IONBF, BUFSIZ.
},
- tmpnam__deps: ['$FS'],
+ tmpnam__deps: ['$FS', 'malloc'],
tmpnam: function(s, dir, prefix) {
// char *tmpnam(char *s);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpnam.html
@@ -2792,7 +2792,7 @@ LibraryManager.library = {
function unget() { index--; };
return __scanString(format, get, unget, varargs);
},
- snprintf__deps: ['_formatString'],
+ snprintf__deps: ['_formatString', 'malloc'],
snprintf: function(s, n, format, varargs) {
// int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
@@ -2903,7 +2903,7 @@ LibraryManager.library = {
// sys/mman.h
// ==========================================================================
- mmap__deps: ['$FS'],
+ mmap__deps: ['$FS', 'malloc', 'memset'],
mmap: function(start, num, prot, flags, fd, offset) {
/* FIXME: Since mmap is normally implemented at the kernel level,
* this implementation simply uses malloc underneath the call to
@@ -3061,7 +3061,7 @@ LibraryManager.library = {
return 0;
},
- realloc__deps: ['memcpy'],
+ realloc__deps: ['malloc', 'memcpy', 'free'],
realloc: function(ptr, size) {
// Very simple, inefficient implementation - if you use a real malloc, best to use
// a real realloc with it
@@ -3275,7 +3275,7 @@ LibraryManager.library = {
return _strtoll(ptr, null, 10);
},
- qsort__deps: ['memcpy'],
+ qsort__deps: ['malloc', 'memcpy', 'free'],
qsort: function(base, num, size, cmp) {
if (num == 0 || size == 0) return;
// forward calls to the JavaScript sort method
@@ -3825,7 +3825,7 @@ LibraryManager.library = {
},
rindex: 'strrchr',
- strdup__deps: ['strlen'],
+ strdup__deps: ['strlen', 'malloc'],
strdup: function(ptr) {
var len = _strlen(ptr);
var newStr = _malloc(len + 1);
@@ -3834,7 +3834,7 @@ LibraryManager.library = {
return newStr;
},
- strndup__deps: ['strdup', 'strlen'],
+ strndup__deps: ['strdup', 'strlen', 'malloc'],
strndup: function(ptr, size) {
var len = _strlen(ptr);
@@ -3942,7 +3942,7 @@ LibraryManager.library = {
return ___setErrNo(ERRNO_CODES.EINVAL);
}
},
- strerror__deps: ['strerror_r'],
+ strerror__deps: ['strerror_r', 'malloc'],
strerror: function(errnum) {
if (!_strerror.buffer) _strerror.buffer = _malloc(256);
_strerror_r(errnum, _strerror.buffer, 256);
@@ -4080,6 +4080,7 @@ LibraryManager.library = {
return _isgraph(chr); // no locale support yet
},
// Lookup tables for glibc ctype implementation.
+ __ctype_b_loc__deps: ['malloc'],
__ctype_b_loc: function(