diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15d483b858..9081338b3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,6 +73,9 @@ jobs: name: gem-${{ matrix.os }}-${{ matrix.ruby }} path: pkg/ + - run: echo 'TESTOPTS=-v --ignore-name=/unscan/' >> $GITHUB_ENV + if: ${{ startsWith(matrix.ruby, 'truffle') }} + - run: bundle exec rake test - run: gem install --verbose --backtrace pkg/*.gem @@ -80,5 +83,5 @@ jobs: - run: gem install test-unit-ruby-core test-unit - name: Run tests on the installed gem - run: ruby run-test.rb + run: ruby run-test.rb ${TESTOPTS} if: matrix.ruby != '2.4' # strscan is a default gem from 2.5 diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index 5a385c01e0..03a496ae50 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -83,21 +83,23 @@ public class RubyStringScanner extends RubyObject { public static RubyClass createScannerClass(final Ruby runtime) { RubyClass Object = runtime.getObject(); + ThreadContext context = runtime.getCurrentContext(); RubyClass scannerClass = runtime.defineClass("StringScanner", Object, RubyStringScanner::new); RubyClass standardError = runtime.getStandardError(); - RubyClass error = scannerClass.defineClassUnder("Error", standardError, standardError.getAllocator()); - if (!Object.isConstantDefined("ScanError")) { - Object.defineConstant("ScanError", error); + RubyClass error = scannerClass.defineClassUnder(context, "Error", standardError, standardError.getAllocator()); + if (!Object.isConstantDefined(context, "ScanError")) { + Object.defineConstant(context, "ScanError", error); + Object.deprecateConstant(context, "ScanError"); } RubyString version = runtime.newString(STRSCAN_VERSION); version.setFrozen(true); - scannerClass.setConstant("Version", version); + scannerClass.setConstant(context, "Version", version); RubyString id = runtime.newString("$Id$"); id.setFrozen(true); - scannerClass.setConstant("Id", id); + scannerClass.setConstant(context, "Id", id); scannerClass.defineAnnotatedMethods(RubyStringScanner.class); diff --git a/ext/strscan/extconf.rb b/ext/strscan/extconf.rb index 3c311d2364..d2e9343cbc 100644 --- a/ext/strscan/extconf.rb +++ b/ext/strscan/extconf.rb @@ -4,6 +4,7 @@ $INCFLAGS << " -I$(top_srcdir)" if $extmk have_func("onig_region_memsize(NULL)") have_func("rb_reg_onig_match", "ruby/re.h") + have_func("rb_deprecate_constant") create_makefile 'strscan' else File.write('Makefile', dummy_makefile("").join) diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index 93ba9da955..5cb14e88af 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -24,6 +24,14 @@ extern size_t onig_region_memsize(const struct re_registers *regs); #define STRSCAN_VERSION "3.1.6" + +#ifdef HAVE_RB_DEPRECATE_CONSTANT +/* In ruby 3.0, defined but exposed in external headers */ +extern void rb_deprecate_constant(VALUE mod, const char *name); +#else +# define rb_deprecate_constant(mod, name) ((void)0) +#endif + /* ======================================================================= Data Type Definitions ======================================================================= */ @@ -1604,7 +1612,7 @@ name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name (const unsigned char* )name_end, regs); if (num >= 1) { - return num; + return num; } } rb_enc_raise(enc, rb_eIndexError, "undefined group name reference: %.*s", @@ -2210,6 +2218,7 @@ Init_strscan(void) ScanError = rb_define_class_under(StringScanner, "Error", rb_eStandardError); if (!rb_const_defined(rb_cObject, id_scanerr)) { rb_const_set(rb_cObject, id_scanerr, ScanError); + rb_deprecate_constant(rb_cObject, "ScanError"); } tmp = rb_str_new2(STRSCAN_VERSION); rb_obj_freeze(tmp); diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 085a911313..8218e5b6be 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -875,7 +875,7 @@ def test_unscan assert_equal({}, s.named_captures) assert_equal("te", s.scan(/../)) assert_equal(nil, s.scan(/\d/)) - assert_raise(ScanError) { s.unscan } + assert_raise(StringScanner::Error) { s.unscan } end def test_rest