ffi 1.17.0 → 1.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +3 -1
- data/Rakefile +2 -2
- data/ext/ffi_c/Function.c +52 -34
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +48 -60
- data/ext/ffi_c/libffi/Makefile.am +4 -3
- data/ext/ffi_c/libffi/Makefile.in +5 -25
- data/ext/ffi_c/libffi/README.md +19 -2
- data/ext/ffi_c/libffi/acinclude.m4 +6 -0
- data/ext/ffi_c/libffi/config.guess +80 -22
- data/ext/ffi_c/libffi/config.sub +161 -80
- data/ext/ffi_c/libffi/configure +41 -25
- data/ext/ffi_c/libffi/configure.ac +9 -8
- data/ext/ffi_c/libffi/configure.host +0 -5
- data/ext/ffi_c/libffi/doc/Makefile.in +1 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +3 -3
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +1 -0
- data/ext/ffi_c/libffi/include/ffi_cfi.h +2 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +17 -0
- data/ext/ffi_c/libffi/man/Makefile.in +1 -0
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +7 -4
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +2 -2
- data/ext/ffi_c/libffi/src/aarch64/internal.h +63 -17
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +16 -12
- data/ext/ffi_c/libffi/src/arc/arcompact.S +2 -2
- data/ext/ffi_c/libffi/src/arc/ffi.c +6 -2
- data/ext/ffi_c/libffi/src/closures.c +3 -3
- data/ext/ffi_c/libffi/src/dlmalloc.c +1 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +2 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +4 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +4 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +13 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +26 -19
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +26 -16
- data/ext/ffi_c/libffi/src/powerpc/internal.h +10 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +47 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +24 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +1 -4
- data/ext/ffi_c/libffi/src/s390/ffi.c +28 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +38 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +16 -0
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +10 -262
- data/ext/ffi_c/libffi/src/x86/ffi.c +4 -1
- data/ext/ffi_c/libffi/src/x86/ffi64.c +4 -1
- data/ext/ffi_c/libffi/testsuite/Makefile.am +4 -3
- data/ext/ffi_c/libffi/testsuite/Makefile.in +5 -3
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +4 -24
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +8 -25
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +3 -28
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/overread.c +54 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_int_float.c +88 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/x32.c +31 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +1 -1
- data/lib/ffi/ffi.rb +59 -0
- data/lib/ffi/version.rb +1 -1
- data/sig/ffi/auto_pointer.rbs +0 -1
- data/sig/ffi/library.rbs +1 -1
- data.tar.gz.sig +0 -0
- metadata +18 -18
- metadata.gz.sig +0 -0
- data/ext/ffi_c/libffi/.circleci/config.yml +0 -156
- data/ext/ffi_c/libffi/src/nios2/ffi.c +0 -304
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +0 -52
- data/ext/ffi_c/libffi/src/nios2/sysv.S +0 -136
| @@ -41,28 +41,7 @@ | |
| 41 41 |  | 
| 42 42 | 
             
            #define EM_JS_MACROS(ret, name, args, body...) EM_JS(ret, name, args, body)
         | 
| 43 43 |  | 
| 44 | 
            -
            #if WASM_BIGINT
         | 
| 45 44 | 
             
            EM_JS_DEPS(libffi, "$getWasmTableEntry,$setWasmTableEntry,$getEmptyTableSlot,$convertJsFunctionToWasm");
         | 
| 46 | 
            -
            #define CALL_FUNCTION_POINTER(ptr, args...) \
         | 
| 47 | 
            -
              (LOG_DEBUG("CALL_FUNC_PTR", ptr, args),   \
         | 
| 48 | 
            -
              getWasmTableEntry(ptr).apply(null, args))
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            #define JS_FUNCTION_TO_WASM convertJsFunctionToWasm
         | 
| 51 | 
            -
            #else
         | 
| 52 | 
            -
            EM_JS_DEPS(libffi, "$getWasmTableEntry,$setWasmTableEntry,$getEmptyTableSlot,$convertJsFunctionToWasm,$dynCall,$generateFuncType,$uleb128Encode");
         | 
| 53 | 
            -
            #define CALL_FUNCTION_POINTER(ptr, args...)     \
         | 
| 54 | 
            -
              (LOG_DEBUG("CALL_FUNC_PTR", sig, ptr, args),  \
         | 
| 55 | 
            -
              dynCall(sig, ptr, args))
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            #define JS_FUNCTION_TO_WASM createLegalizerWrapper
         | 
| 58 | 
            -
            #endif
         | 
| 59 | 
            -
             | 
| 60 | 
            -
            // Signature calculations are not needed if WASM_BIGINT is present.
         | 
| 61 | 
            -
            #if WASM_BIGINT
         | 
| 62 | 
            -
            #define SIG(sig)
         | 
| 63 | 
            -
            #else
         | 
| 64 | 
            -
            #define SIG(sig) sig
         | 
| 65 | 
            -
            #endif
         | 
| 66 45 |  | 
| 67 46 | 
             
            #define DEREF_U8(addr, offset) HEAPU8[addr + offset]
         | 
| 68 47 | 
             
            #define DEREF_S8(addr, offset) HEAP8[addr + offset]
         | 
| @@ -73,12 +52,7 @@ EM_JS_DEPS(libffi, "$getWasmTableEntry,$setWasmTableEntry,$getEmptyTableSlot,$co | |
| 73 52 |  | 
| 74 53 | 
             
            #define DEREF_F32(addr, offset) HEAPF32[(addr >> 2) + offset]
         | 
| 75 54 | 
             
            #define DEREF_F64(addr, offset) HEAPF64[(addr >> 3) + offset]
         | 
| 76 | 
            -
             | 
| 77 | 
            -
            #if WASM_BIGINT
         | 
| 78 | 
            -
            // We have HEAPU64 in this case.
         | 
| 79 55 | 
             
            #define DEREF_U64(addr, offset) HEAPU64[(addr >> 3) + offset]
         | 
| 80 | 
            -
            #endif
         | 
| 81 | 
            -
             | 
| 82 56 |  | 
| 83 57 | 
             
            #define CHECK_FIELD_OFFSET(struct, field, offset)                                  \
         | 
| 84 58 | 
             
              _Static_assert(                                                                  \
         | 
| @@ -235,40 +209,6 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 235 209 | 
             
                ret_by_arg = true;
         | 
| 236 210 | 
             
              }
         | 
| 237 211 |  | 
| 238 | 
            -
              SIG(var sig = "");
         | 
| 239 | 
            -
             | 
| 240 | 
            -
            #if !WASM_BIGINT
         | 
| 241 | 
            -
              switch(rtype_id) {
         | 
| 242 | 
            -
              case FFI_TYPE_VOID:
         | 
| 243 | 
            -
                SIG(sig = 'v');
         | 
| 244 | 
            -
                break;
         | 
| 245 | 
            -
              case FFI_TYPE_STRUCT:
         | 
| 246 | 
            -
              case FFI_TYPE_LONGDOUBLE:
         | 
| 247 | 
            -
                SIG(sig = 'vi');
         | 
| 248 | 
            -
                break;
         | 
| 249 | 
            -
              case FFI_TYPE_INT:
         | 
| 250 | 
            -
              case FFI_TYPE_UINT8:
         | 
| 251 | 
            -
              case FFI_TYPE_SINT8:
         | 
| 252 | 
            -
              case FFI_TYPE_UINT16:
         | 
| 253 | 
            -
              case FFI_TYPE_SINT16:
         | 
| 254 | 
            -
              case FFI_TYPE_UINT32:
         | 
| 255 | 
            -
              case FFI_TYPE_SINT32:
         | 
| 256 | 
            -
              case FFI_TYPE_POINTER:
         | 
| 257 | 
            -
                SIG(sig = 'i');
         | 
| 258 | 
            -
                break;
         | 
| 259 | 
            -
              case FFI_TYPE_FLOAT:
         | 
| 260 | 
            -
                SIG(sig = 'f');
         | 
| 261 | 
            -
                break;
         | 
| 262 | 
            -
              case FFI_TYPE_DOUBLE:
         | 
| 263 | 
            -
                SIG(sig = 'd');
         | 
| 264 | 
            -
                break;
         | 
| 265 | 
            -
              case FFI_TYPE_UINT64:
         | 
| 266 | 
            -
              case FFI_TYPE_SINT64:
         | 
| 267 | 
            -
                SIG(sig = 'j');
         | 
| 268 | 
            -
                break;
         | 
| 269 | 
            -
              }
         | 
| 270 | 
            -
            #endif
         | 
| 271 | 
            -
             | 
| 272 212 | 
             
              // Accumulate a Javascript list of arguments for the Javascript wrapper for
         | 
| 273 213 | 
             
              // the wasm function. The Javascript wrapper does a type conversion from
         | 
| 274 214 | 
             
              // Javascript to C automatically, here we manually do the inverse conversion
         | 
| @@ -288,54 +228,33 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 288 228 | 
             
                case FFI_TYPE_UINT32:
         | 
| 289 229 | 
             
                case FFI_TYPE_POINTER:
         | 
| 290 230 | 
             
                  args.push(DEREF_U32(arg_ptr, 0));
         | 
| 291 | 
            -
                  SIG(sig += 'i');
         | 
| 292 231 | 
             
                  break;
         | 
| 293 232 | 
             
                case FFI_TYPE_FLOAT:
         | 
| 294 233 | 
             
                  args.push(DEREF_F32(arg_ptr, 0));
         | 
| 295 | 
            -
                  SIG(sig += 'f');
         | 
| 296 234 | 
             
                  break;
         | 
| 297 235 | 
             
                case FFI_TYPE_DOUBLE:
         | 
| 298 236 | 
             
                  args.push(DEREF_F64(arg_ptr, 0));
         | 
| 299 | 
            -
                  SIG(sig += 'd');
         | 
| 300 237 | 
             
                  break;
         | 
| 301 238 | 
             
                case FFI_TYPE_UINT8:
         | 
| 302 239 | 
             
                  args.push(DEREF_U8(arg_ptr, 0));
         | 
| 303 | 
            -
                  SIG(sig += 'i');
         | 
| 304 240 | 
             
                  break;
         | 
| 305 241 | 
             
                case FFI_TYPE_SINT8:
         | 
| 306 242 | 
             
                  args.push(DEREF_S8(arg_ptr, 0));
         | 
| 307 | 
            -
                  SIG(sig += 'i');
         | 
| 308 243 | 
             
                  break;
         | 
| 309 244 | 
             
                case FFI_TYPE_UINT16:
         | 
| 310 245 | 
             
                  args.push(DEREF_U16(arg_ptr, 0));
         | 
| 311 | 
            -
                  SIG(sig += 'i');
         | 
| 312 246 | 
             
                  break;
         | 
| 313 247 | 
             
                case FFI_TYPE_SINT16:
         | 
| 314 248 | 
             
                  args.push(DEREF_S16(arg_ptr, 0));
         | 
| 315 | 
            -
                  SIG(sig += 'i');
         | 
| 316 249 | 
             
                  break;
         | 
| 317 250 | 
             
                case FFI_TYPE_UINT64:
         | 
| 318 251 | 
             
                case FFI_TYPE_SINT64:
         | 
| 319 | 
            -
                  #if WASM_BIGINT
         | 
| 320 252 | 
             
                  args.push(DEREF_U64(arg_ptr, 0));
         | 
| 321 | 
            -
                  #else
         | 
| 322 | 
            -
                  args.push(DEREF_U32(arg_ptr, 0));
         | 
| 323 | 
            -
                  args.push(DEREF_U32(arg_ptr, 1));
         | 
| 324 | 
            -
                  #endif
         | 
| 325 | 
            -
                  SIG(sig += 'j');
         | 
| 326 253 | 
             
                  break;
         | 
| 327 254 | 
             
                case FFI_TYPE_LONGDOUBLE:
         | 
| 328 255 | 
             
                  // long double is passed as a pair of BigInts.
         | 
| 329 | 
            -
                  #if WASM_BIGINT
         | 
| 330 256 | 
             
                  args.push(DEREF_U64(arg_ptr, 0));
         | 
| 331 257 | 
             
                  args.push(DEREF_U64(arg_ptr, 1));
         | 
| 332 | 
            -
                  #else
         | 
| 333 | 
            -
                  args.push(DEREF_U32(arg_ptr, 0));
         | 
| 334 | 
            -
                  args.push(DEREF_U32(arg_ptr, 1));
         | 
| 335 | 
            -
                  args.push(DEREF_U32(arg_ptr, 2));
         | 
| 336 | 
            -
                  args.push(DEREF_U32(arg_ptr, 3));
         | 
| 337 | 
            -
                  #endif
         | 
| 338 | 
            -
                  SIG(sig += "jj");
         | 
| 339 258 | 
             
                  break;
         | 
| 340 259 | 
             
                case FFI_TYPE_STRUCT:
         | 
| 341 260 | 
             
                  // Nontrivial structs are passed by pointer.
         | 
| @@ -346,7 +265,6 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 346 265 | 
             
                  STACK_ALLOC(cur_stack_ptr, size, align);
         | 
| 347 266 | 
             
                  HEAP8.subarray(cur_stack_ptr, cur_stack_ptr+size).set(HEAP8.subarray(arg_ptr, arg_ptr + size));
         | 
| 348 267 | 
             
                  args.push(cur_stack_ptr);
         | 
| 349 | 
            -
                  SIG(sig += 'i');
         | 
| 350 268 | 
             
                  break;
         | 
| 351 269 | 
             
                case FFI_TYPE_COMPLEX:
         | 
| 352 270 | 
             
                  throw new Error('complex marshalling nyi');
         | 
| @@ -365,7 +283,6 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 365 283 | 
             
              // just always copy extra nonsense past the end. The ownwards call will know
         | 
| 366 284 | 
             
              // not to look at it.
         | 
| 367 285 | 
             
              if (nfixedargs != nargs) {
         | 
| 368 | 
            -
                SIG(sig += 'i');
         | 
| 369 286 | 
             
                var struct_arg_info = [];
         | 
| 370 287 | 
             
                for (var i = nargs - 1;  i >= nfixedargs; i--) {
         | 
| 371 288 | 
             
                  var arg_ptr = DEREF_U32(avalue, i);
         | 
| @@ -434,7 +351,8 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 434 351 | 
             
              }
         | 
| 435 352 | 
             
              stackRestore(cur_stack_ptr);
         | 
| 436 353 | 
             
              stackAlloc(0); // stackAlloc enforces alignment invariants on the stack pointer
         | 
| 437 | 
            -
               | 
| 354 | 
            +
              LOG_DEBUG("CALL_FUNC_PTR", "fn:", fn, "args:", args);
         | 
| 355 | 
            +
              var result = getWasmTableEntry(fn).apply(null, args);
         | 
| 438 356 | 
             
              // Put the stack pointer back (we moved it if there were any struct args or we
         | 
| 439 357 | 
             
              // made a varargs call)
         | 
| 440 358 | 
             
              stackRestore(orig_stack_ptr);
         | 
| @@ -472,12 +390,7 @@ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue), | |
| 472 390 | 
             
                break;
         | 
| 473 391 | 
             
              case FFI_TYPE_UINT64:
         | 
| 474 392 | 
             
              case FFI_TYPE_SINT64:
         | 
| 475 | 
            -
                #if WASM_BIGINT
         | 
| 476 393 | 
             
                DEREF_U64(rvalue, 0) = result;
         | 
| 477 | 
            -
                #else
         | 
| 478 | 
            -
                DEREF_U32(rvalue, 0) = result;
         | 
| 479 | 
            -
                DEREF_U32(rvalue, 1) = getTempRet0();
         | 
| 480 | 
            -
                #endif
         | 
| 481 394 | 
             
                break;
         | 
| 482 395 | 
             
              case FFI_TYPE_COMPLEX:
         | 
| 483 396 | 
             
                throw new Error('complex ret marshalling nyi');
         | 
| @@ -524,146 +437,6 @@ ffi_closure_free(void *closure) { | |
| 524 437 | 
             
              return ffi_closure_free_js(closure);
         | 
| 525 438 | 
             
            }
         | 
| 526 439 |  | 
| 527 | 
            -
            #if !WASM_BIGINT
         | 
| 528 | 
            -
             | 
| 529 | 
            -
            // When !WASM_BIGINT, we assume there is no JS bigint integration, so JavaScript
         | 
| 530 | 
            -
            // functions cannot take 64 bit integer arguments.
         | 
| 531 | 
            -
            //
         | 
| 532 | 
            -
            // We need to make our own wasm legalizer adaptor that splits 64 bit integer
         | 
| 533 | 
            -
            // arguments and then calls the JavaScript trampoline, then the JavaScript
         | 
| 534 | 
            -
            // trampoline reassembles them, calls the closure, then splits the result (if
         | 
| 535 | 
            -
            // it's a 64 bit integer) and the adaptor puts it back together.
         | 
| 536 | 
            -
            //
         | 
| 537 | 
            -
            // This is basically the reverse of the Emscripten function
         | 
| 538 | 
            -
            // createDyncallWrapper.
         | 
| 539 | 
            -
            EM_JS(void, createLegalizerWrapper, (int trampoline, int sig), {
         | 
| 540 | 
            -
              if(!sig.includes("j")) {
         | 
| 541 | 
            -
                return convertJsFunctionToWasm(trampoline, sig);
         | 
| 542 | 
            -
              }
         | 
| 543 | 
            -
              var sections = [];
         | 
| 544 | 
            -
              var prelude = [
         | 
| 545 | 
            -
                0x00, 0x61, 0x73, 0x6d, // magic ("\0asm")
         | 
| 546 | 
            -
                0x01, 0x00, 0x00, 0x00, // version: 1
         | 
| 547 | 
            -
              ];
         | 
| 548 | 
            -
              sections.push(prelude);
         | 
| 549 | 
            -
              var wrappersig = [
         | 
| 550 | 
            -
                // if return type is j, we will put the upper 32 bits into tempRet0.
         | 
| 551 | 
            -
                sig[0].replace("j", "i"),
         | 
| 552 | 
            -
                // in the rest of the argument list, one 64 bit integer is legalized into
         | 
| 553 | 
            -
                // two 32 bit integers.
         | 
| 554 | 
            -
                sig.slice(1).replace(/j/g, "ii"),
         | 
| 555 | 
            -
              ].join("");
         | 
| 556 | 
            -
             | 
| 557 | 
            -
              var typeSectionBody = [
         | 
| 558 | 
            -
                0x03, // number of types = 3
         | 
| 559 | 
            -
              ];
         | 
| 560 | 
            -
              generateFuncType(wrappersig, typeSectionBody); // The signature of the wrapper we are generating
         | 
| 561 | 
            -
              generateFuncType(sig, typeSectionBody); // the signature of the function pointer we will call
         | 
| 562 | 
            -
              generateFuncType("i", typeSectionBody); // the signature of getTempRet0
         | 
| 563 | 
            -
             | 
| 564 | 
            -
              var typeSection = [0x01 /* Type section code */];
         | 
| 565 | 
            -
              uleb128Encode(typeSectionBody.length, typeSection); // length of section in bytes
         | 
| 566 | 
            -
              typeSection.push.apply(typeSection, typeSectionBody);
         | 
| 567 | 
            -
              sections.push(typeSection);
         | 
| 568 | 
            -
             | 
| 569 | 
            -
              var importSection = [
         | 
| 570 | 
            -
                0x02, // import section code
         | 
| 571 | 
            -
                0x0d, // length of section in bytes
         | 
| 572 | 
            -
                0x02, // number of imports = 2
         | 
| 573 | 
            -
                // Import the getTempRet0 function, which we will call "r"
         | 
| 574 | 
            -
                0x01, 0x65, // name "e"
         | 
| 575 | 
            -
                0x01, 0x72, // name "r"
         | 
| 576 | 
            -
                0x00, // importing a function
         | 
| 577 | 
            -
                0x02, // type 2 = () -> i32
         | 
| 578 | 
            -
                // Import the wrapped function, which we will call "f"
         | 
| 579 | 
            -
                0x01, 0x65, // name "e"
         | 
| 580 | 
            -
                0x01, 0x66, // name "f"
         | 
| 581 | 
            -
                0x00, // importing a function
         | 
| 582 | 
            -
                0x00, // type 0 = wrappersig
         | 
| 583 | 
            -
              ];
         | 
| 584 | 
            -
              sections.push(importSection);
         | 
| 585 | 
            -
             | 
| 586 | 
            -
              var functionSection = [
         | 
| 587 | 
            -
                0x03, // function section code
         | 
| 588 | 
            -
                0x02, // length of section in bytes
         | 
| 589 | 
            -
                0x01, // number of functions = 1
         | 
| 590 | 
            -
                0x01, // type 1 = sig
         | 
| 591 | 
            -
              ];
         | 
| 592 | 
            -
              sections.push(functionSection);
         | 
| 593 | 
            -
             | 
| 594 | 
            -
              var exportSection = [
         | 
| 595 | 
            -
                0x07, // export section code
         | 
| 596 | 
            -
                0x05, // length of section in bytes
         | 
| 597 | 
            -
                0x01, // One export
         | 
| 598 | 
            -
                0x01, 0x66, // name "f"
         | 
| 599 | 
            -
                0x00, // type: function
         | 
| 600 | 
            -
                0x02, // function index 2 = the wrapper function
         | 
| 601 | 
            -
              ];
         | 
| 602 | 
            -
              sections.push(exportSection);
         | 
| 603 | 
            -
             | 
| 604 | 
            -
              var convert_code = [];
         | 
| 605 | 
            -
              convert_code.push(0x00); // no local variables (except the arguments)
         | 
| 606 | 
            -
             | 
| 607 | 
            -
              function localGet(j) {
         | 
| 608 | 
            -
                convert_code.push(0x20); // local.get
         | 
| 609 | 
            -
                uleb128Encode(j, convert_code);
         | 
| 610 | 
            -
              }
         | 
| 611 | 
            -
             | 
| 612 | 
            -
              for (var i = 1; i < sig.length; i++) {
         | 
| 613 | 
            -
                if (sig[i] == "j") {
         | 
| 614 | 
            -
                  localGet(i - 1);
         | 
| 615 | 
            -
                  convert_code.push(
         | 
| 616 | 
            -
                    0xa7 // i32.wrap_i64
         | 
| 617 | 
            -
                  );
         | 
| 618 | 
            -
                  localGet(i - 1);
         | 
| 619 | 
            -
                  convert_code.push(
         | 
| 620 | 
            -
                    0x42, 0x20, // i64.const 32
         | 
| 621 | 
            -
                    0x88,       // i64.shr_u
         | 
| 622 | 
            -
                    0xa7        // i32.wrap_i64
         | 
| 623 | 
            -
                  );
         | 
| 624 | 
            -
                } else {
         | 
| 625 | 
            -
                  localGet(i - 1);
         | 
| 626 | 
            -
                }
         | 
| 627 | 
            -
              }
         | 
| 628 | 
            -
              convert_code.push(
         | 
| 629 | 
            -
                0x10, 0x01 // call f
         | 
| 630 | 
            -
              );
         | 
| 631 | 
            -
              if (sig[0] === "j") {
         | 
| 632 | 
            -
                // Need to reassemble a 64 bit integer. Lower 32 bits is on stack. Upper 32
         | 
| 633 | 
            -
                // bits we get from getTempRet0
         | 
| 634 | 
            -
                convert_code.push(
         | 
| 635 | 
            -
                  0xad,       // i64.extend_i32_unsigned
         | 
| 636 | 
            -
                  0x10, 0x00, // Call function 0 (r = getTempRet0)
         | 
| 637 | 
            -
                  // join lower 32 bits and upper 32 bits
         | 
| 638 | 
            -
                  0xac,       // i64.extend_i32_signed
         | 
| 639 | 
            -
                  0x42, 0x20, // i64.const 32
         | 
| 640 | 
            -
                  0x86,       // i64.shl,
         | 
| 641 | 
            -
                  0x84        // i64.or
         | 
| 642 | 
            -
                );
         | 
| 643 | 
            -
              }
         | 
| 644 | 
            -
              convert_code.push(0x0b); // end
         | 
| 645 | 
            -
             | 
| 646 | 
            -
              var codeBody = [0x01]; // one code
         | 
| 647 | 
            -
              uleb128Encode(convert_code.length, codeBody);
         | 
| 648 | 
            -
              codeBody.push.apply(codeBody, convert_code);
         | 
| 649 | 
            -
              var codeSection = [0x0a /* Code section code */];
         | 
| 650 | 
            -
              uleb128Encode(codeBody.length, codeSection);
         | 
| 651 | 
            -
              codeSection.push.apply(codeSection, codeBody);
         | 
| 652 | 
            -
              sections.push(codeSection);
         | 
| 653 | 
            -
             | 
| 654 | 
            -
              var bytes = new Uint8Array([].concat.apply([], sections));
         | 
| 655 | 
            -
              // We can compile this wasm module synchronously because it is small.
         | 
| 656 | 
            -
              var module = new WebAssembly.Module(bytes);
         | 
| 657 | 
            -
              var instance = new WebAssembly.Instance(module, {
         | 
| 658 | 
            -
                e: {
         | 
| 659 | 
            -
                  r: getTempRet0,
         | 
| 660 | 
            -
                  f: trampoline,
         | 
| 661 | 
            -
                },
         | 
| 662 | 
            -
              });
         | 
| 663 | 
            -
              return instance.exports.f;
         | 
| 664 | 
            -
            });
         | 
| 665 | 
            -
            #endif
         | 
| 666 | 
            -
             | 
| 667 440 | 
             
            EM_JS_MACROS(
         | 
| 668 441 | 
             
            ffi_status,
         | 
| 669 442 | 
             
            ffi_prep_closure_loc_js,
         | 
| @@ -759,9 +532,9 @@ ffi_prep_closure_loc_js, | |
| 759 532 | 
             
              }
         | 
| 760 533 | 
             
              if (nfixedargs < nargs) {
         | 
| 761 534 | 
             
                // extra pointer to varargs stack
         | 
| 762 | 
            -
                sig +=  | 
| 535 | 
            +
                sig += 'i';
         | 
| 763 536 | 
             
              }
         | 
| 764 | 
            -
              LOG_DEBUG("CREATE_CLOSURE", | 
| 537 | 
            +
              LOG_DEBUG("CREATE_CLOSURE", "sig:", sig);
         | 
| 765 538 | 
             
              function trampoline() {
         | 
| 766 539 | 
             
                var args = Array.prototype.slice.call(arguments);
         | 
| 767 540 | 
             
                var size = 0;
         | 
| @@ -838,32 +611,14 @@ ffi_prep_closure_loc_js, | |
| 838 611 | 
             
                  case FFI_TYPE_SINT64:
         | 
| 839 612 | 
             
                    STACK_ALLOC(cur_ptr, 8, 8);
         | 
| 840 613 | 
             
                    DEREF_U32(args_ptr, carg_idx) = cur_ptr;
         | 
| 841 | 
            -
                    #if WASM_BIGINT
         | 
| 842 614 | 
             
                    DEREF_U64(cur_ptr, 0) = cur_arg;
         | 
| 843 | 
            -
                    #else
         | 
| 844 | 
            -
                    // Bigint arg was split by legalizer adaptor
         | 
| 845 | 
            -
                    DEREF_U32(cur_ptr, 0) = cur_arg;
         | 
| 846 | 
            -
                    cur_arg = args[jsarg_idx++];
         | 
| 847 | 
            -
                    DEREF_U32(cur_ptr, 1) = cur_arg;
         | 
| 848 | 
            -
                    #endif
         | 
| 849 615 | 
             
                    break;
         | 
| 850 616 | 
             
                  case FFI_TYPE_LONGDOUBLE:
         | 
| 851 617 | 
             
                    STACK_ALLOC(cur_ptr, 16, 8);
         | 
| 852 618 | 
             
                    DEREF_U32(args_ptr, carg_idx) = cur_ptr;
         | 
| 853 | 
            -
                    #if WASM_BIGINT
         | 
| 854 619 | 
             
                    DEREF_U64(cur_ptr, 0) = cur_arg;
         | 
| 855 620 | 
             
                    cur_arg = args[jsarg_idx++];
         | 
| 856 621 | 
             
                    DEREF_U64(cur_ptr, 1) = cur_arg;
         | 
| 857 | 
            -
                    #else
         | 
| 858 | 
            -
                    // Was split by legalizer adaptor
         | 
| 859 | 
            -
                    DEREF_U32(cur_ptr, 0) = cur_arg;
         | 
| 860 | 
            -
                    cur_arg = args[jsarg_idx++];
         | 
| 861 | 
            -
                    DEREF_U32(cur_ptr, 1) = cur_arg;
         | 
| 862 | 
            -
                    cur_arg = args[jsarg_idx++];
         | 
| 863 | 
            -
                    DEREF_U32(cur_ptr, 2) = cur_arg;
         | 
| 864 | 
            -
                    cur_arg = args[jsarg_idx++];
         | 
| 865 | 
            -
                    DEREF_U32(cur_ptr, 3) = cur_arg;
         | 
| 866 | 
            -
                    #endif
         | 
| 867 622 | 
             
                    break;
         | 
| 868 623 | 
             
                  }
         | 
| 869 624 | 
             
                }
         | 
| @@ -895,7 +650,7 @@ ffi_prep_closure_loc_js, | |
| 895 650 | 
             
                }
         | 
| 896 651 | 
             
                stackRestore(cur_ptr);
         | 
| 897 652 | 
             
                stackAlloc(0); // stackAlloc enforces alignment invariants on the stack pointer
         | 
| 898 | 
            -
                LOG_DEBUG("CALL_CLOSURE", | 
| 653 | 
            +
                LOG_DEBUG("CALL_CLOSURE", "closure:", closure, "fptr", CLOSURE__fun(closure), "cif", CLOSURE__cif(closure));
         | 
| 899 654 | 
             
                getWasmTableEntry(CLOSURE__fun(closure))(
         | 
| 900 655 | 
             
                    CLOSURE__cif(closure), ret_ptr, args_ptr,
         | 
| 901 656 | 
             
                    CLOSURE__user_data(closure)
         | 
| @@ -905,26 +660,19 @@ ffi_prep_closure_loc_js, | |
| 905 660 | 
             
                // If we aren't supposed to return by argument, figure out what to return.
         | 
| 906 661 | 
             
                if (!ret_by_arg) {
         | 
| 907 662 | 
             
                  switch (sig[0]) {
         | 
| 908 | 
            -
                  case  | 
| 663 | 
            +
                  case 'i':
         | 
| 909 664 | 
             
                    return DEREF_U32(ret_ptr, 0);
         | 
| 910 | 
            -
                  case  | 
| 911 | 
            -
                    #if WASM_BIGINT
         | 
| 665 | 
            +
                  case 'j':
         | 
| 912 666 | 
             
                    return DEREF_U64(ret_ptr, 0);
         | 
| 913 | 
            -
             | 
| 914 | 
            -
                    // Split the return i64, set the upper 32 bits into tempRet0 and return
         | 
| 915 | 
            -
                    // the lower 32 bits.
         | 
| 916 | 
            -
                    setTempRet0(DEREF_U32(ret_ptr, 1));
         | 
| 917 | 
            -
                    return DEREF_U32(ret_ptr, 0);
         | 
| 918 | 
            -
                    #endif
         | 
| 919 | 
            -
                  case "d":
         | 
| 667 | 
            +
                  case 'd':
         | 
| 920 668 | 
             
                    return DEREF_F64(ret_ptr, 0);
         | 
| 921 | 
            -
                  case  | 
| 669 | 
            +
                  case 'f':
         | 
| 922 670 | 
             
                    return DEREF_F32(ret_ptr, 0);
         | 
| 923 671 | 
             
                  }
         | 
| 924 672 | 
             
                }
         | 
| 925 673 | 
             
              }
         | 
| 926 674 | 
             
              try {
         | 
| 927 | 
            -
                var wasm_trampoline =  | 
| 675 | 
            +
                var wasm_trampoline = convertJsFunctionToWasm(trampoline, sig);
         | 
| 928 676 | 
             
              } catch(e) {
         | 
| 929 677 | 
             
                return FFI_BAD_TYPEDEF_MACRO;
         | 
| 930 678 | 
             
              }
         | 
| @@ -118,7 +118,7 @@ ffi_prep_cif_machdep(ffi_cif *cif) | |
| 118 118 | 
             
                  break;
         | 
| 119 119 | 
             
                case FFI_TYPE_STRUCT:
         | 
| 120 120 | 
             
                  {
         | 
| 121 | 
            -
            # | 
| 121 | 
            +
            #if defined(X86_WIN32) || defined(X86_DARWIN)
         | 
| 122 122 | 
             
                    size_t size = cif->rtype->size;
         | 
| 123 123 | 
             
                    if (size == 1)
         | 
| 124 124 | 
             
                      flags = X86_RET_STRUCT_1B;
         | 
| @@ -270,6 +270,9 @@ extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_ | |
| 270 270 | 
             
            #if defined(_MSC_VER)
         | 
| 271 271 | 
             
            #pragma runtime_checks("s", off)
         | 
| 272 272 | 
             
            #endif
         | 
| 273 | 
            +
            /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
         | 
| 274 | 
            +
               _as its own stack_ - so we need to compile this function without ASAN */
         | 
| 275 | 
            +
            FFI_ASAN_NO_SANITIZE
         | 
| 273 276 | 
             
            static void
         | 
| 274 277 | 
             
            ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
         | 
| 275 278 | 
             
            	      void **avalue, void *closure)
         | 
| @@ -557,6 +557,9 @@ ffi_prep_cif_machdep (ffi_cif *cif) | |
| 557 557 | 
             
              return FFI_OK;
         | 
| 558 558 | 
             
            }
         | 
| 559 559 |  | 
| 560 | 
            +
            /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
         | 
| 561 | 
            +
               _as its own stack_ - so we need to compile this function without ASAN */
         | 
| 562 | 
            +
            FFI_ASAN_NO_SANITIZE
         | 
| 560 563 | 
             
            static void
         | 
| 561 564 | 
             
            ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
         | 
| 562 565 | 
             
            	      void **avalue, void *closure)
         | 
| @@ -651,7 +654,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, | |
| 651 654 | 
             
            		      break;
         | 
| 652 655 | 
             
            		    default:
         | 
| 653 656 | 
             
            		      reg_args->gpr[gprcount] = 0;
         | 
| 654 | 
            -
            		      memcpy (®_args->gpr[gprcount], a, size);
         | 
| 657 | 
            +
            		      memcpy (®_args->gpr[gprcount], a, size <= 8 ? size : 8);
         | 
| 655 658 | 
             
            		    }
         | 
| 656 659 | 
             
            		  gprcount++;
         | 
| 657 660 | 
             
            		  break;
         | 
| @@ -17,8 +17,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \ | |
| 17 17 | 
             
            	libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
         | 
| 18 18 | 
             
            	libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
         | 
| 19 19 | 
             
            	libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
         | 
| 20 | 
            -
            	libffi.call/negint.c libffi.call/offsets.c libffi.call/ | 
| 21 | 
            -
            	libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
         | 
| 20 | 
            +
            	libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
         | 
| 21 | 
            +
            	libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
         | 
| 22 22 | 
             
            	libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
         | 
| 23 23 | 
             
            	libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
         | 
| 24 24 | 
             
            	libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
         | 
| @@ -31,10 +31,11 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \ | |
| 31 31 | 
             
            	libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
         | 
| 32 32 | 
             
            	libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
         | 
| 33 33 | 
             
            	libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
         | 
| 34 | 
            +
            	libffi.call/struct_int_float.c \
         | 
| 34 35 | 
             
            	libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
         | 
| 35 36 | 
             
            	libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
         | 
| 36 37 | 
             
            	libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
         | 
| 37 | 
            -
            	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c \
         | 
| 38 | 
            +
            	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
         | 
| 38 39 | 
             
            	libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
         | 
| 39 40 | 
             
            	libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
         | 
| 40 41 | 
             
            	libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
         | 
| @@ -232,6 +232,7 @@ ac_ct_AR = @ac_ct_AR@ | |
| 232 232 | 
             
            ac_ct_CC = @ac_ct_CC@
         | 
| 233 233 | 
             
            ac_ct_CXX = @ac_ct_CXX@
         | 
| 234 234 | 
             
            ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
         | 
| 235 | 
            +
            ac_ct_READELF = @ac_ct_READELF@
         | 
| 235 236 | 
             
            am__include = @am__include@
         | 
| 236 237 | 
             
            am__leading_dot = @am__leading_dot@
         | 
| 237 238 | 
             
            am__quote = @am__quote@
         | 
| @@ -301,8 +302,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \ | |
| 301 302 | 
             
            	libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
         | 
| 302 303 | 
             
            	libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
         | 
| 303 304 | 
             
            	libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
         | 
| 304 | 
            -
            	libffi.call/negint.c libffi.call/offsets.c libffi.call/ | 
| 305 | 
            -
            	libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
         | 
| 305 | 
            +
            	libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
         | 
| 306 | 
            +
            	libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
         | 
| 306 307 | 
             
            	libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
         | 
| 307 308 | 
             
            	libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
         | 
| 308 309 | 
             
            	libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
         | 
| @@ -315,10 +316,11 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \ | |
| 315 316 | 
             
            	libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
         | 
| 316 317 | 
             
            	libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
         | 
| 317 318 | 
             
            	libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
         | 
| 319 | 
            +
            	libffi.call/struct_int_float.c \
         | 
| 318 320 | 
             
            	libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
         | 
| 319 321 | 
             
            	libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
         | 
| 320 322 | 
             
            	libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
         | 
| 321 | 
            -
            	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c \
         | 
| 323 | 
            +
            	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
         | 
| 322 324 | 
             
            	libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
         | 
| 323 325 | 
             
            	libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
         | 
| 324 326 | 
             
            	libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #!/usr/bin/env bash
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            if [  | 
| 4 | 
            -
              echo " | 
| 2 | 
            +
             | 
| 3 | 
            +
            if ! [ -x "$(command -v emcc)" ]; then
         | 
| 4 | 
            +
              echo "Error: emcc could not be found." >&2
         | 
| 5 5 | 
             
              exit 1
         | 
| 6 6 | 
             
            fi
         | 
| 7 7 |  | 
| @@ -10,19 +10,6 @@ set -e | |
| 10 10 | 
             
            cd "$1"
         | 
| 11 11 | 
             
            shift
         | 
| 12 12 |  | 
| 13 | 
            -
            # Parse arguments
         | 
| 14 | 
            -
            while [ $# -gt 0 ]; do
         | 
| 15 | 
            -
              case $1 in
         | 
| 16 | 
            -
              --wasm-bigint) WASM_BIGINT=true ;;
         | 
| 17 | 
            -
              *)
         | 
| 18 | 
            -
                echo "ERROR: Unknown parameter: $1" >&2
         | 
| 19 | 
            -
                exit 1
         | 
| 20 | 
            -
                ;;
         | 
| 21 | 
            -
              esac
         | 
| 22 | 
            -
              shift
         | 
| 23 | 
            -
            done
         | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 13 | 
             
            export CFLAGS="-fPIC -O2 -I../../target/include $EXTRA_CFLAGS"
         | 
| 27 14 | 
             
            export CXXFLAGS="$CFLAGS -sNO_DISABLE_EXCEPTION_CATCHING $EXTRA_CXXFLAGS"
         | 
| 28 15 | 
             
            export LDFLAGS=" \
         | 
| @@ -31,17 +18,10 @@ export LDFLAGS=" \ | |
| 31 18 | 
             
                -sMODULARIZE \
         | 
| 32 19 | 
             
                -sMAIN_MODULE \
         | 
| 33 20 | 
             
                -sNO_DISABLE_EXCEPTION_CATCHING \
         | 
| 21 | 
            +
                -sWASM_BIGINT \
         | 
| 34 22 | 
             
                $EXTRA_LD_FLAGS \
         | 
| 35 23 | 
             
            "
         | 
| 36 24 |  | 
| 37 | 
            -
            # This needs to test false if there exists an environment variable called
         | 
| 38 | 
            -
            # WASM_BIGINT whose contents are empty. Don't use +x.
         | 
| 39 | 
            -
            if [ -n "${WASM_BIGINT}" ] ; then
         | 
| 40 | 
            -
              export LDFLAGS+=" -sWASM_BIGINT"
         | 
| 41 | 
            -
            else
         | 
| 42 | 
            -
              export LDFLAGS+=" -sEXPORTED_RUNTIME_METHODS='getTempRet0,setTempRet0'"
         | 
| 43 | 
            -
            fi
         | 
| 44 | 
            -
             | 
| 45 25 | 
             
            # Rename main functions to test__filename so we can link them together
         | 
| 46 26 | 
             
            ls *c | sed 's!\(.*\)\.c!sed -i "s/main/test__\1/g" \0!g' | bash
         | 
| 47 27 |  | 
| @@ -1,8 +1,9 @@ | |
| 1 1 | 
             
            #!/usr/bin/env bash
         | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 2 | 
            +
             | 
| 3 | 
            +
            if ! [ -x "$(command -v emcc)" ]; then
         | 
| 4 | 
            +
              echo "Error: emcc could not be found." >&2
         | 
| 4 5 | 
             
              exit 1
         | 
| 5 | 
            -
             | 
| 6 | 
            +
            fi
         | 
| 6 7 |  | 
| 7 8 | 
             
            set -e
         | 
| 8 9 |  | 
| @@ -13,38 +14,20 @@ TARGET=$SOURCE_DIR/target | |
| 13 14 | 
             
            mkdir -p "$TARGET"
         | 
| 14 15 |  | 
| 15 16 | 
             
            # Define default arguments
         | 
| 16 | 
            -
             | 
| 17 | 
            -
            # JS BigInt to Wasm i64 integration, disabled by default
         | 
| 18 | 
            -
            # This needs to test false if there exists an environment variable called
         | 
| 19 | 
            -
            # WASM_BIGINT whose contents are empty. Don't use +x.
         | 
| 20 | 
            -
            if [ -n "${WASM_BIGINT}" ]; then
         | 
| 21 | 
            -
              WASM_BIGINT=true
         | 
| 22 | 
            -
            else
         | 
| 23 | 
            -
              WASM_BIGINT=false
         | 
| 24 | 
            -
            fi
         | 
| 17 | 
            +
            DEBUG=false
         | 
| 25 18 |  | 
| 26 19 | 
             
            # Parse arguments
         | 
| 27 20 | 
             
            while [ $# -gt 0 ]; do
         | 
| 28 21 | 
             
              case $1 in
         | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
              *)
         | 
| 32 | 
            -
                echo "ERROR: Unknown parameter: $1" >&2
         | 
| 33 | 
            -
                exit 1
         | 
| 34 | 
            -
                ;;
         | 
| 22 | 
            +
                --debug) DEBUG=true ;;
         | 
| 23 | 
            +
                *) echo "ERROR: Unknown parameter: $1" >&2; exit 1 ;;
         | 
| 35 24 | 
             
              esac
         | 
| 36 25 | 
             
              shift
         | 
| 37 26 | 
             
            done
         | 
| 38 27 |  | 
| 39 28 | 
             
            # Common compiler flags
         | 
| 40 29 | 
             
            export CFLAGS="-O3 -fPIC"
         | 
| 41 | 
            -
            if [ "$ | 
| 42 | 
            -
              # We need to detect WASM_BIGINT support at compile time
         | 
| 43 | 
            -
              export CFLAGS+=" -DWASM_BIGINT"
         | 
| 44 | 
            -
            fi
         | 
| 45 | 
            -
            if [ "$DEBUG" = "true" ]; then
         | 
| 46 | 
            -
              export CFLAGS+=" -DDEBUG_F"
         | 
| 47 | 
            -
            fi
         | 
| 30 | 
            +
            if [ "$DEBUG" = "true" ]; then export CFLAGS+=" -DDEBUG_F"; fi
         | 
| 48 31 | 
             
            export CXXFLAGS="$CFLAGS"
         | 
| 49 32 |  | 
| 50 33 | 
             
            # Build paths
         | 
| @@ -1,39 +1,14 @@ | |
| 1 1 | 
             
            #!/bin/bash
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
            emcc_exists="$(command -v emcc)"
         | 
| 7 | 
            -
            if [ ! "${emcc_exists}" ]; then
         | 
| 8 | 
            -
              echo "Emscripten not on path"
         | 
| 3 | 
            +
            if ! [ -x "$(command -v emcc)" ]; then
         | 
| 4 | 
            +
              echo "Error: emcc could not be found." >&2
         | 
| 9 5 | 
             
              exit 1
         | 
| 10 6 | 
             
            fi
         | 
| 11 7 |  | 
| 12 | 
            -
            # Parse arguments
         | 
| 13 | 
            -
            while [ $# -gt 0 ]; do
         | 
| 14 | 
            -
              case $1 in
         | 
| 15 | 
            -
              --wasm-bigint) WASM_BIGINT=true ;;
         | 
| 16 | 
            -
              *)
         | 
| 17 | 
            -
                echo "ERROR: Unknown parameter: $1" >&2
         | 
| 18 | 
            -
                exit 1
         | 
| 19 | 
            -
                ;;
         | 
| 20 | 
            -
              esac
         | 
| 21 | 
            -
              shift
         | 
| 22 | 
            -
            done
         | 
| 23 | 
            -
             | 
| 24 8 | 
             
            # Common compiler flags
         | 
| 25 9 | 
             
            export CFLAGS="-fPIC $EXTRA_CFLAGS"
         | 
| 26 | 
            -
            if [ "$WASM_BIGINT" = "true" ]; then
         | 
| 27 | 
            -
              # We need to detect WASM_BIGINT support at compile time
         | 
| 28 | 
            -
              export CFLAGS+=" -DWASM_BIGINT"
         | 
| 29 | 
            -
            fi
         | 
| 30 10 | 
             
            export CXXFLAGS="$CFLAGS -sNO_DISABLE_EXCEPTION_CATCHING $EXTRA_CXXFLAGS"
         | 
| 31 | 
            -
            export LDFLAGS="-sEXPORTED_FUNCTIONS=_main,_malloc,_free -sALLOW_TABLE_GROWTH -sASSERTIONS -sNO_DISABLE_EXCEPTION_CATCHING"
         | 
| 32 | 
            -
            if [ "$WASM_BIGINT" = "true" ]; then
         | 
| 33 | 
            -
              export LDFLAGS+=" -sWASM_BIGINT"
         | 
| 34 | 
            -
            else
         | 
| 35 | 
            -
              export LDFLAGS+=" -sEXPORTED_RUNTIME_METHODS='getTempRet0,setTempRet0'"
         | 
| 36 | 
            -
            fi
         | 
| 11 | 
            +
            export LDFLAGS="-sEXPORTED_FUNCTIONS=_main,_malloc,_free -sALLOW_TABLE_GROWTH -sASSERTIONS -sNO_DISABLE_EXCEPTION_CATCHING -sWASM_BIGINT"
         | 
| 37 12 |  | 
| 38 13 | 
             
            # Specific variables for cross-compilation
         | 
| 39 14 | 
             
            export CHOST="wasm32-unknown-linux" # wasm32-unknown-emscripten
         |