aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parseTools.js3
-rwxr-xr-xtests/runner.py24
2 files changed, 27 insertions, 0 deletions
diff --git a/src/parseTools.js b/src/parseTools.js
index e37f3a99..80ba269b 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -1265,6 +1265,9 @@ function makePointer(slab, pos, allocator, type) {
de = dedup(evaled);
if (de.length === 1 && de[0] === 0) {
slab = types.length;
+ if (USE_TYPED_ARRAYS == 2) {
+ types = ['i8']; // if data is zeros, we don't need type info
+ }
}
// TODO: if not all zeros, at least filter out items with type === 0. requires cleverness to know how to skip at runtime though. also
// be careful of structure padding
diff --git a/tests/runner.py b/tests/runner.py
index a089d7b8..513a0434 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -2466,6 +2466,30 @@ c5,de,15,8a
'''
self.do_run(src, '*70,97,15,3,3029,90*')
+ def test_bigarray(self):
+ if self.emcc_args is None: return self.skip('need ta2 to compress type data on zeroinitializers')
+
+ # avoid "array initializer too large" errors
+ src = r'''
+ #include <stdio.h>
+ #include <assert.h>
+
+ #define SIZE (1024*100)
+ struct Struct {
+ char x;
+ int y;
+ };
+ Struct buffy[SIZE];
+
+ int main() {
+ for (int i = 0; i < SIZE; i++) { assert(buffy[i].x == 0 && buffy[i].y == 0); } // we were zeroinitialized
+ for (int i = 0; i < SIZE; i++) { buffy[i].x = i*i; buffy[i].y = i*i*i; } // we can save data
+ printf("*%d*\n", buffy[SIZE/3].x);
+ return 0;
+ }
+ '''
+ self.do_run(src, '*57*')
+
def test_mod_globalstruct(self):
src = '''
#include <stdio.h>