diff options
-rw-r--r-- | src/library.js | 5 | ||||
-rw-r--r-- | src/library_gl.js | 36 | ||||
-rw-r--r-- | src/parseTools.js | 2 | ||||
-rw-r--r-- | tests/cases/emptystruct.ll | 21 | ||||
-rwxr-xr-x | tests/runner.py | 9 | ||||
-rw-r--r-- | tools/shared.py | 20 |
6 files changed, 81 insertions, 12 deletions
diff --git a/src/library.js b/src/library.js index cc28ce6f..56583c76 100644 --- a/src/library.js +++ b/src/library.js @@ -3302,8 +3302,9 @@ LibraryManager.library = { } var info = FS.streams[stream]; if (!info) return -1; - return allocate(info.object.contents.slice(offset, offset+num), - 'i8', ALLOC_NORMAL); + var contents = info.object.contents; + contents = Array.prototype.slice.call(contents, offset, offset+num); + return allocate(contents, 'i8', ALLOC_NORMAL); }, __01mmap64_: 'mmap', diff --git a/src/library_gl.js b/src/library_gl.js index 3ec7c81e..97a050d5 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -393,6 +393,24 @@ var LibraryGL = { return id; }, + glGetActiveUniform: function(program, index, bufSize, length, size, type, name) { + program = GL.programs[program]; + var info = Module.ctx.getActiveUniform(program, index); + + var infoname = info.name.slice(0, bufsize - 1); + writeStringToMemory(infoname, name); + + if (length) { + {{{ makeSetValue('length', '0', 'infoname.length', 'i32') }}}; + } + if (size) { + {{{ makeSetValue('size', '0', 'info.size', 'i32') }}}; + } + if (type) { + {{{ makeSetValue('type', '0', 'info.type', 'i32') }}}; + } + }, + glUniform1f: function(location, v0) { location = GL.uniforms[location]; Module.ctx.uniform1f(location, v0); @@ -538,6 +556,24 @@ var LibraryGL = { return Module.ctx.getAttribLocation(program, name); }, + glGetActiveAttrib: function(program, index, bufSize, length, size, type, name) { + program = GL.programs[program]; + var info = Module.ctx.getActiveAttrib(program, index); + + var infoname = info.name.slice(0, bufsize - 1); + writeStringToMemory(infoname, name); + + if (length) { + {{{ makeSetValue('length', '0', 'infoname.length', 'i32') }}}; + } + if (size) { + {{{ makeSetValue('size', '0', 'info.size', 'i32') }}}; + } + if (type) { + {{{ makeSetValue('type', '0', 'info.type', 'i32') }}}; + } + }, + glCreateShader: function(shaderType) { var id = GL.counter++; GL.shaders[id] = Module.ctx.createShader(shaderType); diff --git a/src/parseTools.js b/src/parseTools.js index 805be4b1..2daf9589 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -123,7 +123,7 @@ function isPointerType(type) { function isStructType(type) { if (isPointerType(type)) return false; if (/^\[\d+\ x\ (.*)\]/.test(type)) return true; // [15 x ?] blocks. Like structs - if (/<?{ [^}]* }>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types + if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types // See comment in isStructPointerType() return type[0] == '%'; } diff --git a/tests/cases/emptystruct.ll b/tests/cases/emptystruct.ll new file mode 100644 index 00000000..d4165fdd --- /dev/null +++ b/tests/cases/emptystruct.ll @@ -0,0 +1,21 @@ +; ModuleID = 'emptystruct.c' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +%struct.s = type { {}, i32 } + +@.str = private constant [14 x i8] c"hello, world!\00", align 1 ; [#uses=1] + +define i32 @main() nounwind { +entry: + %z = alloca %struct.s, align 4 + %0 = bitcast %struct.s* %z to i8* + call void @llvm.memset.p0i8.i32(i8* %0, i8 0, i32 4, i32 4, i1 false) + %0 = call i32 bitcast (i32 (i8*)* @puts to i32 (i32*)*)(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ; [#uses=0] + ret i32 0 +} + +declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind + +declare i32 @puts(i8*) + diff --git a/tests/runner.py b/tests/runner.py index d16d3e8b..99175b36 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -6961,6 +6961,15 @@ elif 'browser' in str(sys.argv): assert os.path.exists('something.html'), output self.run_browser('something.html', 'You should see animating gears.', '/report_result?0') + def test_glgears_animation(self): + output = Popen(['python', EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html', + '-DHAVE_BUILTIN_SINCOS', + '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')], + stdout=PIPE, stderr=PIPE).communicate() + assert len(output[0]) == 0, output[0] + assert os.path.exists('something.html'), output + self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true') + def test_glgears_bad(self): # Make sure that OpenGL ES is not available if typed arrays are not used output = Popen(['python', EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html', diff --git a/tools/shared.py b/tools/shared.py index 04c2eec3..532f561f 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -115,18 +115,20 @@ EXEC_LLVM = path_from_root('tools', 'exec_llvm.py') VARIABLE_ELIMINATOR = path_from_root('tools', 'eliminator', 'eliminator.coffee') JS_OPTIMIZER = path_from_root('tools', 'js-optimizer.js') -# Temp dir +# Temp dir. Create a random one, unless EMCC_DEBUG is set, in which case use TEMP_DIR/emscripten_temp -try: - EMSCRIPTEN_TEMP_DIR = os.path.join(TEMP_DIR, 'emscripten_temp') - if not os.path.exists(EMSCRIPTEN_TEMP_DIR): - try: +EMSCRIPTEN_TEMP_DIR = None + +if os.environ.get('EMCC_DEBUG'): + try: + EMSCRIPTEN_TEMP_DIR = os.path.join(TEMP_DIR, 'emscripten_temp') + if not os.path.exists(EMSCRIPTEN_TEMP_DIR): os.makedirs(EMSCRIPTEN_TEMP_DIR) - except Exception, e: - print >> sys.stderr, 'Warning: Could not create temp dir (%s): %s' % (EMSCRIPTEN_TEMP_DIR, str(e)) -except: + except: + print >> sys.stderr, 'Could not create canonical temp dir. Check definition of TEMP_DIR in ~/.emscripten' + +if not EMSCRIPTEN_TEMP_DIR: EMSCRIPTEN_TEMP_DIR = tempfile.mkdtemp(prefix='emscripten_temp_') - print >> sys.stderr, 'Warning: TEMP_DIR not defined in %s, using %s' % (EM_CONFIG, EMSCRIPTEN_TEMP_DIR) # EM_CONFIG stuff |