aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc5
-rw-r--r--src/library.js4
-rw-r--r--src/library_fs.js22
-rw-r--r--src/library_memfs.js66
-rw-r--r--src/library_sdl.js7
-rw-r--r--src/shell.js7
-rw-r--r--tools/js-optimizer.js5
7 files changed, 78 insertions, 38 deletions
diff --git a/emcc b/emcc
index b63eada0..df2ef38c 100755
--- a/emcc
+++ b/emcc
@@ -137,7 +137,7 @@ Options that are modified or new in %s include:
opt levels, see apply_opt_level() in
tools/shared.py and also src/settings.js.)
-O2 As -O1, plus the relooper (loop recreation),
- LLVM -O2 optimizations, and
+ LLVM -O3 optimizations, and
-s ALIASING_FUNCTION_POINTERS=1
@@ -1621,9 +1621,6 @@ try:
js_optimizer_queue += [get_eliminate(), 'simplifyExpressions']
- if shared.Settings.RELOOP and not shared.Settings.ASM_JS:
- js_optimizer_queue += ['optimizeShiftsAggressive', get_eliminate()] # aggressive shifts optimization requires loops, it breaks on switches
-
if closure and not shared.Settings.ASM_JS:
flush_js_optimizer_queue()
diff --git a/src/library.js b/src/library.js
index 872c33a7..9e78db13 100644
--- a/src/library.js
+++ b/src/library.js
@@ -100,7 +100,7 @@ LibraryManager.library = {
}
var entries;
try {
- entries = FS.readdir(stream);
+ entries = FS.readdir(stream.path);
} catch (e) {
return FS.handleFSError(e);
}
@@ -478,8 +478,6 @@ LibraryManager.library = {
open: function(path, oflag, varargs) {
// int open(const char *path, int oflag, ...);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
- // NOTE: This implementation tries to mimic glibc rather than strictly
- // following the POSIX standard.
var mode = {{{ makeGetValue('varargs', 0, 'i32') }}};
path = Pointer_stringify(path);
try {
diff --git a/src/library_fs.js b/src/library_fs.js
index 9c83fcad..8ea6b06f 100644
--- a/src/library_fs.js
+++ b/src/library_fs.js
@@ -51,7 +51,7 @@ mergeInto(LibraryManager.library, {
for (var i = 0; i < name.length; i++) {
hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
}
- return (parentid + hash) % FS.name_table.length;
+ return ((parentid + hash) >>> 0) % FS.name_table.length;
},
hashAddNode: function(node) {
var hash = FS.hashName(node.parent.id, node.name);
@@ -730,6 +730,9 @@ mergeInto(LibraryManager.library, {
});
// use a custom read function
stream_ops.read = function(stream, buffer, offset, length, position) {
+ if (!FS.forceLoadFile(node)) {
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
+ }
var contents = stream.node.contents;
var size = Math.min(contents.length - position, length);
if (contents.slice) { // normal array
@@ -1035,7 +1038,7 @@ mergeInto(LibraryManager.library, {
FS.hashRemoveNode(old_node);
// do the underlying fs rename
try {
- old_node.node_ops.rename(old_node, new_dir, new_name);
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
} catch (e) {
throw e;
} finally {
@@ -1062,6 +1065,14 @@ mergeInto(LibraryManager.library, {
parent.node_ops.rmdir(parent, name);
FS.destroyNode(node);
},
+ readdir: function(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node.node_ops.readdir) {
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
+ }
+ return node.node_ops.readdir(node);
+ },
unlink: function(path) {
var lookup = FS.lookupPath(path, { parent: true });
var parent = lookup.node;
@@ -1202,6 +1213,7 @@ mergeInto(LibraryManager.library, {
open: function(path, flags, mode, fd_start, fd_end) {
path = PATH.normalize(path);
flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
+ mode = typeof mode === 'undefined' ? 0666 : mode;
if ((flags & {{{ cDefine('O_CREAT') }}})) {
mode = (mode & {{{ cDefine('S_IALLUGO') }}}) | {{{ cDefine('S_IFREG') }}};
} else {
@@ -1280,12 +1292,6 @@ mergeInto(LibraryManager.library, {
}
return stream.stream_ops.llseek(stream, offset, whence);
},
- readdir: function(stream) {
- if (!stream.stream_ops.readdir) {
- throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
- }
- return stream.stream_ops.readdir(stream);
- },
read: function(stream, buffer, offset, length, position) {
if (length < 0 || position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
diff --git a/src/library_memfs.js b/src/library_memfs.js
index a044e0c6..0fa6cdfb 100644
--- a/src/library_memfs.js
+++ b/src/library_memfs.js
@@ -10,16 +10,48 @@ mergeInto(LibraryManager.library, {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
var node = FS.createNode(parent, name, mode, dev);
- node.node_ops = MEMFS.node_ops;
if (FS.isDir(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ lookup: MEMFS.node_ops.lookup,
+ mknod: MEMFS.node_ops.mknod,
+ mknod: MEMFS.node_ops.mknod,
+ rename: MEMFS.node_ops.rename,
+ unlink: MEMFS.node_ops.unlink,
+ rmdir: MEMFS.node_ops.rmdir,
+ readdir: MEMFS.node_ops.readdir,
+ symlink: MEMFS.node_ops.symlink
+ };
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek
+ };
node.contents = {};
} else if (FS.isFile(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr
+ };
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek,
+ read: MEMFS.stream_ops.read,
+ write: MEMFS.stream_ops.write,
+ allocate: MEMFS.stream_ops.allocate,
+ mmap: MEMFS.stream_ops.mmap
+ };
node.contents = [];
} else if (FS.isLink(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ readlink: MEMFS.node_ops.readlink
+ };
+ node.stream_ops = {};
} else if (FS.isChrdev(node.mode)) {
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr
+ };
node.stream_ops = FS.chrdev_stream_ops;
}
node.timestamp = Date.now();
@@ -106,6 +138,16 @@ mergeInto(LibraryManager.library, {
}
delete parent.contents[name];
},
+ readdir: function(node) {
+ var entries = ['.', '..']
+ for (var key in node.contents) {
+ if (!node.contents.hasOwnProperty(key)) {
+ continue;
+ }
+ entries.push(key);
+ }
+ return entries;
+ },
symlink: function(parent, newname, oldpath) {
var node = MEMFS.create_node(parent, newname, 0777 | {{{ cDefine('S_IFLNK') }}}, 0);
node.link = oldpath;
@@ -119,19 +161,6 @@ mergeInto(LibraryManager.library, {
},
},
stream_ops: {
- open: function(stream) {
- if (FS.isDir(stream.node.mode)) {
- // cache off the directory entries when open'd
- var entries = ['.', '..']
- for (var key in stream.node.contents) {
- if (!stream.node.contents.hasOwnProperty(key)) {
- continue;
- }
- entries.push(key);
- }
- stream.entries = entries;
- }
- },
read: function(stream, buffer, offset, length, position) {
var contents = stream.node.contents;
var size = Math.min(contents.length - position, length);
@@ -172,9 +201,6 @@ mergeInto(LibraryManager.library, {
stream.position = position;
return position;
},
- readdir: function(stream) {
- return stream.entries;
- },
allocate: function(stream, offset, length) {
var contents = stream.node.contents;
var limit = offset + length;
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 92cfc7e5..6cc337e8 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -258,7 +258,7 @@ var LibrarySDL = {
makeSurface: function(width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) {
flags = flags || 0;
- var surf = _malloc(14*Runtime.QUANTUM_SIZE); // SDL_Surface has 14 fields of quantum size
+ var surf = _malloc(15*Runtime.QUANTUM_SIZE); // SDL_Surface has 15 fields of quantum size
var buffer = _malloc(width*height*4); // TODO: only allocate when locked the first time
var pixelFormat = _malloc(18*Runtime.QUANTUM_SIZE);
flags |= 1; // SDL_HWSURFACE - this tells SDL_MUSTLOCK that this needs to be locked
@@ -755,6 +755,11 @@ var LibrarySDL = {
return depth; // all modes are ok.
},
+ SDL_AudioDriverName__deps: ['SDL_VideoDriverName'],
+ SDL_AudioDriverName: function(buf, max_size) {
+ return _SDL_VideoDriverName(buf, max_size);
+ },
+
SDL_VideoDriverName: function(buf, max_size) {
if (SDL.startTime === null) {
return 0; //return NULL
diff --git a/src/shell.js b/src/shell.js
index bac4eaa3..f91aa96a 100644
--- a/src/shell.js
+++ b/src/shell.js
@@ -74,7 +74,12 @@ else if (ENVIRONMENT_IS_SHELL) {
Module['print'] = print;
if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
- Module['read'] = read;
+ if (typeof read != 'undefined') {
+ Module['read'] = read;
+ } else {
+ Module['read'] = function() { throw 'no read() available (jsc?)' };
+ }
+
Module['readBinary'] = function(f) {
return read(f, 'binary');
};
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 7d72b7b8..e61317af 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -801,7 +801,10 @@ function simplifyExpressions(ast) {
// HEAP[x >> 2]
// very often. We can in some cases do the shift on the variable itself when it is set,
// to greatly reduce the number of shift operations.
-// TODO: when shifting a variable, if there are other uses, keep an unshifted version too, to prevent slowdowns?
+// XXX this optimization is deprecated and currently invalid: does not handle overflows
+// or non-aligned (round numbers, x >> 2 is a multiple of 4). Both are ok to assume
+// for pointers (undefined behavior otherwise), but invalid in general, and we do
+// no sufficiently-well distinguish the cases.
function optimizeShiftsInternal(ast, conservative) {
var MAX_SHIFTS = 3;
traverseGeneratedFunctions(ast, function(fun) {