webruby 0.1.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (518) hide show
  1. checksums.yaml +4 -4
  2. data/driver/driver.c +12 -0
  3. data/lib/webruby/config.rb +3 -3
  4. data/lib/webruby/environment.rb +1 -0
  5. data/lib/webruby/rake/files.rake +22 -22
  6. data/lib/webruby/rake/general.rake +0 -1
  7. data/lib/webruby/utility.rb +2 -0
  8. data/modules/emscripten/AUTHORS +12 -1
  9. data/modules/emscripten/cmake/Platform/Emscripten.cmake +152 -15
  10. data/modules/emscripten/em++ +2 -0
  11. data/modules/emscripten/em++.bat +1 -1
  12. data/modules/emscripten/em-config.bat +1 -1
  13. data/modules/emscripten/emar.bat +1 -1
  14. data/modules/emscripten/emcc +233 -95
  15. data/modules/emscripten/emcc.bat +1 -1
  16. data/modules/emscripten/emconfigure.bat +1 -1
  17. data/modules/emscripten/emmake.bat +1 -1
  18. data/modules/emscripten/emranlib.bat +1 -1
  19. data/modules/emscripten/emscripten.py +221 -217
  20. data/modules/emscripten/package.json +7 -0
  21. data/modules/emscripten/src/analyzer.js +1437 -1385
  22. data/modules/emscripten/src/compiler.js +30 -6
  23. data/modules/emscripten/src/compiler_phase.html +33 -0
  24. data/modules/emscripten/src/fastLong.js +6 -6
  25. data/modules/emscripten/src/headless.js +47 -656
  26. data/modules/emscripten/src/headlessCanvas.js +618 -0
  27. data/modules/emscripten/src/intertyper.js +1038 -899
  28. data/modules/emscripten/src/jsifier.js +818 -714
  29. data/modules/emscripten/src/library.js +1794 -2968
  30. data/modules/emscripten/src/library_browser.js +81 -16
  31. data/modules/emscripten/src/library_egl.js +9 -3
  32. data/modules/emscripten/src/library_fs.js +1585 -0
  33. data/modules/emscripten/src/library_gl.js +445 -202
  34. data/modules/emscripten/src/library_glfw.js +4 -1
  35. data/modules/emscripten/src/library_glut.js +61 -13
  36. data/modules/emscripten/src/library_idbfs.js +216 -0
  37. data/modules/emscripten/src/library_memfs.js +279 -0
  38. data/modules/emscripten/src/library_nodefs.js +234 -0
  39. data/modules/emscripten/src/library_openal.js +131 -150
  40. data/modules/emscripten/src/library_path.js +3 -0
  41. data/modules/emscripten/src/library_sdl.js +499 -229
  42. data/modules/emscripten/src/library_sockfs.js +576 -0
  43. data/modules/emscripten/src/library_tty.js +146 -0
  44. data/modules/emscripten/src/modules.js +30 -35
  45. data/modules/emscripten/src/parseTools.js +356 -161
  46. data/modules/emscripten/src/postamble.js +76 -31
  47. data/modules/emscripten/src/preamble.js +271 -41
  48. data/modules/emscripten/src/proxyClient.js +82 -0
  49. data/modules/emscripten/src/proxyWorker.js +143 -0
  50. data/modules/emscripten/src/relooper/Relooper.cpp +60 -24
  51. data/modules/emscripten/src/relooper/Relooper.h +3 -2
  52. data/modules/emscripten/src/relooper/emscripten/glue.js +20 -10
  53. data/modules/emscripten/src/relooper/fuzzer.py +19 -10
  54. data/modules/emscripten/src/relooper/test.cpp +50 -50
  55. data/modules/emscripten/src/relooper/test.txt +147 -30
  56. data/modules/emscripten/src/relooper/test2.c +13 -13
  57. data/modules/emscripten/src/relooper/test2.txt +17 -3
  58. data/modules/emscripten/src/relooper/test3.c +7 -7
  59. data/modules/emscripten/src/relooper/test3.txt +36 -7
  60. data/modules/emscripten/src/relooper/test4.cpp +7 -7
  61. data/modules/emscripten/src/relooper/test4.txt +28 -7
  62. data/modules/emscripten/src/relooper/test5.cpp +6 -6
  63. data/modules/emscripten/src/relooper/test5.txt +34 -10
  64. data/modules/emscripten/src/relooper/test6.cpp +4 -4
  65. data/modules/emscripten/src/relooper/test6.txt +17 -3
  66. data/modules/emscripten/src/relooper/test_dead.cpp +2 -2
  67. data/modules/emscripten/src/relooper/test_debug.cpp +4 -4
  68. data/modules/emscripten/src/relooper/test_debug.txt +17 -3
  69. data/modules/emscripten/src/relooper/test_fuzz1.cpp +9 -9
  70. data/modules/emscripten/src/relooper/test_fuzz1.txt +45 -5
  71. data/modules/emscripten/src/relooper/test_fuzz2.cpp +4 -4
  72. data/modules/emscripten/src/relooper/test_fuzz2.txt +18 -1
  73. data/modules/emscripten/src/relooper/test_fuzz3.cpp +5 -5
  74. data/modules/emscripten/src/relooper/test_fuzz3.txt +16 -0
  75. data/modules/emscripten/src/relooper/test_fuzz4.cpp +5 -5
  76. data/modules/emscripten/src/relooper/test_fuzz4.txt +25 -3
  77. data/modules/emscripten/src/relooper/test_fuzz5.cpp +10 -10
  78. data/modules/emscripten/src/relooper/test_fuzz5.txt +49 -15
  79. data/modules/emscripten/src/relooper/test_fuzz6.cpp +92 -92
  80. data/modules/emscripten/src/relooper/test_fuzz6.txt +201 -18
  81. data/modules/emscripten/src/relooper/test_inf.cpp +184 -184
  82. data/modules/emscripten/src/relooper/test_inf.txt +1078 -332
  83. data/modules/emscripten/src/runtime.js +69 -45
  84. data/modules/emscripten/src/settings.js +48 -919
  85. data/modules/emscripten/src/shell.html +1 -1
  86. data/modules/emscripten/src/shell.js +14 -8
  87. data/modules/emscripten/src/shell_sharedlib.js +18 -1
  88. data/modules/emscripten/src/simd.js +958 -0
  89. data/modules/emscripten/src/struct_info.json +1045 -0
  90. data/modules/emscripten/src/utility.js +11 -0
  91. data/modules/emscripten/system/bin/sdl-config +13 -0
  92. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  93. data/modules/emscripten/system/include/compat/malloc.h +48 -0
  94. data/modules/emscripten/system/include/compat/math.h +14 -0
  95. data/modules/emscripten/system/include/compat/netdb.h +22 -0
  96. data/modules/emscripten/system/include/compat/stdarg.h +16 -0
  97. data/modules/emscripten/system/include/compat/stdlib.h +16 -0
  98. data/modules/emscripten/system/include/compat/string.h +17 -0
  99. data/modules/emscripten/system/include/compat/sys/socketvar.h +14 -0
  100. data/modules/emscripten/system/include/compat/sys/stat.h +20 -0
  101. data/modules/emscripten/system/include/{libc → compat}/sys/timeb.h +3 -7
  102. data/modules/emscripten/system/include/compat/time.h +18 -0
  103. data/modules/emscripten/system/include/compat/unistd.h +16 -0
  104. data/modules/emscripten/system/include/compat/xlocale.h +19 -0
  105. data/modules/emscripten/system/include/emscripten/emscripten.h +48 -7
  106. data/modules/emscripten/system/include/emscripten/vector.h +6 -0
  107. data/modules/emscripten/system/include/libc/aio.h +69 -0
  108. data/modules/emscripten/system/include/libc/alloca.h +13 -13
  109. data/modules/emscripten/system/include/libc/ar.h +19 -63
  110. data/modules/emscripten/system/include/libc/arpa/ftp.h +35 -0
  111. data/modules/emscripten/system/include/libc/arpa/inet.h +36 -0
  112. data/modules/emscripten/system/include/libc/arpa/nameser.h +467 -0
  113. data/modules/emscripten/system/include/libc/arpa/nameser_compat.h +2 -0
  114. data/modules/emscripten/system/include/libc/arpa/telnet.h +251 -0
  115. data/modules/emscripten/system/include/libc/arpa/tftp.h +31 -0
  116. data/modules/emscripten/system/include/libc/assert.h +9 -36
  117. data/modules/emscripten/system/include/libc/bits/alltypes.h +397 -0
  118. data/modules/emscripten/system/include/libc/bits/endian.h +1 -0
  119. data/modules/emscripten/system/include/libc/bits/errno.h +134 -0
  120. data/modules/emscripten/system/include/libc/bits/fcntl.h +38 -0
  121. data/modules/emscripten/system/include/libc/bits/fenv.h +34 -0
  122. data/modules/emscripten/system/include/libc/bits/float.h +17 -0
  123. data/modules/emscripten/system/include/libc/bits/io.h +0 -0
  124. data/modules/emscripten/system/include/libc/bits/ioctl.h +197 -0
  125. data/modules/emscripten/system/include/libc/bits/ipc.h +14 -0
  126. data/modules/emscripten/system/include/libc/bits/limits.h +8 -0
  127. data/modules/emscripten/system/include/libc/bits/mman.h +62 -0
  128. data/modules/emscripten/system/include/libc/bits/msg.h +16 -0
  129. data/modules/emscripten/system/include/libc/bits/posix.h +2 -0
  130. data/modules/emscripten/system/include/libc/bits/reg.h +19 -0
  131. data/modules/emscripten/system/include/libc/bits/setjmp.h +1 -0
  132. data/modules/emscripten/system/include/libc/bits/shm.h +18 -0
  133. data/modules/emscripten/system/include/libc/bits/signal.h +112 -0
  134. data/modules/emscripten/system/include/libc/bits/socket.h +17 -0
  135. data/modules/emscripten/system/include/libc/bits/stat.h +22 -0
  136. data/modules/emscripten/system/include/libc/bits/statfs.h +7 -0
  137. data/modules/emscripten/system/include/libc/bits/stdarg.h +4 -0
  138. data/modules/emscripten/system/include/libc/bits/stdint.h +20 -0
  139. data/modules/emscripten/system/include/libc/bits/syscall.h +696 -0
  140. data/modules/emscripten/system/include/libc/bits/termios.h +160 -0
  141. data/modules/emscripten/system/include/libc/bits/user.h +48 -0
  142. data/modules/emscripten/system/include/libc/byteswap.h +26 -0
  143. data/modules/emscripten/system/include/libc/complex.h +55 -54
  144. data/modules/emscripten/system/include/libc/cpio.h +29 -0
  145. data/modules/emscripten/system/include/libc/crypt.h +20 -0
  146. data/modules/emscripten/system/include/libc/ctype.h +58 -187
  147. data/modules/emscripten/system/include/libc/dirent.h +69 -6
  148. data/modules/emscripten/system/include/libc/dlfcn.h +42 -0
  149. data/modules/emscripten/system/include/libc/elf.h +2555 -0
  150. data/modules/emscripten/system/include/libc/endian.h +80 -1
  151. data/modules/emscripten/system/include/libc/err.h +25 -0
  152. data/modules/emscripten/system/include/libc/errno.h +23 -7
  153. data/modules/emscripten/system/include/libc/fcntl.h +175 -1
  154. data/modules/emscripten/system/include/libc/features.h +32 -0
  155. data/modules/emscripten/system/include/libc/fenv.h +28 -0
  156. data/modules/emscripten/system/include/libc/float.h +34 -0
  157. data/modules/emscripten/system/include/libc/fnmatch.h +24 -50
  158. data/modules/emscripten/system/include/libc/ftw.h +42 -0
  159. data/modules/emscripten/system/include/libc/getopt.h +22 -187
  160. data/modules/emscripten/system/include/libc/glob.h +42 -83
  161. data/modules/emscripten/system/include/libc/grp.h +37 -79
  162. data/modules/emscripten/system/include/libc/iconv.h +18 -56
  163. data/modules/emscripten/system/include/libc/ifaddrs.h +24 -53
  164. data/modules/emscripten/system/include/libc/inttypes.h +208 -271
  165. data/modules/emscripten/system/include/libc/iso646.h +5 -28
  166. data/modules/emscripten/system/include/libc/langinfo.h +88 -316
  167. data/modules/emscripten/system/include/libc/lastlog.h +1 -0
  168. data/modules/emscripten/system/include/libc/libgen.h +5 -13
  169. data/modules/emscripten/system/include/libc/libintl.h +25 -0
  170. data/modules/emscripten/system/include/libc/limits.h +140 -149
  171. data/modules/emscripten/system/include/libc/link.h +54 -0
  172. data/modules/emscripten/system/include/libc/locale.h +72 -70
  173. data/modules/emscripten/system/include/libc/malloc.h +0 -169
  174. data/modules/emscripten/system/include/libc/math.h +393 -573
  175. data/modules/emscripten/system/include/libc/memory.h +1 -0
  176. data/modules/emscripten/system/include/libc/mntent.h +44 -0
  177. data/modules/emscripten/system/include/libc/monetary.h +23 -0
  178. data/modules/emscripten/system/include/libc/mqueue.h +36 -0
  179. data/modules/emscripten/system/include/libc/net/ethernet.h +55 -0
  180. data/modules/emscripten/system/include/libc/net/if.h +135 -0
  181. data/modules/emscripten/system/include/libc/net/if_arp.h +133 -0
  182. data/modules/emscripten/system/include/libc/net/route.h +124 -0
  183. data/modules/emscripten/system/include/libc/netdb.h +161 -0
  184. data/modules/emscripten/system/include/libc/netinet/ether.h +14 -0
  185. data/modules/emscripten/system/include/libc/netinet/icmp6.h +305 -0
  186. data/modules/emscripten/system/include/libc/netinet/if_ether.h +126 -0
  187. data/modules/emscripten/system/include/libc/netinet/in.h +336 -0
  188. data/modules/emscripten/system/include/libc/netinet/in_systm.h +9 -0
  189. data/modules/emscripten/system/include/libc/netinet/ip.h +186 -0
  190. data/modules/emscripten/system/include/libc/netinet/ip6.h +142 -0
  191. data/modules/emscripten/system/include/libc/netinet/ip_icmp.h +192 -0
  192. data/modules/emscripten/system/include/libc/netinet/tcp.h +71 -0
  193. data/modules/emscripten/system/include/libc/netinet/udp.h +35 -0
  194. data/modules/emscripten/system/include/libc/netpacket/packet.h +44 -0
  195. data/modules/emscripten/system/include/libc/nl_types.h +22 -0
  196. data/modules/emscripten/system/include/libc/paths.h +30 -5
  197. data/modules/emscripten/system/include/libc/poll.h +46 -0
  198. data/modules/emscripten/system/include/libc/pthread.h +191 -331
  199. data/modules/emscripten/system/include/libc/pty.h +18 -0
  200. data/modules/emscripten/system/include/libc/pwd.h +33 -62
  201. data/modules/emscripten/system/include/libc/readme.txt +2 -2
  202. data/modules/emscripten/system/include/libc/regex.h +53 -93
  203. data/modules/emscripten/system/include/libc/resolv.h +144 -0
  204. data/modules/emscripten/system/include/libc/sched.h +124 -89
  205. data/modules/emscripten/system/include/libc/search.h +40 -48
  206. data/modules/emscripten/system/include/libc/semaphore.h +35 -0
  207. data/modules/emscripten/system/include/libc/setjmp.h +35 -13
  208. data/modules/emscripten/system/include/libc/shadow.h +44 -0
  209. data/modules/emscripten/system/include/libc/signal.h +245 -20
  210. data/modules/emscripten/system/include/libc/spawn.h +74 -0
  211. data/modules/emscripten/system/include/libc/stdalign.h +15 -0
  212. data/modules/emscripten/system/include/libc/stdarg.h +18 -43
  213. data/modules/emscripten/system/include/libc/stdbool.h +14 -0
  214. data/modules/emscripten/system/include/libc/stddef.h +12 -58
  215. data/modules/emscripten/system/include/libc/stdint.h +82 -458
  216. data/modules/emscripten/system/include/libc/stdio.h +184 -679
  217. data/modules/emscripten/system/include/libc/stdio_ext.h +34 -0
  218. data/modules/emscripten/system/include/libc/stdlib.h +146 -205
  219. data/modules/emscripten/system/include/libc/stdnoreturn.h +5 -0
  220. data/modules/emscripten/system/include/libc/string.h +86 -89
  221. data/modules/emscripten/system/include/libc/strings.h +27 -27
  222. data/modules/emscripten/system/include/libc/stropts.h +139 -0
  223. data/modules/emscripten/system/include/libc/sys/acct.h +75 -0
  224. data/modules/emscripten/system/include/libc/sys/cachectl.h +22 -0
  225. data/modules/emscripten/system/include/libc/sys/dir.h +0 -8
  226. data/modules/emscripten/system/include/libc/sys/epoll.h +67 -0
  227. data/modules/emscripten/system/include/libc/sys/errno.h +2 -190
  228. data/modules/emscripten/system/include/libc/sys/eventfd.h +26 -0
  229. data/modules/emscripten/system/include/libc/sys/fcntl.h +2 -4
  230. data/modules/emscripten/system/include/libc/sys/file.h +20 -1
  231. data/modules/emscripten/system/include/libc/sys/fsuid.h +20 -0
  232. data/modules/emscripten/system/include/libc/sys/inotify.h +57 -0
  233. data/modules/emscripten/system/include/libc/sys/io.h +17 -0
  234. data/modules/emscripten/system/include/libc/sys/ioctl.h +14 -0
  235. data/modules/emscripten/system/include/libc/sys/ipc.h +42 -0
  236. data/modules/emscripten/system/include/{sys/sysctl.h → libc/sys/klog.h} +4 -4
  237. data/modules/emscripten/system/include/libc/sys/mman.h +55 -0
  238. data/modules/emscripten/system/include/libc/sys/mount.h +72 -0
  239. data/modules/emscripten/system/include/libc/sys/msg.h +52 -0
  240. data/modules/emscripten/system/include/libc/sys/mtio.h +188 -0
  241. data/modules/emscripten/system/include/libc/sys/param.h +29 -19
  242. data/modules/emscripten/system/include/libc/sys/personality.h +46 -0
  243. data/modules/emscripten/system/include/libc/sys/poll.h +2 -0
  244. data/modules/emscripten/system/include/libc/sys/prctl.h +101 -0
  245. data/modules/emscripten/system/include/libc/sys/procfs.h +65 -0
  246. data/modules/emscripten/system/include/libc/sys/ptrace.h +96 -0
  247. data/modules/emscripten/system/include/libc/sys/reboot.h +20 -0
  248. data/modules/emscripten/system/include/libc/sys/reg.h +9 -0
  249. data/modules/emscripten/system/include/libc/sys/resource.h +89 -45
  250. data/modules/emscripten/system/include/libc/sys/select.h +42 -0
  251. data/modules/emscripten/system/include/libc/sys/sem.h +82 -0
  252. data/modules/emscripten/system/include/libc/sys/sendfile.h +22 -0
  253. data/modules/emscripten/system/include/libc/sys/shm.h +61 -0
  254. data/modules/emscripten/system/include/libc/sys/signal.h +1 -315
  255. data/modules/emscripten/system/include/libc/sys/signalfd.h +44 -0
  256. data/modules/emscripten/system/include/libc/sys/socket.h +299 -0
  257. data/modules/emscripten/system/include/libc/sys/stat.h +95 -204
  258. data/modules/emscripten/system/include/libc/sys/statfs.h +32 -0
  259. data/modules/emscripten/system/include/libc/sys/statvfs.h +57 -0
  260. data/modules/emscripten/system/include/libc/sys/stropts.h +1 -0
  261. data/modules/emscripten/system/include/libc/sys/swap.h +21 -0
  262. data/modules/emscripten/system/include/libc/sys/syscall.h +6 -0
  263. data/modules/emscripten/system/include/libc/sys/sysctl.h +17 -0
  264. data/modules/emscripten/system/include/libc/sys/sysinfo.h +36 -0
  265. data/modules/emscripten/system/include/libc/sys/syslog.h +1 -0
  266. data/modules/emscripten/system/include/libc/sys/sysmacros.h +15 -0
  267. data/modules/emscripten/system/include/libc/sys/termios.h +2 -280
  268. data/modules/emscripten/system/include/libc/sys/time.h +40 -68
  269. data/modules/emscripten/system/include/libc/sys/timerfd.h +24 -0
  270. data/modules/emscripten/system/include/libc/sys/times.h +14 -16
  271. data/modules/emscripten/system/include/libc/sys/timex.h +98 -0
  272. data/modules/emscripten/system/include/libc/sys/ttydefaults.h +34 -92
  273. data/modules/emscripten/system/include/libc/sys/types.h +87 -481
  274. data/modules/emscripten/system/include/libc/sys/ucontext.h +1 -0
  275. data/modules/emscripten/system/include/libc/sys/uio.h +48 -0
  276. data/modules/emscripten/system/include/libc/sys/un.h +32 -0
  277. data/modules/emscripten/system/include/libc/sys/user.h +16 -0
  278. data/modules/emscripten/system/include/libc/sys/utsname.h +30 -0
  279. data/modules/emscripten/system/include/libc/sys/vfs.h +1 -0
  280. data/modules/emscripten/system/include/libc/sys/wait.h +41 -26
  281. data/modules/emscripten/system/include/libc/sys/xattr.h +30 -0
  282. data/modules/emscripten/system/include/libc/syscall.h +1 -0
  283. data/modules/emscripten/system/include/libc/sysexits.h +21 -0
  284. data/modules/emscripten/system/include/libc/syslog.h +104 -0
  285. data/modules/emscripten/system/include/libc/tar.h +27 -33
  286. data/modules/emscripten/system/include/libc/termios.h +40 -1
  287. data/modules/emscripten/system/include/libc/tgmath.h +270 -0
  288. data/modules/emscripten/system/include/libc/time.h +96 -237
  289. data/modules/emscripten/system/include/libc/ucontext.h +25 -0
  290. data/modules/emscripten/system/include/libc/ulimit.h +17 -0
  291. data/modules/emscripten/system/include/libc/unistd.h +517 -4
  292. data/modules/emscripten/system/include/libc/utime.h +15 -3
  293. data/modules/emscripten/system/include/libc/utmp.h +40 -1
  294. data/modules/emscripten/system/include/libc/utmpx.h +58 -0
  295. data/modules/emscripten/system/include/libc/values.h +39 -0
  296. data/modules/emscripten/system/include/libc/wchar.h +164 -175
  297. data/modules/emscripten/system/include/libc/wctype.h +67 -37
  298. data/modules/emscripten/system/include/libc/wordexp.h +31 -42
  299. data/modules/emscripten/system/include/libcxx/__locale +6 -6
  300. data/modules/emscripten/system/include/libcxx/locale +1 -1
  301. data/modules/emscripten/system/lib/libc/musl/readme.txt +9 -1
  302. data/modules/emscripten/system/lib/libc/musl/src/internal/locale_impl.h +5 -0
  303. data/modules/emscripten/system/lib/libc/musl/src/internal/stdio_impl.h +92 -0
  304. data/modules/emscripten/system/lib/libc/musl/src/locale/big5.h +1085 -0
  305. data/modules/emscripten/system/lib/libc/musl/src/locale/codepages.h +238 -0
  306. data/modules/emscripten/system/lib/libc/musl/src/locale/gb18030.h +1836 -0
  307. data/modules/emscripten/system/lib/libc/musl/src/locale/hkscs.h +390 -0
  308. data/modules/emscripten/system/lib/libc/musl/src/locale/iconv.c +454 -0
  309. data/modules/emscripten/system/lib/libc/musl/src/locale/iswalnum_l.c +6 -0
  310. data/modules/emscripten/system/lib/libc/musl/src/locale/iswalpha_l.c +6 -0
  311. data/modules/emscripten/system/lib/libc/musl/src/locale/iswblank_l.c +6 -0
  312. data/modules/emscripten/system/lib/libc/musl/src/locale/iswcntrl_l.c +6 -0
  313. data/modules/emscripten/system/lib/libc/musl/src/locale/iswctype_l.c +9 -0
  314. data/modules/emscripten/system/lib/libc/musl/src/locale/iswdigit_l.c +6 -0
  315. data/modules/emscripten/system/lib/libc/musl/src/locale/iswgraph_l.c +6 -0
  316. data/modules/emscripten/system/lib/libc/musl/src/locale/iswlower_l.c +6 -0
  317. data/modules/emscripten/system/lib/libc/musl/src/locale/iswprint_l.c +6 -0
  318. data/modules/emscripten/system/lib/libc/musl/src/locale/iswpunct_l.c +6 -0
  319. data/modules/emscripten/system/lib/libc/musl/src/locale/iswspace_l.c +6 -0
  320. data/modules/emscripten/system/lib/libc/musl/src/locale/iswupper_l.c +6 -0
  321. data/modules/emscripten/system/lib/libc/musl/src/locale/iswxdigit_l.c +6 -0
  322. data/modules/emscripten/system/lib/libc/musl/src/locale/jis0208.h +550 -0
  323. data/modules/emscripten/system/lib/libc/musl/src/locale/ksc.h +640 -0
  324. data/modules/emscripten/system/lib/libc/musl/src/locale/legacychars.h +39 -0
  325. data/modules/emscripten/system/lib/libc/musl/src/locale/strfmon.c +101 -0
  326. data/modules/emscripten/system/lib/libc/musl/src/locale/strxfrm.c +18 -0
  327. data/modules/emscripten/system/lib/libc/musl/src/locale/towctrans_l.c +6 -0
  328. data/modules/emscripten/system/lib/libc/musl/src/locale/towlower_l.c +9 -0
  329. data/modules/emscripten/system/lib/libc/musl/src/locale/towupper_l.c +9 -0
  330. data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll.c +16 -0
  331. data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll_l.c +6 -0
  332. data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm.c +21 -0
  333. data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm_l.c +6 -0
  334. data/modules/emscripten/system/lib/libc/musl/src/locale/wctrans_l.c +6 -0
  335. data/modules/emscripten/system/lib/libc/musl/src/locale/wctype_l.c +9 -0
  336. data/modules/emscripten/system/lib/libc/musl/src/stdio/fwprintf.c +13 -0
  337. data/modules/emscripten/system/lib/libc/musl/src/stdio/swprintf.c +14 -0
  338. data/modules/emscripten/system/lib/libc/musl/src/stdio/vfwprintf.c +361 -0
  339. data/modules/emscripten/system/lib/libc/musl/src/stdio/vswprintf.c +53 -0
  340. data/modules/emscripten/system/lib/libc/musl/src/stdio/vwprintf.c +7 -0
  341. data/modules/emscripten/system/lib/libc/musl/src/stdio/wprintf.c +13 -0
  342. data/modules/emscripten/system/lib/libcextra.symbols +44 -0
  343. data/modules/emscripten/system/lib/libcxx/exception.cpp +3 -3
  344. data/modules/emscripten/system/lib/libcxx/locale.cpp +12 -12
  345. data/modules/emscripten/system/lib/libcxxabi/src/cxa_new_delete.cpp +1 -1
  346. data/modules/emscripten/tools/asm_module.py +2 -0
  347. data/modules/emscripten/tools/autodebugger.py +3 -1
  348. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +0 -4835
  349. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +0 -6495
  350. data/modules/emscripten/tools/file_packager.py +53 -56
  351. data/modules/emscripten/tools/find_bigfuncs.py +2 -2
  352. data/modules/emscripten/tools/find_bigvars.py +24 -0
  353. data/modules/emscripten/tools/gen_struct_info.py +509 -0
  354. data/modules/emscripten/tools/gen_struct_info.pyc +0 -0
  355. data/modules/emscripten/tools/js-optimizer.js +177 -86
  356. data/modules/emscripten/tools/js_optimizer.py +54 -19
  357. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  358. data/modules/emscripten/tools/jsrun.py +17 -7
  359. data/modules/emscripten/tools/jsrun.pyc +0 -0
  360. data/modules/emscripten/tools/response_file.py +2 -2
  361. data/modules/emscripten/tools/response_file.pyc +0 -0
  362. data/modules/emscripten/tools/shared.py +257 -123
  363. data/modules/emscripten/tools/shared.pyc +0 -0
  364. data/modules/emscripten/tools/source-maps/sourcemapper.js +37 -6
  365. data/modules/emscripten/tools/tempfiles.py +1 -0
  366. data/modules/emscripten/tools/tempfiles.pyc +0 -0
  367. data/modules/emscripten/tools/test-js-optimizer-asm-minlast-output.js +2 -0
  368. data/modules/emscripten/tools/test-js-optimizer-asm-minlast.js +8 -0
  369. data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +412 -169
  370. data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +88 -0
  371. data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +311 -265
  372. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +0 -20
  373. data/modules/emscripten/tools/test-js-optimizer-asm-pre.js +0 -21
  374. data/modules/emscripten/tools/test-js-optimizer-asm-regs.js +2 -2
  375. data/modules/emscripten/tools/test-js-optimizer-regs-output.js +8 -8
  376. data/modules/emscripten/tools/test-js-optimizer-regs.js +1 -1
  377. data/modules/emscripten/tools/validate_asmjs.py +82 -0
  378. data/modules/mruby/Rakefile +2 -2
  379. data/modules/mruby/include/mruby/class.h +2 -2
  380. data/modules/mruby/include/mruby/compile.h +12 -4
  381. data/modules/mruby/include/mruby/data.h +8 -3
  382. data/modules/mruby/include/mruby/debug.h +65 -0
  383. data/modules/mruby/include/mruby/dump.h +10 -2
  384. data/modules/mruby/include/mruby/irep.h +1 -0
  385. data/modules/mruby/include/mruby/string.h +2 -1
  386. data/modules/mruby/include/mruby/value.h +20 -13
  387. data/modules/mruby/include/mruby/variable.h +1 -0
  388. data/modules/mruby/include/mruby.h +5 -6
  389. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +6 -4
  390. data/modules/mruby/mrbgems/mruby-math/src/math.c +4 -0
  391. data/modules/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +1 -1
  392. data/modules/mruby/mrbgems/mruby-proc-ext/src/proc.c +1 -1
  393. data/modules/mruby/mrbgems/mruby-random/src/random.c +1 -4
  394. data/modules/mruby/mrbgems/mruby-string-ext/src/string.c +25 -16
  395. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +4 -0
  396. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +1 -1
  397. data/modules/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +51 -0
  398. data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +22 -0
  399. data/modules/mruby/mrbgems/mruby-time/src/time.c +38 -60
  400. data/modules/mruby/mrblib/class.rb +2 -2
  401. data/modules/mruby/src/backtrace.c +96 -23
  402. data/modules/mruby/src/class.c +43 -41
  403. data/modules/mruby/src/codegen.c +52 -46
  404. data/modules/mruby/src/debug.c +214 -0
  405. data/modules/mruby/src/dump.c +245 -17
  406. data/modules/mruby/src/error.c +14 -6
  407. data/modules/mruby/src/etc.c +17 -10
  408. data/modules/mruby/src/gc.c +9 -9
  409. data/modules/mruby/src/kernel.c +1 -1
  410. data/modules/mruby/src/load.c +137 -1
  411. data/modules/mruby/src/object.c +1 -1
  412. data/modules/mruby/src/parse.y +162 -37
  413. data/modules/mruby/src/state.c +2 -0
  414. data/modules/mruby/src/string.c +28 -19
  415. data/modules/mruby/src/symbol.c +0 -1
  416. data/modules/mruby/src/variable.c +12 -15
  417. data/modules/mruby/src/vm.c +38 -22
  418. data/modules/mruby/tasks/mrbgem_spec.rake +6 -4
  419. data/modules/mruby/tasks/mrbgems_test.rake +9 -9
  420. data/modules/mruby/tasks/mruby_build_gem.rake +9 -0
  421. data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
  422. data/modules/mruby/test/driver.c +3 -3
  423. data/modules/mruby/test/t/array.rb +13 -0
  424. data/modules/mruby/test/t/class.rb +28 -0
  425. data/modules/mruby/test/t/exception.rb +10 -0
  426. data/modules/mruby/test/t/literals.rb +50 -0
  427. data/modules/mruby/test/t/module.rb +22 -0
  428. data/modules/mruby/test/t/proc.rb +37 -0
  429. data/modules/mruby/test/t/string.rb +20 -21
  430. data/modules/mruby/tools/mrbc/mrbc.c +2 -4
  431. data/scripts/gen_post.rb +1 -0
  432. data/scripts/gen_require.rb +107 -0
  433. data/templates/minimal/Rakefile +20 -0
  434. metadata +210 -88
  435. data/driver/main.c +0 -40
  436. data/modules/emscripten/cmake/Platform/Emscripten_unix.cmake +0 -24
  437. data/modules/emscripten/emlibtool +0 -11
  438. data/modules/emscripten/emlibtool.bat +0 -2
  439. data/modules/emscripten/src/framework.js +0 -257
  440. data/modules/emscripten/system/include/bsd/float.h +0 -91
  441. data/modules/emscripten/system/include/bsd/readme.txt +0 -2
  442. data/modules/emscripten/system/include/bsd/sys/mman.h +0 -180
  443. data/modules/emscripten/system/include/bsd/sys/utsname.h +0 -70
  444. data/modules/emscripten/system/include/dlfcn.h +0 -31
  445. data/modules/emscripten/system/include/err.h +0 -95
  446. data/modules/emscripten/system/include/features.h +0 -3
  447. data/modules/emscripten/system/include/libc/_ansi.h +0 -135
  448. data/modules/emscripten/system/include/libc/_syslist.h +0 -40
  449. data/modules/emscripten/system/include/libc/argz.h +0 -33
  450. data/modules/emscripten/system/include/libc/envlock.h +0 -15
  451. data/modules/emscripten/system/include/libc/envz.h +0 -16
  452. data/modules/emscripten/system/include/libc/fastmath.h +0 -13
  453. data/modules/emscripten/system/include/libc/ieeefp.h +0 -256
  454. data/modules/emscripten/system/include/libc/machine/_default_types.h +0 -121
  455. data/modules/emscripten/system/include/libc/machine/_types.h +0 -8
  456. data/modules/emscripten/system/include/libc/machine/ansi.h +0 -1
  457. data/modules/emscripten/system/include/libc/machine/endian.h +0 -31
  458. data/modules/emscripten/system/include/libc/machine/fastmath.h +0 -100
  459. data/modules/emscripten/system/include/libc/machine/ieeefp.h +0 -376
  460. data/modules/emscripten/system/include/libc/machine/malloc.h +0 -8
  461. data/modules/emscripten/system/include/libc/machine/param.h +0 -1
  462. data/modules/emscripten/system/include/libc/machine/setjmp-dj.h +0 -43
  463. data/modules/emscripten/system/include/libc/machine/setjmp.h +0 -361
  464. data/modules/emscripten/system/include/libc/machine/stdlib.h +0 -8
  465. data/modules/emscripten/system/include/libc/machine/termios.h +0 -1
  466. data/modules/emscripten/system/include/libc/machine/time.h +0 -19
  467. data/modules/emscripten/system/include/libc/machine/types.h +0 -30
  468. data/modules/emscripten/system/include/libc/newlib.h +0 -2
  469. data/modules/emscripten/system/include/libc/process.h +0 -44
  470. data/modules/emscripten/system/include/libc/reent.h +0 -183
  471. data/modules/emscripten/system/include/libc/regdef.h +0 -7
  472. data/modules/emscripten/system/include/libc/sys/_default_fcntl.h +0 -223
  473. data/modules/emscripten/system/include/libc/sys/_types.h +0 -93
  474. data/modules/emscripten/system/include/libc/sys/cdefs.h +0 -123
  475. data/modules/emscripten/system/include/libc/sys/config.h +0 -255
  476. data/modules/emscripten/system/include/libc/sys/custom_file.h +0 -2
  477. data/modules/emscripten/system/include/libc/sys/dirent.h +0 -58
  478. data/modules/emscripten/system/include/libc/sys/features.h +0 -212
  479. data/modules/emscripten/system/include/libc/sys/iconvnls.h +0 -77
  480. data/modules/emscripten/system/include/libc/sys/lock.h +0 -24
  481. data/modules/emscripten/system/include/libc/sys/queue.h +0 -471
  482. data/modules/emscripten/system/include/libc/sys/reent.h +0 -843
  483. data/modules/emscripten/system/include/libc/sys/sched.h +0 -67
  484. data/modules/emscripten/system/include/libc/sys/stdio.h +0 -27
  485. data/modules/emscripten/system/include/libc/sys/string.h +0 -2
  486. data/modules/emscripten/system/include/libc/sys/syslimits.h +0 -65
  487. data/modules/emscripten/system/include/libc/sys/unistd.h +0 -514
  488. data/modules/emscripten/system/include/libc/sys/utime.h +0 -26
  489. data/modules/emscripten/system/include/libc/unctrl.h +0 -46
  490. data/modules/emscripten/system/include/memory.h +0 -10
  491. data/modules/emscripten/system/include/mntent.h +0 -23
  492. data/modules/emscripten/system/include/net/arpa/inet.h +0 -32
  493. data/modules/emscripten/system/include/net/arpa/nameser.h +0 -535
  494. data/modules/emscripten/system/include/net/arpa/nameser_compat.h +0 -187
  495. data/modules/emscripten/system/include/net/if.h +0 -106
  496. data/modules/emscripten/system/include/net/netinet/in.h +0 -230
  497. data/modules/emscripten/system/include/net/netinet/tcp.h +0 -246
  498. data/modules/emscripten/system/include/net/resolv.h +0 -389
  499. data/modules/emscripten/system/include/netdb.h +0 -130
  500. data/modules/emscripten/system/include/nl_types.h +0 -19
  501. data/modules/emscripten/system/include/poll.h +0 -3
  502. data/modules/emscripten/system/include/pty.h +0 -6
  503. data/modules/emscripten/system/include/semaphore.h +0 -31
  504. data/modules/emscripten/system/include/spawn.h +0 -105
  505. data/modules/emscripten/system/include/stdbool.h +0 -16
  506. data/modules/emscripten/system/include/sys/bitypes.h +0 -3
  507. data/modules/emscripten/system/include/sys/io.h +0 -14
  508. data/modules/emscripten/system/include/sys/ioctl.h +0 -78
  509. data/modules/emscripten/system/include/sys/poll.h +0 -31
  510. data/modules/emscripten/system/include/sys/select.h +0 -16
  511. data/modules/emscripten/system/include/sys/sendfile.h +0 -16
  512. data/modules/emscripten/system/include/sys/socket.h +0 -247
  513. data/modules/emscripten/system/include/sys/socketvar.h +0 -3
  514. data/modules/emscripten/system/include/sys/statvfs.h +0 -32
  515. data/modules/emscripten/system/include/sys/uio.h +0 -22
  516. data/modules/emscripten/system/include/sys/un.h +0 -66
  517. data/modules/emscripten/system/include/sysexits.h +0 -108
  518. data/modules/emscripten/system/include/xlocale.h +0 -47
@@ -40,7 +40,7 @@ TODO: You can also provide .crn files yourself, pre-crunched. With this o
40
40
  '''
41
41
 
42
42
  import os, sys, shutil, random, uuid, ctypes
43
-
43
+ import posixpath
44
44
  import shared
45
45
  from shared import Compression, execute, suffix, unsuffixed
46
46
  from subprocess import Popen, PIPE, STDOUT
@@ -217,7 +217,7 @@ for file_ in data_files:
217
217
  if file_['dstpath'].endswith('/'): # If user has submitted a directory name as the destination but omitted the destination filename, use the filename from source file
218
218
  file_['dstpath'] = file_['dstpath'] + os.path.basename(file_['srcpath'])
219
219
  # make destination path always relative to the root
220
- file_['dstpath'] = os.path.normpath(os.path.join('/', file_['dstpath']))
220
+ file_['dstpath'] = posixpath.normpath(os.path.join('/', file_['dstpath']))
221
221
  if DEBUG:
222
222
  print >> sys.stderr, 'Packaging file "' + file_['srcpath'] + '" to VFS in path "' + file_['dstpath'] + '".'
223
223
 
@@ -329,13 +329,48 @@ if has_preloaded:
329
329
 
330
330
  # Data requests - for getting a block of data out of the big archive - have a similar API to XHRs
331
331
  code += '''
332
- function DataRequest() {}
332
+ function DataRequest(start, end, crunched, audio) {
333
+ this.start = start;
334
+ this.end = end;
335
+ this.crunched = crunched;
336
+ this.audio = audio;
337
+ }
333
338
  DataRequest.prototype = {
334
339
  requests: {},
335
340
  open: function(mode, name) {
341
+ this.name = name;
336
342
  this.requests[name] = this;
343
+ Module['addRunDependency']('fp ' + this.name);
344
+ },
345
+ send: function() {},
346
+ onload: function() {
347
+ var byteArray = this.byteArray.subarray(this.start, this.end);
348
+ if (this.crunched) {
349
+ var ddsHeader = byteArray.subarray(0, 128);
350
+ var that = this;
351
+ requestDecrunch(this.name, byteArray.subarray(128), function(ddsData) {
352
+ byteArray = new Uint8Array(ddsHeader.length + ddsData.length);
353
+ byteArray.set(ddsHeader, 0);
354
+ byteArray.set(ddsData, 128);
355
+ that.finish(byteArray);
356
+ });
357
+ } else {
358
+ this.finish(byteArray);
359
+ }
360
+ },
361
+ finish: function(byteArray) {
362
+ var that = this;
363
+ Module['FS_createPreloadedFile'](this.name, null, byteArray, true, true, function() {
364
+ Module['removeRunDependency']('fp ' + that.name);
365
+ }, function() {
366
+ if (that.audio) {
367
+ Module['removeRunDependency']('fp ' + that.name); // workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
368
+ } else {
369
+ Runtime.warn('Preloading file ' + that.name + ' failed');
370
+ }
371
+ }, false, true); // canOwn this data in the filesystem, it is a slide into the heap that will never change
372
+ this.requests[this.name] = null;
337
373
  },
338
- send: function() {}
339
374
  };
340
375
  '''
341
376
 
@@ -364,66 +399,28 @@ for file_ in data_files:
364
399
  # Preload
365
400
  varname = 'filePreload%d' % counter
366
401
  counter += 1
367
- dds = crunch and filename.endswith(CRUNCH_INPUT_SUFFIX)
368
-
369
- prepare = ''
370
- finish = "Module['removeRunDependency']('fp %s');\n" % filename
371
-
372
- if dds:
373
- # decompress crunch format into dds
374
- prepare = '''
375
- var ddsHeader = byteArray.subarray(0, %(dds_header_size)d);
376
- requestDecrunch('%(filename)s', byteArray.subarray(%(dds_header_size)d), function(ddsData) {
377
- byteArray = new Uint8Array(ddsHeader.length + ddsData.length);
378
- byteArray.set(ddsHeader, 0);
379
- byteArray.set(ddsData, %(dds_header_size)d);
380
- ''' % { 'filename': filename, 'dds_header_size': DDS_HEADER_SIZE }
381
-
382
- finish += '''
383
- });
384
- '''
385
-
386
- code += '''
387
- var %(varname)s = new %(request)s();
388
- %(varname)s.open('GET', '%(filename)s', true);
389
- %(varname)s.responseType = 'arraybuffer';
390
- %(varname)s.onload = function() {
391
- var arrayBuffer = %(varname)s.response;
392
- assert(arrayBuffer, 'Loading file %(filename)s failed.');
393
- var byteArray = !arrayBuffer.subarray ? new Uint8Array(arrayBuffer) : arrayBuffer;
394
- %(prepare)s
395
- Module['FS_createPreloadedFile']('%(dirname)s', '%(basename)s', byteArray, true, true, function() {
396
- %(finish)s
397
- }%(fail)s);
398
- };
399
- Module['addRunDependency']('fp %(filename)s');
400
- %(varname)s.send(null);
402
+ code += ''' new DataRequest(%(start)d, %(end)d, %(crunched)s, %(audio)s).open('GET', '%(filename)s');
401
403
  ''' % {
402
- 'request': 'DataRequest', # In the past we also supported XHRs here
403
- 'varname': varname,
404
- 'filename': filename,
405
- 'dirname': dirname,
406
- 'basename': basename,
407
- 'prepare': prepare,
408
- 'finish': finish,
409
- 'fail': '' if filename[-4:] not in AUDIO_SUFFIXES else ''', function() { Module['removeRunDependency']('fp %s') }''' % filename # workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
410
- }
404
+ 'filename': file_['dstpath'],
405
+ 'start': file_['data_start'],
406
+ 'end': file_['data_end'],
407
+ 'crunched': '1' if crunch and filename.endswith(CRUNCH_INPUT_SUFFIX) else '0',
408
+ 'audio': '1' if filename[-4:] in AUDIO_SUFFIXES else '0',
409
+ }
411
410
  else:
412
411
  assert 0
413
412
 
414
413
  if has_preloaded:
415
414
  # Get the big archive and split it up
416
- use_data = ''
415
+ use_data = '''
416
+ // copy the entire loaded file into a spot in the heap. Files will refer to slices in that. They cannot be freed though.
417
+ var ptr = Module['_malloc'](byteArray.length);
418
+ Module['HEAPU8'].set(byteArray, ptr);
419
+ DataRequest.prototype.byteArray = Module['HEAPU8'].subarray(ptr, ptr+byteArray.length);
420
+ '''
417
421
  for file_ in data_files:
418
422
  if file_['mode'] == 'preload':
419
- use_data += '''
420
- curr = DataRequest.prototype.requests['%s'];
421
- var data = byteArray.subarray(%d, %d);
422
- var ptr = Module['_malloc'](%d);
423
- Module['HEAPU8'].set(data, ptr);
424
- curr.response = Module['HEAPU8'].subarray(ptr, ptr + %d);
425
- curr.onload();
426
- ''' % (file_['dstpath'], file_['data_start'], file_['data_end'], file_['data_end'] - file_['data_start'], file_['data_end'] - file_['data_start'])
423
+ use_data += ' DataRequest.prototype.requests["%s"].onload();\n' % (file_['dstpath'])
427
424
  use_data += " Module['removeRunDependency']('datafile_%s');\n" % data_target
428
425
 
429
426
  if Compression.on:
@@ -1,5 +1,5 @@
1
1
  '''
2
- Simple tool to find big functions in an .ll file.
2
+ Simple tool to find big functions in a js or ll file
3
3
  '''
4
4
 
5
5
  import os, sys, re
@@ -11,7 +11,7 @@ curr = None
11
11
  data = []
12
12
  for line in open(filename):
13
13
  i += 1
14
- if line.startswith('function '):
14
+ if line.startswith(('function ', 'define ')):
15
15
  start = i
16
16
  curr = line
17
17
  elif line.startswith('}') and curr:
@@ -0,0 +1,24 @@
1
+ '''
2
+ Simple tool to find functions with lots of vars.
3
+ '''
4
+
5
+ import os, sys, re
6
+
7
+ filename = sys.argv[1]
8
+ i = 0
9
+ curr = None
10
+ data = []
11
+ size = 0
12
+ for line in open(filename):
13
+ i += 1
14
+ if line.startswith('function '):
15
+ size = len(line.split(',')) # params
16
+ curr = line
17
+ elif line.strip().startswith('var '):
18
+ size += len(line.split(',')) + 1 # vars
19
+ elif line.startswith('}') and curr:
20
+ data.append([curr, size])
21
+ curr = None
22
+ data.sort(lambda x, y: x[1] - y[1])
23
+ print ''.join(['%6d : %s' % (x[1], x[0]) for x in data])
24
+
@@ -0,0 +1,509 @@
1
+ # -*- encoding: utf8 -*-
2
+
3
+ '''
4
+ This tool extracts information about structs and defines from the C headers.
5
+ You can pass either the raw header files or JSON files to this script.
6
+
7
+ The JSON input format is as follows:
8
+ [
9
+ {
10
+ 'file': 'some/header.h',
11
+ 'structs': {
12
+ 'struct_name': [
13
+ 'field1',
14
+ 'field2',
15
+ 'field3',
16
+ {
17
+ 'field4': [
18
+ 'nested1',
19
+ 'nested2',
20
+ {
21
+ 'nested3': [
22
+ 'deep_nested1',
23
+ ...
24
+ ]
25
+ }
26
+ ...
27
+ ]
28
+ },
29
+ 'field5'
30
+ ],
31
+ 'other_struct': [
32
+ 'field1',
33
+ 'field2',
34
+ ...
35
+ ]
36
+ },
37
+ 'defines': [
38
+ 'DEFINE_1',
39
+ 'DEFINE_2',
40
+ ['f', 'FLOAT_DEFINE'],
41
+ 'DEFINE_3',
42
+ ...
43
+ ]
44
+ },
45
+ {
46
+ 'file': 'some/other/header.h',
47
+ ...
48
+ }
49
+ ]
50
+
51
+ Please note that the 'f' for 'FLOAT_DEFINE' is just the format passed to printf(), you can put anything printf() understands.
52
+ If you call this script with the flag "-f" and pass a header file, it will create an automated boilerplate for you.
53
+
54
+ The JSON output format is based on the return value of Runtime.generateStructInfo().
55
+ {
56
+ 'structs': {
57
+ 'struct_name': {
58
+ '__size__': <the struct's size>,
59
+ 'field1': <field1's offset>,
60
+ 'field2': <field2's offset>,
61
+ 'field3': <field3's offset>,
62
+ 'field4': {
63
+ '__size__': <field4's size>,
64
+ 'nested1': <nested1's offset>,
65
+ ...
66
+ },
67
+ ...
68
+ }
69
+ },
70
+ 'defines': {
71
+ 'DEFINE_1': <DEFINE_1's value>,
72
+ ...
73
+ }
74
+ }
75
+
76
+ '''
77
+
78
+ import sys, os, re, json, argparse, tempfile, subprocess
79
+ import shared
80
+ QUIET = (__name__ != '__main__')
81
+
82
+ def show(msg):
83
+ global QUIET
84
+ if not QUIET:
85
+ sys.stderr.write(msg + '\n')
86
+
87
+ # Try to load pycparser.
88
+ try:
89
+ import pycparser
90
+ except ImportError:
91
+ # The import failed, warn the user.
92
+ show('WARN: pycparser isn\'t available. I won\'t be able to parse C files, only .json files.')
93
+
94
+ def parse_header(path, cpp_opts):
95
+ # Tell the user how to get pycparser, if he or she tries to parse a C file.
96
+ sys.stderr.write('ERR: I need pycparser to process C files. \n')
97
+ sys.stderr.write(' Use "pip install pycparser" to install or download it from "https://github.com/eliben/pycparser".\n')
98
+ sys.exit(1)
99
+ else:
100
+ # We successfully imported pycparser, the script will be completely functional.
101
+
102
+ class DelayedRef(object):
103
+ def __init__(self, dest):
104
+ self.dest = dest
105
+
106
+ def __str__(self):
107
+ return self.dest
108
+
109
+ # For a list of node types and their fields, look here: https://github.com/eliben/pycparser/blob/master/pycparser/_c_ast.cfg
110
+ class FieldVisitor(pycparser.c_ast.NodeVisitor):
111
+ def __init__(self):
112
+ self._name = None
113
+ self.structs = {}
114
+ self.named_structs = {}
115
+
116
+ def visit_Struct(self, node):
117
+ if node.decls == None:
118
+ self.named_structs[self._name] = DelayedRef(node.name)
119
+ return
120
+
121
+
122
+ fields = []
123
+ for decl in node.decls:
124
+ if decl.name == None:
125
+ # Well, this field doesn't have a name.
126
+ continue
127
+
128
+ if decl.type != None and isinstance(decl.type, pycparser.c_ast.PtrDecl):
129
+ # This field is a pointer, there's no point in looking for nested structs.
130
+ fields.append(decl.name)
131
+ else:
132
+ # Look for nested structs.
133
+ subwalk = FieldVisitor()
134
+ subwalk.visit(decl)
135
+
136
+ if subwalk.named_structs:
137
+ # Store the nested fields.
138
+ fields.append(subwalk.named_structs)
139
+ else:
140
+ # Just store the field name.
141
+ fields.append(decl.name)
142
+
143
+ if node.name != None:
144
+ self.structs[node.name] = fields
145
+
146
+ self.named_structs[self._name] = fields
147
+
148
+ def visit_Union(self, node):
149
+ self.visit_Struct(node)
150
+
151
+ def visit_TypeDecl(self, node):
152
+ # Remember the name of this typedef, so we can access it later in visit_Struct().
153
+ old_name = self._name
154
+ self._name = node.declname
155
+ self.generic_visit(node)
156
+ self._name = old_name
157
+
158
+ # The first parameter is a structure, the second is a path (a list containing all the keys, needed to reach the destination).
159
+ # The last parameter is an item to look for. This function will try to follow the path into the given object and then look there for this key.
160
+ # As long as the nested object doesn't have the given key, it will descent into the next higher object till it finds the given key.
161
+ #
162
+ # Example:
163
+ #
164
+ # res = look_through({
165
+ # 'la1': {
166
+ # 'lb1': {
167
+ # 'lc1': 99,
168
+ # 'lc2': { 'ld1': 11 }
169
+ # 'lc2': 200
170
+ # },
171
+ # 'nice': 100
172
+ # },
173
+ # 'nice': 300
174
+ # }, ['la1', 'lb1', 'lc2'], 'nice')
175
+ #
176
+ # print(res) # Prints 100 .
177
+ #
178
+ # In this case the function looked inside obj['la1']['lb1']['lc2']['nice'], then obj['la1']['lb1']['nice'] and found the value
179
+ # in obj['la1']['nice']. As soon as it finds a value it returns it and stops looking.
180
+ def look_through(obj, path, name):
181
+ cur_level = obj
182
+ path = path[:]
183
+ for i, p in enumerate(path):
184
+ cur_level = cur_level[p]
185
+ path[i] = cur_level
186
+
187
+ path = [ obj ] + path
188
+
189
+ while len(path) > 0:
190
+ if name in path[-1]:
191
+ return path[-1][name]
192
+ else:
193
+ path.pop()
194
+
195
+ return None
196
+
197
+ # Use the above function to resolve all DelayedRef() inside a list or dict recursively.
198
+ def resolve_delayed(item, root=None, path=[]):
199
+ if root == None:
200
+ root = item
201
+
202
+ if isinstance(item, DelayedRef):
203
+ if item.dest in path:
204
+ show('WARN: Circular reference found! Field "' + path[-1] + '" references "' + item.dest + '"! (Path = ' + '/'.join([str(part) for part in path]) + ')')
205
+ return { '__ref__': item.dest }
206
+ else:
207
+ return look_through(root, path[:-1], item.dest)
208
+ elif isinstance(item, dict):
209
+ for name, val in item.items():
210
+ item[name] = resolve_delayed(val, root, path + [ name ])
211
+ elif isinstance(item, list):
212
+ for i, val in enumerate(item):
213
+ item[i] = resolve_delayed(val, root, path + [ i ])
214
+
215
+ return item
216
+
217
+ def parse_header(path, cpp_opts):
218
+ show('Parsing header "' + path + '"...')
219
+
220
+ # Use clang -E as the preprocessor for pycparser.
221
+ ast = pycparser.parse_file(path, True, cpp_path=shared.CLANG_CC, cpp_args=['-E'] + cpp_opts)
222
+
223
+ # Walk the parsed AST and filter out all the declared structs and their fields.
224
+ walker = FieldVisitor()
225
+ walker.visit(ast)
226
+
227
+ walker.structs = resolve_delayed(walker.structs)
228
+ with open(path, 'r') as stream:
229
+ defines = re.findall(r'(?:^|\n)\s*#define\s+([A-Z|_|0-9]+)\s.*', stream.read())
230
+
231
+ return {
232
+ 'file': path,
233
+ 'defines': defines,
234
+ 'structs': walker.structs
235
+ }
236
+
237
+ # The following three functions generate C code. The output of the compiled code will be
238
+ # parsed later on and then put back together into a dict structure by parse_c_output().
239
+ #
240
+ # Example:
241
+ # c_descent('test1', code)
242
+ # c_set('item', 'i%i', '111', code)
243
+ # c_set('item2', 'i%i', '9', code)
244
+ # c_set('item3', 's%s', '"Hello"', code)
245
+ # c_ascent(code)
246
+ # c_set('outer', 'f%f', '0.999', code)
247
+ #
248
+ # Will result in:
249
+ # {
250
+ # 'test1': {
251
+ # 'item': 111,
252
+ # 'item2': 9,
253
+ # 'item3': 'Hello',
254
+ # },
255
+ # 'outer': 0.999
256
+ # }
257
+ def c_set(name, type_, value, code):
258
+ code.append('printf("K' + name + '\\n");')
259
+ code.append('printf("V' + type_ + '\\n", ' + value + ');')
260
+
261
+ def c_descent(name, code):
262
+ code.append('printf("D' + name + '\\n");')
263
+
264
+ def c_ascent(code):
265
+ code.append('printf("A\\n");')
266
+
267
+ def parse_c_output(lines):
268
+ result = {}
269
+ cur_level = result
270
+ parent = []
271
+ key = None
272
+
273
+ for line in lines:
274
+ arg = line[1:].strip()
275
+ if line[0] == 'K':
276
+ # This is a key
277
+ key = arg
278
+ elif line[0] == 'V':
279
+ # A value
280
+ if arg[0] == 'i':
281
+ arg = int(arg[1:])
282
+ elif arg[0] == 'f':
283
+ arg = float(arg[1:])
284
+ elif arg[0] == 's':
285
+ arg = arg[1:]
286
+
287
+ cur_level[key] = arg
288
+ elif line[0] == 'D':
289
+ # Remember the current level as the last parent.
290
+ parent.append(cur_level)
291
+
292
+ # We descend one level.
293
+ cur_level[arg] = {}
294
+ cur_level = cur_level[arg]
295
+ elif line[0] == 'A':
296
+ # We return to the parent dict. (One level up.)
297
+ cur_level = parent.pop()
298
+
299
+ return result
300
+
301
+ def gen_inspect_code(path, struct, code):
302
+ if path[0][-1] == '#':
303
+ path[0] = path[0][:-1]
304
+ prefix = ''
305
+ else:
306
+ prefix = 'struct '
307
+
308
+ c_descent(path[-1], code)
309
+
310
+ if len(path) == 1:
311
+ c_set('__size__', 'i%u', 'sizeof (' + prefix + path[0] + ')', code)
312
+ else:
313
+ c_set('__size__', 'i%u', 'sizeof ((' + prefix + path[0] + ' *)0)->' + '.'.join(path[1:]), code)
314
+ #c_set('__offset__', 'i%u', 'offsetof(' + prefix + path[0] + ', ' + '.'.join(path[1:]) + ')', code)
315
+
316
+ for field in struct:
317
+ if isinstance(field, dict):
318
+ # We have to recurse to inspect the nested dict.
319
+ fname = field.keys()[0]
320
+ gen_inspect_code(path + [fname], field[fname], code)
321
+ else:
322
+ c_set(field, 'i%u', 'offsetof(' + prefix + path[0] + ', ' + '.'.join(path[1:] + [field]) + ')', code)
323
+
324
+ c_ascent(code)
325
+
326
+ def inspect_code(headers, cpp_opts, structs, defines):
327
+ show('Generating C code...')
328
+
329
+ code = ['#include <stdio.h>', '#include <stddef.h>']
330
+ # Include all the needed headers.
331
+ for path in headers:
332
+ code.append('#include "' + path + '"')
333
+
334
+ code.append('int main() {')
335
+ c_descent('structs', code)
336
+ for name, struct in structs.items():
337
+ gen_inspect_code([name], struct, code)
338
+
339
+ c_ascent(code)
340
+ c_descent('defines', code)
341
+ for name, type_ in defines.items():
342
+ # Add the necessary python type, if missing.
343
+ if '%' not in type_:
344
+ if type_[-1] in ('d', 'i', 'u'):
345
+ # integer
346
+ type_ = 'i%' + type_
347
+ elif type_[-1] in ('f', 'F', 'e', 'E', 'g', 'G'):
348
+ # float
349
+ type_ = 'f%' + type_
350
+ elif type_[-1] in ('x', 'X', 'a', 'A', 'c', 's'):
351
+ # hexadecimal or string
352
+ type_ = 's%' + type_
353
+
354
+ c_set(name, type_, name, code)
355
+
356
+ code.append('return 0;')
357
+ code.append('}')
358
+
359
+ # Write the source code to a temporary file.
360
+ src_file = tempfile.mkstemp('.c')
361
+ bin_file = tempfile.mkstemp('.ll')
362
+
363
+ os.write(src_file[0], '\n'.join(code))
364
+
365
+ # Close all unneeded FDs.
366
+ os.close(src_file[0])
367
+ os.close(bin_file[0])
368
+
369
+ # NOTE: We can't generate an executable in the next step because it won't run on the current system without changing the target.
370
+ # If we change the target, some type sizes will change resulting in wrong data. As a workaround, we will be generating bitcode and
371
+ # run that with the LLVM interpreter. That way we can use the default target and still run the code.
372
+ info = []
373
+ try:
374
+ # Compile the program.
375
+ show('Compiling generated code...')
376
+ subprocess.check_call([shared.CLANG_CC, '-emit-llvm', '-S'] + cpp_opts + ['-o', bin_file[1], src_file[1]])
377
+
378
+ # Run the compiled program.
379
+ show('Calling generated program...')
380
+ info = subprocess.check_output([shared.LLVM_INTERPRETER, bin_file[1]]).splitlines()
381
+ except subprocess.CalledProcessError:
382
+ if os.path.isfile(bin_file[1]):
383
+ sys.stderr.write('FAIL: Running the generated program failed!\n')
384
+ else:
385
+ sys.stderr.write('FAIL: Compilation failed!\n')
386
+
387
+ sys.exit(1)
388
+ finally:
389
+ # Remove all temporary files.
390
+ os.unlink(src_file[1])
391
+
392
+ if os.path.exists(bin_file[1]):
393
+ os.unlink(bin_file[1])
394
+
395
+ # Parse the output of the program into a dict.
396
+ return parse_c_output(info)
397
+
398
+ def parse_json(path, header_files, structs, defines):
399
+ with open(path, 'r') as stream:
400
+ # Remove comments before loading the JSON.
401
+ data = json.loads(re.sub(r'//.*\n', '', stream.read()))
402
+
403
+ if not isinstance(data, list):
404
+ data = [ data ]
405
+
406
+ for item in data:
407
+ header_files.append(item['file'])
408
+ for name, data in item['structs'].items():
409
+ if name in structs:
410
+ show('WARN: Description of struct "' + name + '" in file "' + item['file'] + '" replaces an existing description!')
411
+
412
+ structs[name] = data
413
+
414
+ for part in item['defines']:
415
+ if not isinstance(part, list):
416
+ # If no type is specified, assume integer.
417
+ part = ['i', part]
418
+
419
+ if part[1] in defines:
420
+ show('WARN: Description of define "' + part[1] + '" in file "' + item['file'] + '" replaces an existing description!')
421
+
422
+ defines[part[1]] = part[0]
423
+
424
+ def output_json(obj, compressed=True, stream=None):
425
+ if stream == None:
426
+ stream = sys.stdout
427
+ elif isinstance(stream, str):
428
+ stream = open(stream, 'w')
429
+
430
+ if compressed:
431
+ json.dump(obj, stream, separators=(',', ':'))
432
+ else:
433
+ json.dump(obj, stream, indent=4, sort_keys=True)
434
+
435
+ stream.close()
436
+
437
+ def filter_opts(opts):
438
+ # Only apply compiler options regarding syntax, includes and defines.
439
+ # We have to compile for the current system, we aren't compiling to bitcode after all.
440
+ out = []
441
+ for flag in opts:
442
+ if flag[:2] in ('-f', '-I', '-i', '-D', '-U'):
443
+ out.append(flag)
444
+
445
+ return out
446
+
447
+ def main(args):
448
+ global QUIET
449
+
450
+ parser = argparse.ArgumentParser(description='Generate JSON infos for structs.')
451
+ parser.add_argument('headers', nargs='+', help='A header (.h) file or a JSON file with a list of structs and their fields')
452
+ parser.add_argument('-q', dest='quiet', action='store_true', default=False, help='Don\'t output anything besides error messages.')
453
+ parser.add_argument('-f', dest='list_fields', action='store_true', default=False, help='Output a list of structs and fields for the given headers.')
454
+ parser.add_argument('-p', dest='pretty_print', action='store_true', default=False, help='Pretty print the outputted JSON.')
455
+ parser.add_argument('-o', dest='output', metavar='path', default=None, help='Path to the JSON file that will be written. If omitted, the generated data will be printed to stdout.')
456
+ parser.add_argument('-I', dest='includes', metavar='dir', action='append', default=[], help='Add directory to include search path')
457
+ parser.add_argument('-D', dest='defines', metavar='define', action='append', default=[], help='Pass a define to the preprocessor')
458
+ parser.add_argument('-U', dest='undefines', metavar='undefine', action='append', default=[], help='Pass an undefine to the preprocessor')
459
+ args = parser.parse_args(args)
460
+
461
+ QUIET = args.quiet
462
+
463
+ # Avoid parsing problems due to gcc specifc syntax.
464
+ cpp_opts = ['-D_GNU_SOURCE'] + shared.COMPILER_OPTS
465
+
466
+ # Add the user options to the list as well.
467
+ for path in args.includes:
468
+ cpp_opts.append('-I' + path)
469
+
470
+ for arg in args.defines:
471
+ cpp_opts.append('-D' + arg)
472
+
473
+ for arg in args.undefines:
474
+ cpp_opts.append('-U' + arg)
475
+
476
+ if args.list_fields:
477
+ # Just parse the given headers and output the result.
478
+ data = []
479
+ for path in args.headers:
480
+ if path[-5:] == '.json':
481
+ show('WARN: Skipping "' + path + '" because it\'s already a JSON file!')
482
+ else:
483
+ data.append(parse_header(path, cpp_opts))
484
+
485
+ output_json(data, not args.pretty_print, args.output)
486
+ sys.exit(0)
487
+
488
+ # Look for structs in all passed headers.
489
+ header_files = []
490
+ structs = {}
491
+ defines = {}
492
+
493
+ for header in args.headers:
494
+ if header[-5:] == '.json':
495
+ # This is a JSON file, parse it.
496
+ parse_json(header, header_files, structs, defines)
497
+ else:
498
+ # If the passed file isn't a JSON file, assume it's a header.
499
+ header_files.append(header)
500
+ data = parse_header(header, cpp_opts)
501
+ structs.update(data['structs'])
502
+ defines.extend(data['defines'])
503
+
504
+ # Inspect all collected structs.
505
+ struct_info = inspect_code(header_files, cpp_opts, structs, defines)
506
+ output_json(struct_info, not args.pretty_print, args.output)
507
+
508
+ if __name__ == '__main__':
509
+ main(sys.argv[1:])