webruby 0.2.5 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby.rb +0 -4
  3. data/lib/webruby/app.rb +4 -0
  4. data/lib/webruby/rake/files.rake +2 -1
  5. data/lib/webruby/rake/mruby.rake +1 -1
  6. data/modules/emscripten/AUTHORS +1 -0
  7. data/modules/emscripten/ChangeLog +34 -1
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +30 -9
  9. data/modules/emscripten/emcc +61 -28
  10. data/modules/emscripten/emrun +15 -11
  11. data/modules/emscripten/emscripten.py +3 -0
  12. data/modules/emscripten/src/closure-externs.js +110 -0
  13. data/modules/emscripten/src/intertyper.js +1 -1
  14. data/modules/emscripten/src/jsifier.js +7 -21
  15. data/modules/emscripten/src/library.js +2 -1
  16. data/modules/emscripten/src/library_browser.js +16 -5
  17. data/modules/emscripten/src/library_fs.js +3 -1
  18. data/modules/emscripten/src/library_gl.js +691 -591
  19. data/modules/emscripten/src/library_glut.js +2 -0
  20. data/modules/emscripten/src/library_sdl.js +29 -5
  21. data/modules/emscripten/src/library_uuid.js +140 -0
  22. data/modules/emscripten/src/modules.js +1 -1
  23. data/modules/emscripten/src/parseTools.js +29 -19
  24. data/modules/emscripten/src/postamble.js +3 -4
  25. data/modules/emscripten/src/preamble.js +17 -1
  26. data/modules/emscripten/src/relooper/Relooper.cpp +8 -8
  27. data/modules/emscripten/src/relooper/Relooper.h +5 -5
  28. data/modules/emscripten/src/relooper/test.txt +2 -2
  29. data/modules/emscripten/src/runtime.js +1 -1
  30. data/modules/emscripten/src/settings.js +3 -0
  31. data/modules/emscripten/src/struct_info.json +12 -0
  32. data/modules/emscripten/system/include/uuid/uuid.h +35 -0
  33. data/modules/emscripten/tools/js-optimizer.js +191 -142
  34. data/modules/emscripten/tools/js_optimizer.py +3 -29
  35. data/modules/emscripten/tools/shared.py +43 -6
  36. data/modules/mruby/include/mruby/value.h +3 -2
  37. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +5 -9
  38. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +3 -5
  39. data/modules/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +0 -3
  40. data/modules/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +0 -1
  41. data/modules/mruby/mrbgems/mruby-random/src/mt19937ar.c +0 -1
  42. data/modules/mruby/mrbgems/mruby-range-ext/src/range.c +2 -6
  43. data/modules/mruby/mrbgems/mruby-sprintf/src/sprintf.c +0 -4
  44. data/modules/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +22 -0
  45. data/modules/mruby/mrbgems/mruby-string-ext/src/string.c +2 -2
  46. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +21 -2
  47. data/modules/mruby/mrbgems/mruby-string-utf8/mrbgem.rake +4 -0
  48. data/modules/mruby/mrbgems/mruby-string-utf8/src/string.c +297 -0
  49. data/modules/mruby/mrbgems/mruby-string-utf8/test/string.rb +27 -0
  50. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +0 -1
  51. data/modules/mruby/mrblib/init_mrblib.c +0 -3
  52. data/modules/mruby/src/array.c +22 -8
  53. data/modules/mruby/src/backtrace.c +12 -9
  54. data/modules/mruby/src/class.c +3 -3
  55. data/modules/mruby/src/codegen.c +17 -5
  56. data/modules/mruby/src/dump.c +5 -6
  57. data/modules/mruby/src/error.c +0 -2
  58. data/modules/mruby/src/etc.c +0 -2
  59. data/modules/mruby/src/gc.c +4 -8
  60. data/modules/mruby/src/load.c +1 -6
  61. data/modules/mruby/src/numeric.c +0 -6
  62. data/modules/mruby/src/object.c +3 -5
  63. data/modules/mruby/src/parse.y +37 -38
  64. data/modules/mruby/src/proc.c +8 -1
  65. data/modules/mruby/src/range.c +3 -7
  66. data/modules/mruby/src/state.c +0 -1
  67. data/modules/mruby/src/string.c +2 -17
  68. data/modules/mruby/src/symbol.c +0 -1
  69. data/modules/mruby/src/variable.c +3 -22
  70. data/modules/mruby/src/vm.c +9 -8
  71. data/modules/mruby/tasks/mrbgem_spec.rake +13 -5
  72. data/modules/mruby/tasks/mrbgems_test.rake +3 -3
  73. data/modules/mruby/tasks/mruby_build_commands.rake +2 -2
  74. data/modules/mruby/tasks/mruby_build_gem.rake +3 -3
  75. data/modules/mruby/test/init_mrbtest.c +0 -3
  76. data/modules/mruby/test/t/array.rb +12 -1
  77. data/modules/mruby/test/t/class.rb +67 -0
  78. data/modules/mruby/test/t/exception.rb +12 -0
  79. data/modules/mruby/test/t/kernel.rb +75 -1
  80. data/modules/mruby/test/t/syntax.rb +115 -0
  81. data/scripts/gen_require.rb +12 -1
  82. metadata +8 -2
@@ -126,6 +126,8 @@ var LibraryGLUT = {
126
126
  return keycode - 106 + 42; // *,+-./ TODO handle shift?
127
127
 
128
128
  switch (keycode) {
129
+ case 9: // tab key
130
+ case 13: // return key
129
131
  case 27: // escape
130
132
  case 32: // space
131
133
  case 61: // equal
@@ -1059,11 +1059,35 @@ var LibrarySDL = {
1059
1059
  var src = buffer >> 2;
1060
1060
  var dst = 0;
1061
1061
  var isScreen = surf == SDL.screen;
1062
- var data32 = new Uint32Array(data.buffer);
1063
- var num = data32.length;
1064
- while (dst < num) {
1065
- // HEAP32[src++] is an optimization. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}};
1066
- data32[dst++] = HEAP32[src++] | (isScreen ? 0xff000000 : 0);
1062
+ var num;
1063
+ if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) {
1064
+ // IE10/IE11: ImageData objects are backed by the deprecated CanvasPixelArray,
1065
+ // not UInt8ClampedArray. These don't have buffers, so we need to revert
1066
+ // to copying a byte at a time. We do the undefined check because modern
1067
+ // browsers do not define CanvasPixelArray anymore.
1068
+ num = data.length;
1069
+ while (dst < num) {
1070
+ var val = HEAP32[src]; // This is optimized. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}};
1071
+ data[dst ] = val & 0xff;
1072
+ data[dst+1] = (val >> 8) & 0xff;
1073
+ data[dst+2] = (val >> 16) & 0xff;
1074
+ data[dst+3] = isScreen ? 0xff : ((val >> 24) & 0xff);
1075
+ src++;
1076
+ dst += 4;
1077
+ }
1078
+ } else {
1079
+ var data32 = new Uint32Array(data.buffer);
1080
+ num = data32.length;
1081
+ if (isScreen) {
1082
+ while (dst < num) {
1083
+ // HEAP32[src++] is an optimization. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}};
1084
+ data32[dst++] = HEAP32[src++] | 0xff000000;
1085
+ }
1086
+ } else {
1087
+ while (dst < num) {
1088
+ data32[dst++] = HEAP32[src++];
1089
+ }
1090
+ }
1067
1091
  }
1068
1092
  #else
1069
1093
  var num = surfData.image.data.length;
@@ -0,0 +1,140 @@
1
+ // Implementation of libuuid creating RFC4122 version 4 random UUIDs.
2
+
3
+ mergeInto(LibraryManager.library, {
4
+ // Clear a 'compact' UUID.
5
+ uuid_clear: function(uu) {
6
+ // void uuid_clear(uuid_t uu);
7
+ _memset(uu, 0, 16);
8
+ },
9
+
10
+ // Compare whether or not two 'compact' UUIDs are the same.
11
+ // Returns an integer less than, equal to, or greater than zero if uu1 is found, respectively, to be
12
+ // lexigraphically less than, equal, or greater than uu2.
13
+ uuid_compare__deps: ['memcmp'],
14
+ uuid_compare: function(uu1, uu2) {
15
+ // int uuid_compare(const uuid_t uu1, const uuid_t uu2);
16
+ return _memcmp(uu1, uu2, 16);
17
+ },
18
+
19
+ // Copies the 'compact' UUID variable from src to dst.
20
+ uuid_copy: function(dst, src) {
21
+ // void uuid_copy(uuid_t dst, const uuid_t src);
22
+ _memcpy(dst, src, 16);
23
+ },
24
+
25
+ // Write a RFC4122 version 4 compliant UUID largely based on the method found in
26
+ // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript
27
+ // tweaked slightly in order to use the 'compact' UUID form used by libuuid.
28
+ uuid_generate: function(out) {
29
+ // void uuid_generate(uuid_t out);
30
+ var uuid = null;
31
+
32
+ if (ENVIRONMENT_IS_NODE) {
33
+ // If Node.js try to use crypto.randomBytes
34
+ try {
35
+ var rb = require('crypto').randomBytes;
36
+ uuid = rb(16);
37
+ } catch(e) {}
38
+ } else if (ENVIRONMENT_IS_WEB &&
39
+ typeof(window.crypto) !== 'undefined' &&
40
+ typeof(window.crypto.getRandomValues) !== 'undefined') {
41
+ // If crypto.getRandomValues is available try to use it.
42
+ uuid = new Uint8Array(16);
43
+ window.crypto.getRandomValues(uuid);
44
+ }
45
+
46
+ // Fall back to Math.random if a higher quality random number generator is not available.
47
+ if (!uuid) {
48
+ uuid = new Array(16);
49
+ var d = new Date().getTime();
50
+ for (var i = 0; i < 16; i++) {
51
+ var r = (d + Math.random()*256)%256 | 0;
52
+ d = Math.floor(d/256);
53
+ uuid[i] = r;
54
+ }
55
+ }
56
+
57
+ uuid[6] = (uuid[6] & 0x0F) | 0x40;
58
+ uuid[8] = (uuid[8] & 0x7F) | 0x80;
59
+ writeArrayToMemory(uuid, out);
60
+ },
61
+
62
+ // Compares the value of the supplied 'compact' UUID variable uu to the NULL value.
63
+ // If the value is equal to the NULL UUID, 1 is returned, otherwise 0 is returned.
64
+ uuid_is_null: function(uu) {
65
+ // int uuid_is_null(const uuid_t uu);
66
+ for (var i = 0; i < 4; i++, uu = (uu+4)|0) {
67
+ var val = {{{ makeGetValue('uu', 0, 'i32') }}};
68
+ if (val) {
69
+ return 0;
70
+ }
71
+ }
72
+ return 1;
73
+ },
74
+
75
+ // converts the UUID string given by inp into the binary representation. The input UUID is a string of
76
+ // the form "%08x-%04x-%04x-%04x-%012x" 36 bytes plus the trailing '\0'.
77
+ // Upon successfully parsing the input string, 0 is returned, and the UUID is stored in the location
78
+ // pointed to by uu, otherwise -1 is returned.
79
+ uuid_parse: function(inp, uu) {
80
+ // int uuid_parse(const char *in, uuid_t uu);
81
+ var inp = Pointer_stringify(inp);
82
+ if (inp.length === 36) {
83
+ var i = 0;
84
+ var uuid = new Array(16);
85
+ inp.toLowerCase().replace(/[0-9a-f]{2}/g, function(byte) {
86
+ if (i < 16) {
87
+ uuid[i++] = parseInt(byte, 16);
88
+ }
89
+ });
90
+
91
+ if (i < 16) {
92
+ return -1;
93
+ } else {
94
+ writeArrayToMemory(uuid, uu);
95
+ return 0;
96
+ }
97
+ } else {
98
+ return -1;
99
+ }
100
+ },
101
+
102
+ // Convert a 'compact' form UUID to a string, if the upper parameter is supplied make the string upper case.
103
+ uuid_unparse: function(uu, out, upper) {
104
+ // void uuid_unparse(const uuid_t uu, char *out);
105
+ var i = 0;
106
+ var uuid = 'xxxx-xx-xx-xx-xxxxxx'.replace(/[x]/g, function(c) {
107
+ var r = upper ? ({{{ makeGetValue('uu', 'i', 'i8', 0, 1) }}}).toString(16).toUpperCase() :
108
+ ({{{ makeGetValue('uu', 'i', 'i8', 0, 1) }}}).toString(16);
109
+ r = (r.length === 1) ? '0' + r : r; // Zero pad single digit hex values
110
+ i++;
111
+ return r;
112
+ });
113
+ writeStringToMemory(uuid, out);
114
+ },
115
+
116
+ // Convert a 'compact' form UUID to a lower case string.
117
+ uuid_unparse_lower__deps: ['uuid_unparse'],
118
+ uuid_unparse_lower: function(uu, out) {
119
+ // void uuid_unparse_lower(const uuid_t uu, char *out);
120
+ _uuid_unparse(uu, out);
121
+ },
122
+
123
+ // Convert a 'compact' form UUID to an upper case string.
124
+ uuid_unparse_upper__deps: ['uuid_unparse'],
125
+ uuid_unparse_upper: function(uu, out) {
126
+ // void uuid_unparse_upper(const uuid_t uu, char *out);
127
+ _uuid_unparse(uu, out, true);
128
+ },
129
+
130
+ uuid_type: function(uu) {
131
+ // int uuid_type(const uuid_t uu);
132
+ return {{{ cDefine('UUID_TYPE_DCE_RANDOM') }}};
133
+ },
134
+
135
+ uuid_variant: function(uu) {
136
+ // int uuid_variant(const uuid_t uu);
137
+ return {{{ cDefine('UUID_VARIANT_DCE') }}};
138
+ }
139
+ });
140
+
@@ -424,7 +424,7 @@ var LibraryManager = {
424
424
  load: function() {
425
425
  if (this.library) return;
426
426
 
427
- var libraries = ['library.js', 'library_path.js', 'library_fs.js', 'library_idbfs.js', 'library_memfs.js', 'library_nodefs.js', 'library_sockfs.js', 'library_tty.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js'].concat(additionalLibraries);
427
+ var libraries = ['library.js', 'library_path.js', 'library_fs.js', 'library_idbfs.js', 'library_memfs.js', 'library_nodefs.js', 'library_sockfs.js', 'library_tty.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js', 'library_uuid.js'].concat(additionalLibraries);
428
428
  for (var i = 0; i < libraries.length; i++) {
429
429
  eval(processMacros(preprocess(read(libraries[i]))));
430
430
  }
@@ -16,6 +16,7 @@ function processMacros(text) {
16
16
 
17
17
  // Simple #if/else/endif preprocessing for a file. Checks if the
18
18
  // ident checked is true in our global.
19
+ // Also handles #include x.js (similar to C #include <file>)
19
20
  function preprocess(text) {
20
21
  var lines = text.split('\n');
21
22
  var ret = '';
@@ -30,25 +31,30 @@ function preprocess(text) {
30
31
  ret += line + '\n';
31
32
  }
32
33
  } else {
33
- if (line[1] && line[1] == 'i') { // if
34
- var parts = line.split(' ');
35
- var ident = parts[1];
36
- var op = parts[2];
37
- var value = parts[3];
38
- if (op) {
39
- if (op === '==') {
40
- showStack.push(ident in this && this[ident] == value);
41
- } else if (op === '!=') {
42
- showStack.push(!(ident in this && this[ident] == value));
34
+ if (line[1] == 'i') {
35
+ if (line[2] == 'f') { // if
36
+ var parts = line.split(' ');
37
+ var ident = parts[1];
38
+ var op = parts[2];
39
+ var value = parts[3];
40
+ if (op) {
41
+ if (op === '==') {
42
+ showStack.push(ident in this && this[ident] == value);
43
+ } else if (op === '!=') {
44
+ showStack.push(!(ident in this && this[ident] == value));
45
+ } else {
46
+ error('unsupported preprecessor op ' + op);
47
+ }
43
48
  } else {
44
- error('unsupported preprecessor op ' + op);
49
+ showStack.push(ident in this && this[ident] > 0);
45
50
  }
46
- } else {
47
- showStack.push(ident in this && this[ident] > 0);
51
+ } else if (line[2] == 'n') { // include
52
+ var included = read(line.substr(line.indexOf(' ')+1));
53
+ ret += '\n' + preprocess(included) + '\n'
48
54
  }
49
- } else if (line[2] && line[2] == 'l') { // else
55
+ } else if (line[2] == 'l') { // else
50
56
  showStack.push(!showStack.pop());
51
- } else if (line[2] && line[2] == 'n') { // endif
57
+ } else if (line[2] == 'n') { // endif
52
58
  showStack.pop();
53
59
  } else {
54
60
  throw "Unclear preprocessor command: " + line;
@@ -457,7 +463,7 @@ function parseParamTokens(params) {
457
463
  // handle 'byval' and 'byval align X'. We store the alignment in 'byVal'
458
464
  byVal = QUANTUM_SIZE;
459
465
  segment.splice(1, 1);
460
- if (segment[1] && segment[1].text === 'nocapture') {
466
+ if (segment[1] && (segment[1].text === 'nocapture' || segment[1].text === 'readonly')) {
461
467
  segment.splice(1, 1);
462
468
  }
463
469
  if (segment[1] && segment[1].text === 'align') {
@@ -466,7 +472,7 @@ function parseParamTokens(params) {
466
472
  segment.splice(1, 2);
467
473
  }
468
474
  }
469
- if (segment[1] && segment[1].text === 'nocapture') {
475
+ if (segment[1] && (segment[1].text === 'nocapture' || segment[1].text === 'readonly')) {
470
476
  segment.splice(1, 1);
471
477
  }
472
478
  if (segment.length == 1) {
@@ -622,7 +628,7 @@ function parseLLVMSegment(segment) {
622
628
  }
623
629
 
624
630
  function cleanSegment(segment) {
625
- while (segment.length >= 2 && ['noalias', 'sret', 'nocapture', 'nest', 'zeroext', 'signext'].indexOf(segment[1].text) != -1) {
631
+ while (segment.length >= 2 && ['noalias', 'sret', 'nocapture', 'nest', 'zeroext', 'signext', 'readnone'].indexOf(segment[1].text) != -1) {
626
632
  segment.splice(1, 1);
627
633
  }
628
634
  return segment;
@@ -1634,7 +1640,10 @@ function getFastValue(a, op, b, type) {
1634
1640
  }
1635
1641
 
1636
1642
  function getFastValues(list, op, type) {
1637
- assert(op == '+');
1643
+ assert(op === '+' && type === 'i32');
1644
+ for (var i = 0; i < list.length; i++) {
1645
+ if (isNumber(list[i])) list[i] = (list[i]|0) + '';
1646
+ }
1638
1647
  var changed = true;
1639
1648
  while (changed) {
1640
1649
  changed = false;
@@ -1642,6 +1651,7 @@ function getFastValues(list, op, type) {
1642
1651
  var fast = getFastValue(list[i], op, list[i+1], type);
1643
1652
  var raw = list[i] + op + list[i+1];
1644
1653
  if (fast.length < raw.length || fast.indexOf(op) < 0) {
1654
+ if (isNumber(fast)) fast = (fast|0) + '';
1645
1655
  list[i] = fast;
1646
1656
  list.splice(i+1, 1);
1647
1657
  i--;
@@ -117,16 +117,15 @@ function run(args) {
117
117
 
118
118
  preRun();
119
119
 
120
- if (runDependencies > 0) {
121
- // a preRun added a dependency, run will be called later
122
- return;
123
- }
120
+ if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
121
+ if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame
124
122
 
125
123
  function doRun() {
126
124
  ensureInitRuntime();
127
125
 
128
126
  preMain();
129
127
 
128
+ assert(!Module['calledRun']);
130
129
  Module['calledRun'] = true;
131
130
  if (Module['_main'] && shouldRunNow) {
132
131
  Module['callMain'](args);
@@ -866,6 +866,21 @@ var TOTAL_STACK = Module['TOTAL_STACK'] || {{{ TOTAL_STACK }}};
866
866
  var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || {{{ TOTAL_MEMORY }}};
867
867
  var FAST_MEMORY = Module['FAST_MEMORY'] || {{{ FAST_MEMORY }}};
868
868
 
869
+ #if ASM_JS
870
+ var totalMemory = 4096;
871
+ while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
872
+ if (totalMemory < 16*1024*1024) {
873
+ totalMemory *= 2;
874
+ } else {
875
+ totalMemory += 16*1024*1024
876
+ }
877
+ }
878
+ if (totalMemory !== TOTAL_MEMORY) {
879
+ Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');
880
+ TOTAL_MEMORY = totalMemory;
881
+ }
882
+ #endif
883
+
869
884
  // Initialize the runtime's memory
870
885
  #if USE_TYPED_ARRAYS
871
886
  // check for full engine support (use string 'subarray' to avoid closure compiler confusion)
@@ -1075,7 +1090,8 @@ Module['writeAsciiToMemory'] = writeAsciiToMemory;
1075
1090
  {{{ reSign }}}
1076
1091
 
1077
1092
  #if PRECISE_I32_MUL
1078
- if (!Math['imul']) Math['imul'] = function imul(a, b) {
1093
+ // check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
1094
+ if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
1079
1095
  var ah = a >>> 16;
1080
1096
  var al = a & 0xffff;
1081
1097
  var bh = b >>> 16;
@@ -308,7 +308,7 @@ void MultipleShape::Render(bool InLoop) {
308
308
  }
309
309
  RenderLoopPostfix();
310
310
  if (Next) Next->Render(InLoop);
311
- };
311
+ }
312
312
 
313
313
  // LoopShape
314
314
 
@@ -323,7 +323,7 @@ void LoopShape::Render(bool InLoop) {
323
323
  Indenter::Unindent();
324
324
  PrintIndented("}\n");
325
325
  if (Next) Next->Render(InLoop);
326
- };
326
+ }
327
327
 
328
328
  // EmulatedShape
329
329
 
@@ -350,7 +350,7 @@ void EmulatedShape::Render(bool InLoop) {
350
350
  Indenter::Unindent();
351
351
  PrintIndented("}\n");
352
352
  if (Next) Next->Render(InLoop);
353
- };
353
+ }
354
354
 
355
355
  // Relooper
356
356
 
@@ -358,8 +358,8 @@ Relooper::Relooper() : Root(NULL), Emulate(false), BlockIdCounter(1), ShapeIdCou
358
358
  }
359
359
 
360
360
  Relooper::~Relooper() {
361
- for (int i = 0; i < Blocks.size(); i++) delete Blocks[i];
362
- for (int i = 0; i < Shapes.size(); i++) delete Shapes[i];
361
+ for (unsigned i = 0; i < Blocks.size(); i++) delete Blocks[i];
362
+ for (unsigned i = 0; i < Shapes.size(); i++) delete Shapes[i];
363
363
  }
364
364
 
365
365
  void Relooper::AddBlock(Block *New) {
@@ -399,7 +399,7 @@ void Relooper::Calculate(Block *Entry) {
399
399
  // RAII cleanup. Without splitting, we will be forced to introduce labelled loops to allow
400
400
  // reaching the final block
401
401
  void SplitDeadEnds() {
402
- int TotalCodeSize = 0;
402
+ unsigned TotalCodeSize = 0;
403
403
  for (BlockSet::iterator iter = Live.begin(); iter != Live.end(); iter++) {
404
404
  Block *Curr = *iter;
405
405
  TotalCodeSize += strlen(Curr->Code);
@@ -417,7 +417,7 @@ void Relooper::Calculate(Block *Entry) {
417
417
  for (BlockSet::iterator iter = Original->BranchesIn.begin(); iter != Original->BranchesIn.end(); iter++) {
418
418
  Block *Prior = *iter;
419
419
  Block *Split = new Block(Original->Code, Original->BranchVar);
420
- Parent->Blocks.push_back(Split);
420
+ Parent->AddBlock(Split);
421
421
  PrintDebug(" to %d\n", Split->Id);
422
422
  Split->BranchesIn.insert(Prior);
423
423
  Branch *Details = Prior->BranchesOut[Original];
@@ -451,7 +451,7 @@ void Relooper::Calculate(Block *Entry) {
451
451
  Pre.FindLive(Entry);
452
452
 
453
453
  // Add incoming branches from live blocks, ignoring dead code
454
- for (int i = 0; i < Blocks.size(); i++) {
454
+ for (unsigned i = 0; i < Blocks.size(); i++) {
455
455
  Block *Curr = Blocks[i];
456
456
  if (!contains(Pre.Live, Curr)) continue;
457
457
  for (BlockBranchMap::iterator iter = Curr->BranchesOut.begin(); iter != Curr->BranchesOut.end(); iter++) {
@@ -89,11 +89,11 @@ struct Block {
89
89
  // setjmp returns, etc.)
90
90
  //
91
91
 
92
- class SimpleShape;
93
- class LabeledShape;
94
- class MultipleShape;
95
- class LoopShape;
96
- class EmulatedShape;
92
+ struct SimpleShape;
93
+ struct LabeledShape;
94
+ struct MultipleShape;
95
+ struct LoopShape;
96
+ struct EmulatedShape;
97
97
 
98
98
  struct Shape {
99
99
  int Id; // A unique identifier. Used to identify loops, labels are Lx where x is the Id. Defined when added to relooper
@@ -91,7 +91,7 @@
91
91
  }
92
92
  default: {
93
93
  var $x_1 = $x_0;
94
- label = -1;
94
+ label = 8;
95
95
  break L1;
96
96
  }
97
97
  }
@@ -106,7 +106,7 @@
106
106
  }
107
107
  }
108
108
  }
109
- if (label == -1) {
109
+ if (label == 8) {
110
110
  // code 7
111
111
  }
112
112
  // code 4