diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 86a8e27..98d4b04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,6 +36,16 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # 'bundle install' and cache + - run: env | sort + - run: | + cc -xc -E - < + foo(RTLD_LAZY, RTLD_NOW, RTLD_LOCAL, RTLD_GLOBAL); + EOF - name: Run test run: bundle exec rake compile test timeout-minutes: 5 + env: + TESTOPTS: "--verbose" + TRUFFLERUBYOPT: "--experimental-options --cexts-log-load" + MACOSX_DEPLOYMENT_TARGET: "11.0" diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index dc608ee..8556b48 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -2965,6 +2965,26 @@ gzfile_read_all(struct gzfile *gz) return gzfile_newstr(gz, dst); } +__attribute__((__noinline__)) +static VALUE +gzfile_getc_dummy_encoding(struct gzfile *gz) +{ + const unsigned char *ss, *sp, *se; + unsigned char *ds, *dp, *de; + VALUE cbuf = rb_enc_str_new(0, GZFILE_CBUF_CAPA, gz->enc); + + ss = sp = (const unsigned char*)RSTRING_PTR(gz->z.buf); + se = sp + ZSTREAM_BUF_FILLED(&gz->z); + ds = dp = (unsigned char *)RSTRING_PTR(cbuf); + de = (unsigned char *)ds + GZFILE_CBUF_CAPA; + (void)rb_econv_convert(gz->ec, &sp, se, &dp, de, ECONV_PARTIAL_INPUT|ECONV_AFTER_OUTPUT); + rb_econv_check_error(gz->ec); + VALUE dst = zstream_shift_buffer(&gz->z, sp - ss); + gzfile_calc_crc(gz, dst); + rb_str_resize(cbuf, dp - ds); + return cbuf; +} + static VALUE gzfile_getc(struct gzfile *gz) { @@ -2983,20 +3003,7 @@ gzfile_getc(struct gzfile *gz) } if (gz->ec && rb_enc_dummy_p(gz->enc2)) { - const unsigned char *ss, *sp, *se; - unsigned char *ds, *dp, *de; - VALUE cbuf = rb_enc_str_new(0, GZFILE_CBUF_CAPA, gz->enc); - - ss = sp = (const unsigned char*)RSTRING_PTR(gz->z.buf); - se = sp + ZSTREAM_BUF_FILLED(&gz->z); - ds = dp = (unsigned char *)RSTRING_PTR(cbuf); - de = (unsigned char *)ds + GZFILE_CBUF_CAPA; - (void)rb_econv_convert(gz->ec, &sp, se, &dp, de, ECONV_PARTIAL_INPUT|ECONV_AFTER_OUTPUT); - rb_econv_check_error(gz->ec); - dst = zstream_shift_buffer(&gz->z, sp - ss); - gzfile_calc_crc(gz, dst); - rb_str_resize(cbuf, dp - ds); - return cbuf; + return gzfile_getc_dummy_encoding(gz); } else { buf = gz->z.buf;