aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js5
-rw-r--r--src/library_gl.js36
-rw-r--r--src/parseTools.js2
-rw-r--r--tests/cases/emptystruct.ll21
-rwxr-xr-xtests/runner.py9
-rw-r--r--tools/shared.py20
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