webruby 0.1.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/driver/driver.c +12 -0
- data/lib/webruby/config.rb +3 -3
- data/lib/webruby/environment.rb +1 -0
- data/lib/webruby/rake/files.rake +22 -22
- data/lib/webruby/rake/general.rake +0 -1
- data/lib/webruby/utility.rb +2 -0
- data/modules/emscripten/AUTHORS +12 -1
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +152 -15
- data/modules/emscripten/em++ +2 -0
- data/modules/emscripten/em++.bat +1 -1
- data/modules/emscripten/em-config.bat +1 -1
- data/modules/emscripten/emar.bat +1 -1
- data/modules/emscripten/emcc +233 -95
- data/modules/emscripten/emcc.bat +1 -1
- data/modules/emscripten/emconfigure.bat +1 -1
- data/modules/emscripten/emmake.bat +1 -1
- data/modules/emscripten/emranlib.bat +1 -1
- data/modules/emscripten/emscripten.py +221 -217
- data/modules/emscripten/package.json +7 -0
- data/modules/emscripten/src/analyzer.js +1437 -1385
- data/modules/emscripten/src/compiler.js +30 -6
- data/modules/emscripten/src/compiler_phase.html +33 -0
- data/modules/emscripten/src/fastLong.js +6 -6
- data/modules/emscripten/src/headless.js +47 -656
- data/modules/emscripten/src/headlessCanvas.js +618 -0
- data/modules/emscripten/src/intertyper.js +1038 -899
- data/modules/emscripten/src/jsifier.js +818 -714
- data/modules/emscripten/src/library.js +1794 -2968
- data/modules/emscripten/src/library_browser.js +81 -16
- data/modules/emscripten/src/library_egl.js +9 -3
- data/modules/emscripten/src/library_fs.js +1585 -0
- data/modules/emscripten/src/library_gl.js +445 -202
- data/modules/emscripten/src/library_glfw.js +4 -1
- data/modules/emscripten/src/library_glut.js +61 -13
- data/modules/emscripten/src/library_idbfs.js +216 -0
- data/modules/emscripten/src/library_memfs.js +279 -0
- data/modules/emscripten/src/library_nodefs.js +234 -0
- data/modules/emscripten/src/library_openal.js +131 -150
- data/modules/emscripten/src/library_path.js +3 -0
- data/modules/emscripten/src/library_sdl.js +499 -229
- data/modules/emscripten/src/library_sockfs.js +576 -0
- data/modules/emscripten/src/library_tty.js +146 -0
- data/modules/emscripten/src/modules.js +30 -35
- data/modules/emscripten/src/parseTools.js +356 -161
- data/modules/emscripten/src/postamble.js +76 -31
- data/modules/emscripten/src/preamble.js +271 -41
- data/modules/emscripten/src/proxyClient.js +82 -0
- data/modules/emscripten/src/proxyWorker.js +143 -0
- data/modules/emscripten/src/relooper/Relooper.cpp +60 -24
- data/modules/emscripten/src/relooper/Relooper.h +3 -2
- data/modules/emscripten/src/relooper/emscripten/glue.js +20 -10
- data/modules/emscripten/src/relooper/fuzzer.py +19 -10
- data/modules/emscripten/src/relooper/test.cpp +50 -50
- data/modules/emscripten/src/relooper/test.txt +147 -30
- data/modules/emscripten/src/relooper/test2.c +13 -13
- data/modules/emscripten/src/relooper/test2.txt +17 -3
- data/modules/emscripten/src/relooper/test3.c +7 -7
- data/modules/emscripten/src/relooper/test3.txt +36 -7
- data/modules/emscripten/src/relooper/test4.cpp +7 -7
- data/modules/emscripten/src/relooper/test4.txt +28 -7
- data/modules/emscripten/src/relooper/test5.cpp +6 -6
- data/modules/emscripten/src/relooper/test5.txt +34 -10
- data/modules/emscripten/src/relooper/test6.cpp +4 -4
- data/modules/emscripten/src/relooper/test6.txt +17 -3
- data/modules/emscripten/src/relooper/test_dead.cpp +2 -2
- data/modules/emscripten/src/relooper/test_debug.cpp +4 -4
- data/modules/emscripten/src/relooper/test_debug.txt +17 -3
- data/modules/emscripten/src/relooper/test_fuzz1.cpp +9 -9
- data/modules/emscripten/src/relooper/test_fuzz1.txt +45 -5
- data/modules/emscripten/src/relooper/test_fuzz2.cpp +4 -4
- data/modules/emscripten/src/relooper/test_fuzz2.txt +18 -1
- data/modules/emscripten/src/relooper/test_fuzz3.cpp +5 -5
- data/modules/emscripten/src/relooper/test_fuzz3.txt +16 -0
- data/modules/emscripten/src/relooper/test_fuzz4.cpp +5 -5
- data/modules/emscripten/src/relooper/test_fuzz4.txt +25 -3
- data/modules/emscripten/src/relooper/test_fuzz5.cpp +10 -10
- data/modules/emscripten/src/relooper/test_fuzz5.txt +49 -15
- data/modules/emscripten/src/relooper/test_fuzz6.cpp +92 -92
- data/modules/emscripten/src/relooper/test_fuzz6.txt +201 -18
- data/modules/emscripten/src/relooper/test_inf.cpp +184 -184
- data/modules/emscripten/src/relooper/test_inf.txt +1078 -332
- data/modules/emscripten/src/runtime.js +69 -45
- data/modules/emscripten/src/settings.js +48 -919
- data/modules/emscripten/src/shell.html +1 -1
- data/modules/emscripten/src/shell.js +14 -8
- data/modules/emscripten/src/shell_sharedlib.js +18 -1
- data/modules/emscripten/src/simd.js +958 -0
- data/modules/emscripten/src/struct_info.json +1045 -0
- data/modules/emscripten/src/utility.js +11 -0
- data/modules/emscripten/system/bin/sdl-config +13 -0
- data/modules/emscripten/system/include/compat/ctype.h +17 -0
- data/modules/emscripten/system/include/compat/malloc.h +48 -0
- data/modules/emscripten/system/include/compat/math.h +14 -0
- data/modules/emscripten/system/include/compat/netdb.h +22 -0
- data/modules/emscripten/system/include/compat/stdarg.h +16 -0
- data/modules/emscripten/system/include/compat/stdlib.h +16 -0
- data/modules/emscripten/system/include/compat/string.h +17 -0
- data/modules/emscripten/system/include/compat/sys/socketvar.h +14 -0
- data/modules/emscripten/system/include/compat/sys/stat.h +20 -0
- data/modules/emscripten/system/include/{libc → compat}/sys/timeb.h +3 -7
- data/modules/emscripten/system/include/compat/time.h +18 -0
- data/modules/emscripten/system/include/compat/unistd.h +16 -0
- data/modules/emscripten/system/include/compat/xlocale.h +19 -0
- data/modules/emscripten/system/include/emscripten/emscripten.h +48 -7
- data/modules/emscripten/system/include/emscripten/vector.h +6 -0
- data/modules/emscripten/system/include/libc/aio.h +69 -0
- data/modules/emscripten/system/include/libc/alloca.h +13 -13
- data/modules/emscripten/system/include/libc/ar.h +19 -63
- data/modules/emscripten/system/include/libc/arpa/ftp.h +35 -0
- data/modules/emscripten/system/include/libc/arpa/inet.h +36 -0
- data/modules/emscripten/system/include/libc/arpa/nameser.h +467 -0
- data/modules/emscripten/system/include/libc/arpa/nameser_compat.h +2 -0
- data/modules/emscripten/system/include/libc/arpa/telnet.h +251 -0
- data/modules/emscripten/system/include/libc/arpa/tftp.h +31 -0
- data/modules/emscripten/system/include/libc/assert.h +9 -36
- data/modules/emscripten/system/include/libc/bits/alltypes.h +397 -0
- data/modules/emscripten/system/include/libc/bits/endian.h +1 -0
- data/modules/emscripten/system/include/libc/bits/errno.h +134 -0
- data/modules/emscripten/system/include/libc/bits/fcntl.h +38 -0
- data/modules/emscripten/system/include/libc/bits/fenv.h +34 -0
- data/modules/emscripten/system/include/libc/bits/float.h +17 -0
- data/modules/emscripten/system/include/libc/bits/io.h +0 -0
- data/modules/emscripten/system/include/libc/bits/ioctl.h +197 -0
- data/modules/emscripten/system/include/libc/bits/ipc.h +14 -0
- data/modules/emscripten/system/include/libc/bits/limits.h +8 -0
- data/modules/emscripten/system/include/libc/bits/mman.h +62 -0
- data/modules/emscripten/system/include/libc/bits/msg.h +16 -0
- data/modules/emscripten/system/include/libc/bits/posix.h +2 -0
- data/modules/emscripten/system/include/libc/bits/reg.h +19 -0
- data/modules/emscripten/system/include/libc/bits/setjmp.h +1 -0
- data/modules/emscripten/system/include/libc/bits/shm.h +18 -0
- data/modules/emscripten/system/include/libc/bits/signal.h +112 -0
- data/modules/emscripten/system/include/libc/bits/socket.h +17 -0
- data/modules/emscripten/system/include/libc/bits/stat.h +22 -0
- data/modules/emscripten/system/include/libc/bits/statfs.h +7 -0
- data/modules/emscripten/system/include/libc/bits/stdarg.h +4 -0
- data/modules/emscripten/system/include/libc/bits/stdint.h +20 -0
- data/modules/emscripten/system/include/libc/bits/syscall.h +696 -0
- data/modules/emscripten/system/include/libc/bits/termios.h +160 -0
- data/modules/emscripten/system/include/libc/bits/user.h +48 -0
- data/modules/emscripten/system/include/libc/byteswap.h +26 -0
- data/modules/emscripten/system/include/libc/complex.h +55 -54
- data/modules/emscripten/system/include/libc/cpio.h +29 -0
- data/modules/emscripten/system/include/libc/crypt.h +20 -0
- data/modules/emscripten/system/include/libc/ctype.h +58 -187
- data/modules/emscripten/system/include/libc/dirent.h +69 -6
- data/modules/emscripten/system/include/libc/dlfcn.h +42 -0
- data/modules/emscripten/system/include/libc/elf.h +2555 -0
- data/modules/emscripten/system/include/libc/endian.h +80 -1
- data/modules/emscripten/system/include/libc/err.h +25 -0
- data/modules/emscripten/system/include/libc/errno.h +23 -7
- data/modules/emscripten/system/include/libc/fcntl.h +175 -1
- data/modules/emscripten/system/include/libc/features.h +32 -0
- data/modules/emscripten/system/include/libc/fenv.h +28 -0
- data/modules/emscripten/system/include/libc/float.h +34 -0
- data/modules/emscripten/system/include/libc/fnmatch.h +24 -50
- data/modules/emscripten/system/include/libc/ftw.h +42 -0
- data/modules/emscripten/system/include/libc/getopt.h +22 -187
- data/modules/emscripten/system/include/libc/glob.h +42 -83
- data/modules/emscripten/system/include/libc/grp.h +37 -79
- data/modules/emscripten/system/include/libc/iconv.h +18 -56
- data/modules/emscripten/system/include/libc/ifaddrs.h +24 -53
- data/modules/emscripten/system/include/libc/inttypes.h +208 -271
- data/modules/emscripten/system/include/libc/iso646.h +5 -28
- data/modules/emscripten/system/include/libc/langinfo.h +88 -316
- data/modules/emscripten/system/include/libc/lastlog.h +1 -0
- data/modules/emscripten/system/include/libc/libgen.h +5 -13
- data/modules/emscripten/system/include/libc/libintl.h +25 -0
- data/modules/emscripten/system/include/libc/limits.h +140 -149
- data/modules/emscripten/system/include/libc/link.h +54 -0
- data/modules/emscripten/system/include/libc/locale.h +72 -70
- data/modules/emscripten/system/include/libc/malloc.h +0 -169
- data/modules/emscripten/system/include/libc/math.h +393 -573
- data/modules/emscripten/system/include/libc/memory.h +1 -0
- data/modules/emscripten/system/include/libc/mntent.h +44 -0
- data/modules/emscripten/system/include/libc/monetary.h +23 -0
- data/modules/emscripten/system/include/libc/mqueue.h +36 -0
- data/modules/emscripten/system/include/libc/net/ethernet.h +55 -0
- data/modules/emscripten/system/include/libc/net/if.h +135 -0
- data/modules/emscripten/system/include/libc/net/if_arp.h +133 -0
- data/modules/emscripten/system/include/libc/net/route.h +124 -0
- data/modules/emscripten/system/include/libc/netdb.h +161 -0
- data/modules/emscripten/system/include/libc/netinet/ether.h +14 -0
- data/modules/emscripten/system/include/libc/netinet/icmp6.h +305 -0
- data/modules/emscripten/system/include/libc/netinet/if_ether.h +126 -0
- data/modules/emscripten/system/include/libc/netinet/in.h +336 -0
- data/modules/emscripten/system/include/libc/netinet/in_systm.h +9 -0
- data/modules/emscripten/system/include/libc/netinet/ip.h +186 -0
- data/modules/emscripten/system/include/libc/netinet/ip6.h +142 -0
- data/modules/emscripten/system/include/libc/netinet/ip_icmp.h +192 -0
- data/modules/emscripten/system/include/libc/netinet/tcp.h +71 -0
- data/modules/emscripten/system/include/libc/netinet/udp.h +35 -0
- data/modules/emscripten/system/include/libc/netpacket/packet.h +44 -0
- data/modules/emscripten/system/include/libc/nl_types.h +22 -0
- data/modules/emscripten/system/include/libc/paths.h +30 -5
- data/modules/emscripten/system/include/libc/poll.h +46 -0
- data/modules/emscripten/system/include/libc/pthread.h +191 -331
- data/modules/emscripten/system/include/libc/pty.h +18 -0
- data/modules/emscripten/system/include/libc/pwd.h +33 -62
- data/modules/emscripten/system/include/libc/readme.txt +2 -2
- data/modules/emscripten/system/include/libc/regex.h +53 -93
- data/modules/emscripten/system/include/libc/resolv.h +144 -0
- data/modules/emscripten/system/include/libc/sched.h +124 -89
- data/modules/emscripten/system/include/libc/search.h +40 -48
- data/modules/emscripten/system/include/libc/semaphore.h +35 -0
- data/modules/emscripten/system/include/libc/setjmp.h +35 -13
- data/modules/emscripten/system/include/libc/shadow.h +44 -0
- data/modules/emscripten/system/include/libc/signal.h +245 -20
- data/modules/emscripten/system/include/libc/spawn.h +74 -0
- data/modules/emscripten/system/include/libc/stdalign.h +15 -0
- data/modules/emscripten/system/include/libc/stdarg.h +18 -43
- data/modules/emscripten/system/include/libc/stdbool.h +14 -0
- data/modules/emscripten/system/include/libc/stddef.h +12 -58
- data/modules/emscripten/system/include/libc/stdint.h +82 -458
- data/modules/emscripten/system/include/libc/stdio.h +184 -679
- data/modules/emscripten/system/include/libc/stdio_ext.h +34 -0
- data/modules/emscripten/system/include/libc/stdlib.h +146 -205
- data/modules/emscripten/system/include/libc/stdnoreturn.h +5 -0
- data/modules/emscripten/system/include/libc/string.h +86 -89
- data/modules/emscripten/system/include/libc/strings.h +27 -27
- data/modules/emscripten/system/include/libc/stropts.h +139 -0
- data/modules/emscripten/system/include/libc/sys/acct.h +75 -0
- data/modules/emscripten/system/include/libc/sys/cachectl.h +22 -0
- data/modules/emscripten/system/include/libc/sys/dir.h +0 -8
- data/modules/emscripten/system/include/libc/sys/epoll.h +67 -0
- data/modules/emscripten/system/include/libc/sys/errno.h +2 -190
- data/modules/emscripten/system/include/libc/sys/eventfd.h +26 -0
- data/modules/emscripten/system/include/libc/sys/fcntl.h +2 -4
- data/modules/emscripten/system/include/libc/sys/file.h +20 -1
- data/modules/emscripten/system/include/libc/sys/fsuid.h +20 -0
- data/modules/emscripten/system/include/libc/sys/inotify.h +57 -0
- data/modules/emscripten/system/include/libc/sys/io.h +17 -0
- data/modules/emscripten/system/include/libc/sys/ioctl.h +14 -0
- data/modules/emscripten/system/include/libc/sys/ipc.h +42 -0
- data/modules/emscripten/system/include/{sys/sysctl.h → libc/sys/klog.h} +4 -4
- data/modules/emscripten/system/include/libc/sys/mman.h +55 -0
- data/modules/emscripten/system/include/libc/sys/mount.h +72 -0
- data/modules/emscripten/system/include/libc/sys/msg.h +52 -0
- data/modules/emscripten/system/include/libc/sys/mtio.h +188 -0
- data/modules/emscripten/system/include/libc/sys/param.h +29 -19
- data/modules/emscripten/system/include/libc/sys/personality.h +46 -0
- data/modules/emscripten/system/include/libc/sys/poll.h +2 -0
- data/modules/emscripten/system/include/libc/sys/prctl.h +101 -0
- data/modules/emscripten/system/include/libc/sys/procfs.h +65 -0
- data/modules/emscripten/system/include/libc/sys/ptrace.h +96 -0
- data/modules/emscripten/system/include/libc/sys/reboot.h +20 -0
- data/modules/emscripten/system/include/libc/sys/reg.h +9 -0
- data/modules/emscripten/system/include/libc/sys/resource.h +89 -45
- data/modules/emscripten/system/include/libc/sys/select.h +42 -0
- data/modules/emscripten/system/include/libc/sys/sem.h +82 -0
- data/modules/emscripten/system/include/libc/sys/sendfile.h +22 -0
- data/modules/emscripten/system/include/libc/sys/shm.h +61 -0
- data/modules/emscripten/system/include/libc/sys/signal.h +1 -315
- data/modules/emscripten/system/include/libc/sys/signalfd.h +44 -0
- data/modules/emscripten/system/include/libc/sys/socket.h +299 -0
- data/modules/emscripten/system/include/libc/sys/stat.h +95 -204
- data/modules/emscripten/system/include/libc/sys/statfs.h +32 -0
- data/modules/emscripten/system/include/libc/sys/statvfs.h +57 -0
- data/modules/emscripten/system/include/libc/sys/stropts.h +1 -0
- data/modules/emscripten/system/include/libc/sys/swap.h +21 -0
- data/modules/emscripten/system/include/libc/sys/syscall.h +6 -0
- data/modules/emscripten/system/include/libc/sys/sysctl.h +17 -0
- data/modules/emscripten/system/include/libc/sys/sysinfo.h +36 -0
- data/modules/emscripten/system/include/libc/sys/syslog.h +1 -0
- data/modules/emscripten/system/include/libc/sys/sysmacros.h +15 -0
- data/modules/emscripten/system/include/libc/sys/termios.h +2 -280
- data/modules/emscripten/system/include/libc/sys/time.h +40 -68
- data/modules/emscripten/system/include/libc/sys/timerfd.h +24 -0
- data/modules/emscripten/system/include/libc/sys/times.h +14 -16
- data/modules/emscripten/system/include/libc/sys/timex.h +98 -0
- data/modules/emscripten/system/include/libc/sys/ttydefaults.h +34 -92
- data/modules/emscripten/system/include/libc/sys/types.h +87 -481
- data/modules/emscripten/system/include/libc/sys/ucontext.h +1 -0
- data/modules/emscripten/system/include/libc/sys/uio.h +48 -0
- data/modules/emscripten/system/include/libc/sys/un.h +32 -0
- data/modules/emscripten/system/include/libc/sys/user.h +16 -0
- data/modules/emscripten/system/include/libc/sys/utsname.h +30 -0
- data/modules/emscripten/system/include/libc/sys/vfs.h +1 -0
- data/modules/emscripten/system/include/libc/sys/wait.h +41 -26
- data/modules/emscripten/system/include/libc/sys/xattr.h +30 -0
- data/modules/emscripten/system/include/libc/syscall.h +1 -0
- data/modules/emscripten/system/include/libc/sysexits.h +21 -0
- data/modules/emscripten/system/include/libc/syslog.h +104 -0
- data/modules/emscripten/system/include/libc/tar.h +27 -33
- data/modules/emscripten/system/include/libc/termios.h +40 -1
- data/modules/emscripten/system/include/libc/tgmath.h +270 -0
- data/modules/emscripten/system/include/libc/time.h +96 -237
- data/modules/emscripten/system/include/libc/ucontext.h +25 -0
- data/modules/emscripten/system/include/libc/ulimit.h +17 -0
- data/modules/emscripten/system/include/libc/unistd.h +517 -4
- data/modules/emscripten/system/include/libc/utime.h +15 -3
- data/modules/emscripten/system/include/libc/utmp.h +40 -1
- data/modules/emscripten/system/include/libc/utmpx.h +58 -0
- data/modules/emscripten/system/include/libc/values.h +39 -0
- data/modules/emscripten/system/include/libc/wchar.h +164 -175
- data/modules/emscripten/system/include/libc/wctype.h +67 -37
- data/modules/emscripten/system/include/libc/wordexp.h +31 -42
- data/modules/emscripten/system/include/libcxx/__locale +6 -6
- data/modules/emscripten/system/include/libcxx/locale +1 -1
- data/modules/emscripten/system/lib/libc/musl/readme.txt +9 -1
- data/modules/emscripten/system/lib/libc/musl/src/internal/locale_impl.h +5 -0
- data/modules/emscripten/system/lib/libc/musl/src/internal/stdio_impl.h +92 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/big5.h +1085 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/codepages.h +238 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/gb18030.h +1836 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/hkscs.h +390 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iconv.c +454 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswalnum_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswalpha_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswblank_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswcntrl_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswctype_l.c +9 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswdigit_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswgraph_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswlower_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswprint_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswpunct_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswspace_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswupper_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/iswxdigit_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/jis0208.h +550 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/ksc.h +640 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/legacychars.h +39 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/strfmon.c +101 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/strxfrm.c +18 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/towctrans_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/towlower_l.c +9 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/towupper_l.c +9 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll.c +16 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm.c +21 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wctrans_l.c +6 -0
- data/modules/emscripten/system/lib/libc/musl/src/locale/wctype_l.c +9 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/fwprintf.c +13 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/swprintf.c +14 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/vfwprintf.c +361 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/vswprintf.c +53 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/vwprintf.c +7 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdio/wprintf.c +13 -0
- data/modules/emscripten/system/lib/libcextra.symbols +44 -0
- data/modules/emscripten/system/lib/libcxx/exception.cpp +3 -3
- data/modules/emscripten/system/lib/libcxx/locale.cpp +12 -12
- data/modules/emscripten/system/lib/libcxxabi/src/cxa_new_delete.cpp +1 -1
- data/modules/emscripten/tools/asm_module.py +2 -0
- data/modules/emscripten/tools/autodebugger.py +3 -1
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +0 -4835
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +0 -6495
- data/modules/emscripten/tools/file_packager.py +53 -56
- data/modules/emscripten/tools/find_bigfuncs.py +2 -2
- data/modules/emscripten/tools/find_bigvars.py +24 -0
- data/modules/emscripten/tools/gen_struct_info.py +509 -0
- data/modules/emscripten/tools/gen_struct_info.pyc +0 -0
- data/modules/emscripten/tools/js-optimizer.js +177 -86
- data/modules/emscripten/tools/js_optimizer.py +54 -19
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.py +17 -7
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.py +2 -2
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/shared.py +257 -123
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/source-maps/sourcemapper.js +37 -6
- data/modules/emscripten/tools/tempfiles.py +1 -0
- data/modules/emscripten/tools/tempfiles.pyc +0 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-minlast-output.js +2 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-minlast.js +8 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +412 -169
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +88 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +311 -265
- data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +0 -20
- data/modules/emscripten/tools/test-js-optimizer-asm-pre.js +0 -21
- data/modules/emscripten/tools/test-js-optimizer-asm-regs.js +2 -2
- data/modules/emscripten/tools/test-js-optimizer-regs-output.js +8 -8
- data/modules/emscripten/tools/test-js-optimizer-regs.js +1 -1
- data/modules/emscripten/tools/validate_asmjs.py +82 -0
- data/modules/mruby/Rakefile +2 -2
- data/modules/mruby/include/mruby/class.h +2 -2
- data/modules/mruby/include/mruby/compile.h +12 -4
- data/modules/mruby/include/mruby/data.h +8 -3
- data/modules/mruby/include/mruby/debug.h +65 -0
- data/modules/mruby/include/mruby/dump.h +10 -2
- data/modules/mruby/include/mruby/irep.h +1 -0
- data/modules/mruby/include/mruby/string.h +2 -1
- data/modules/mruby/include/mruby/value.h +20 -13
- data/modules/mruby/include/mruby/variable.h +1 -0
- data/modules/mruby/include/mruby.h +5 -6
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +6 -4
- data/modules/mruby/mrbgems/mruby-math/src/math.c +4 -0
- data/modules/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/src/proc.c +1 -1
- data/modules/mruby/mrbgems/mruby-random/src/random.c +1 -4
- data/modules/mruby/mrbgems/mruby-string-ext/src/string.c +25 -16
- data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +4 -0
- data/modules/mruby/mrbgems/mruby-struct/src/struct.c +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +51 -0
- data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +22 -0
- data/modules/mruby/mrbgems/mruby-time/src/time.c +38 -60
- data/modules/mruby/mrblib/class.rb +2 -2
- data/modules/mruby/src/backtrace.c +96 -23
- data/modules/mruby/src/class.c +43 -41
- data/modules/mruby/src/codegen.c +52 -46
- data/modules/mruby/src/debug.c +214 -0
- data/modules/mruby/src/dump.c +245 -17
- data/modules/mruby/src/error.c +14 -6
- data/modules/mruby/src/etc.c +17 -10
- data/modules/mruby/src/gc.c +9 -9
- data/modules/mruby/src/kernel.c +1 -1
- data/modules/mruby/src/load.c +137 -1
- data/modules/mruby/src/object.c +1 -1
- data/modules/mruby/src/parse.y +162 -37
- data/modules/mruby/src/state.c +2 -0
- data/modules/mruby/src/string.c +28 -19
- data/modules/mruby/src/symbol.c +0 -1
- data/modules/mruby/src/variable.c +12 -15
- data/modules/mruby/src/vm.c +38 -22
- data/modules/mruby/tasks/mrbgem_spec.rake +6 -4
- data/modules/mruby/tasks/mrbgems_test.rake +9 -9
- data/modules/mruby/tasks/mruby_build_gem.rake +9 -0
- data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
- data/modules/mruby/test/driver.c +3 -3
- data/modules/mruby/test/t/array.rb +13 -0
- data/modules/mruby/test/t/class.rb +28 -0
- data/modules/mruby/test/t/exception.rb +10 -0
- data/modules/mruby/test/t/literals.rb +50 -0
- data/modules/mruby/test/t/module.rb +22 -0
- data/modules/mruby/test/t/proc.rb +37 -0
- data/modules/mruby/test/t/string.rb +20 -21
- data/modules/mruby/tools/mrbc/mrbc.c +2 -4
- data/scripts/gen_post.rb +1 -0
- data/scripts/gen_require.rb +107 -0
- data/templates/minimal/Rakefile +20 -0
- metadata +210 -88
- data/driver/main.c +0 -40
- data/modules/emscripten/cmake/Platform/Emscripten_unix.cmake +0 -24
- data/modules/emscripten/emlibtool +0 -11
- data/modules/emscripten/emlibtool.bat +0 -2
- data/modules/emscripten/src/framework.js +0 -257
- data/modules/emscripten/system/include/bsd/float.h +0 -91
- data/modules/emscripten/system/include/bsd/readme.txt +0 -2
- data/modules/emscripten/system/include/bsd/sys/mman.h +0 -180
- data/modules/emscripten/system/include/bsd/sys/utsname.h +0 -70
- data/modules/emscripten/system/include/dlfcn.h +0 -31
- data/modules/emscripten/system/include/err.h +0 -95
- data/modules/emscripten/system/include/features.h +0 -3
- data/modules/emscripten/system/include/libc/_ansi.h +0 -135
- data/modules/emscripten/system/include/libc/_syslist.h +0 -40
- data/modules/emscripten/system/include/libc/argz.h +0 -33
- data/modules/emscripten/system/include/libc/envlock.h +0 -15
- data/modules/emscripten/system/include/libc/envz.h +0 -16
- data/modules/emscripten/system/include/libc/fastmath.h +0 -13
- data/modules/emscripten/system/include/libc/ieeefp.h +0 -256
- data/modules/emscripten/system/include/libc/machine/_default_types.h +0 -121
- data/modules/emscripten/system/include/libc/machine/_types.h +0 -8
- data/modules/emscripten/system/include/libc/machine/ansi.h +0 -1
- data/modules/emscripten/system/include/libc/machine/endian.h +0 -31
- data/modules/emscripten/system/include/libc/machine/fastmath.h +0 -100
- data/modules/emscripten/system/include/libc/machine/ieeefp.h +0 -376
- data/modules/emscripten/system/include/libc/machine/malloc.h +0 -8
- data/modules/emscripten/system/include/libc/machine/param.h +0 -1
- data/modules/emscripten/system/include/libc/machine/setjmp-dj.h +0 -43
- data/modules/emscripten/system/include/libc/machine/setjmp.h +0 -361
- data/modules/emscripten/system/include/libc/machine/stdlib.h +0 -8
- data/modules/emscripten/system/include/libc/machine/termios.h +0 -1
- data/modules/emscripten/system/include/libc/machine/time.h +0 -19
- data/modules/emscripten/system/include/libc/machine/types.h +0 -30
- data/modules/emscripten/system/include/libc/newlib.h +0 -2
- data/modules/emscripten/system/include/libc/process.h +0 -44
- data/modules/emscripten/system/include/libc/reent.h +0 -183
- data/modules/emscripten/system/include/libc/regdef.h +0 -7
- data/modules/emscripten/system/include/libc/sys/_default_fcntl.h +0 -223
- data/modules/emscripten/system/include/libc/sys/_types.h +0 -93
- data/modules/emscripten/system/include/libc/sys/cdefs.h +0 -123
- data/modules/emscripten/system/include/libc/sys/config.h +0 -255
- data/modules/emscripten/system/include/libc/sys/custom_file.h +0 -2
- data/modules/emscripten/system/include/libc/sys/dirent.h +0 -58
- data/modules/emscripten/system/include/libc/sys/features.h +0 -212
- data/modules/emscripten/system/include/libc/sys/iconvnls.h +0 -77
- data/modules/emscripten/system/include/libc/sys/lock.h +0 -24
- data/modules/emscripten/system/include/libc/sys/queue.h +0 -471
- data/modules/emscripten/system/include/libc/sys/reent.h +0 -843
- data/modules/emscripten/system/include/libc/sys/sched.h +0 -67
- data/modules/emscripten/system/include/libc/sys/stdio.h +0 -27
- data/modules/emscripten/system/include/libc/sys/string.h +0 -2
- data/modules/emscripten/system/include/libc/sys/syslimits.h +0 -65
- data/modules/emscripten/system/include/libc/sys/unistd.h +0 -514
- data/modules/emscripten/system/include/libc/sys/utime.h +0 -26
- data/modules/emscripten/system/include/libc/unctrl.h +0 -46
- data/modules/emscripten/system/include/memory.h +0 -10
- data/modules/emscripten/system/include/mntent.h +0 -23
- data/modules/emscripten/system/include/net/arpa/inet.h +0 -32
- data/modules/emscripten/system/include/net/arpa/nameser.h +0 -535
- data/modules/emscripten/system/include/net/arpa/nameser_compat.h +0 -187
- data/modules/emscripten/system/include/net/if.h +0 -106
- data/modules/emscripten/system/include/net/netinet/in.h +0 -230
- data/modules/emscripten/system/include/net/netinet/tcp.h +0 -246
- data/modules/emscripten/system/include/net/resolv.h +0 -389
- data/modules/emscripten/system/include/netdb.h +0 -130
- data/modules/emscripten/system/include/nl_types.h +0 -19
- data/modules/emscripten/system/include/poll.h +0 -3
- data/modules/emscripten/system/include/pty.h +0 -6
- data/modules/emscripten/system/include/semaphore.h +0 -31
- data/modules/emscripten/system/include/spawn.h +0 -105
- data/modules/emscripten/system/include/stdbool.h +0 -16
- data/modules/emscripten/system/include/sys/bitypes.h +0 -3
- data/modules/emscripten/system/include/sys/io.h +0 -14
- data/modules/emscripten/system/include/sys/ioctl.h +0 -78
- data/modules/emscripten/system/include/sys/poll.h +0 -31
- data/modules/emscripten/system/include/sys/select.h +0 -16
- data/modules/emscripten/system/include/sys/sendfile.h +0 -16
- data/modules/emscripten/system/include/sys/socket.h +0 -247
- data/modules/emscripten/system/include/sys/socketvar.h +0 -3
- data/modules/emscripten/system/include/sys/statvfs.h +0 -32
- data/modules/emscripten/system/include/sys/uio.h +0 -22
- data/modules/emscripten/system/include/sys/un.h +0 -66
- data/modules/emscripten/system/include/sysexits.h +0 -108
- 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'] =
|
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
|
-
|
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
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
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
|
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:])
|
Binary file
|