Remove Encoding#replicate

This commit is contained in:
Benoit Daloze 2023-01-06 15:07:39 +01:00
parent d831b1d5ce
commit 6abe20e87b
Notes: git 2023-01-11 12:42:09 +00:00
8 changed files with 203 additions and 113 deletions

View File

@ -1474,21 +1474,6 @@ assert_equal "#{N}#{N}", %Q{
}.map{|r| r.take}.join }.map{|r| r.take}.join
} }
# enc_table
assert_equal "100", %Q{
Ractor.new do
loop do
Encoding.find("test-enc-#{rand(5_000)}").inspect
rescue ArgumentError => e
end
end
src = Encoding.find("UTF-8")
100.times{|i|
src.replicate("test-enc-\#{i}")
}
}
# Generic ivtbl # Generic ivtbl
n = N/2 n = N/2
assert_equal "#{n}#{n}", %Q{ assert_equal "#{n}#{n}", %Q{

View File

@ -505,37 +505,6 @@ enc_replicate(struct enc_table *enc_table, const char *name, rb_encoding *encodi
return idx; return idx;
} }
int
rb_enc_replicate(const char *name, rb_encoding *encoding)
{
int r;
GLOBAL_ENC_TABLE_EVAL(enc_table,
r = enc_replicate(enc_table, name, encoding));
return r;
}
/*
* call-seq:
* enc.replicate(name) -> encoding
*
* Returns a replicated encoding of _enc_ whose name is _name_.
* The new encoding should have the same byte structure of _enc_.
* If _name_ is used by another encoding, raise ArgumentError.
*
*/
static VALUE
enc_replicate_m(VALUE encoding, VALUE name)
{
int idx;
rb_warn_deprecated_to_remove("3.3", "Encoding#replicate", "the original encoding");
idx = rb_enc_replicate(name_for_encoding(&name), rb_to_encoding(encoding));
RB_GC_GUARD(name);
return rb_enc_from_encoding_index(idx);
}
static int static int
enc_replicate_with_index(struct enc_table *enc_table, const char *name, rb_encoding *origenc, int idx) enc_replicate_with_index(struct enc_table *enc_table, const char *name, rb_encoding *origenc, int idx)
{ {
@ -1914,7 +1883,6 @@ Init_Encoding(void)
rb_define_method(rb_cEncoding, "names", enc_names, 0); rb_define_method(rb_cEncoding, "names", enc_names, 0);
rb_define_method(rb_cEncoding, "dummy?", enc_dummy_p, 0); rb_define_method(rb_cEncoding, "dummy?", enc_dummy_p, 0);
rb_define_method(rb_cEncoding, "ascii_compatible?", enc_ascii_compatible_p, 0); rb_define_method(rb_cEncoding, "ascii_compatible?", enc_ascii_compatible_p, 0);
rb_define_method(rb_cEncoding, "replicate", enc_replicate_m, 1);
rb_define_singleton_method(rb_cEncoding, "list", enc_list, 0); rb_define_singleton_method(rb_cEncoding, "list", enc_list, 0);
rb_define_singleton_method(rb_cEncoding, "name_list", rb_enc_name_list, 0); rb_define_singleton_method(rb_cEncoding, "name_list", rb_enc_name_list, 0);
rb_define_singleton_method(rb_cEncoding, "aliases", rb_enc_aliases, 0); rb_define_singleton_method(rb_cEncoding, "aliases", rb_enc_aliases, 0);

View File

@ -852,6 +852,178 @@ enc_associate.o: $(hdrdir)/ruby/ruby.h
enc_associate.o: $(hdrdir)/ruby/st.h enc_associate.o: $(hdrdir)/ruby/st.h
enc_associate.o: $(hdrdir)/ruby/subst.h enc_associate.o: $(hdrdir)/ruby/subst.h
enc_associate.o: enc_associate.c enc_associate.o: enc_associate.c
enc_dummy.o: $(RUBY_EXTCONF_H)
enc_dummy.o: $(arch_hdrdir)/ruby/config.h
enc_dummy.o: $(hdrdir)/ruby.h
enc_dummy.o: $(hdrdir)/ruby/assert.h
enc_dummy.o: $(hdrdir)/ruby/backward.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/assume.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/attributes.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/bool.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/inttypes.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/limits.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/long_long.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/stdalign.h
enc_dummy.o: $(hdrdir)/ruby/backward/2/stdarg.h
enc_dummy.o: $(hdrdir)/ruby/defines.h
enc_dummy.o: $(hdrdir)/ruby/encoding.h
enc_dummy.o: $(hdrdir)/ruby/intern.h
enc_dummy.o: $(hdrdir)/ruby/internal/abi.h
enc_dummy.o: $(hdrdir)/ruby/internal/anyargs.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/char.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/double.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/int.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/long.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/short.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
enc_dummy.o: $(hdrdir)/ruby/internal/assume.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/artificial.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/cold.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/const.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/constexpr.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/deprecated.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/error.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/forceinline.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/format.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/noalias.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/noexcept.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/noinline.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/nonnull.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/noreturn.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/pure.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/restrict.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/warning.h
enc_dummy.o: $(hdrdir)/ruby/internal/attr/weakref.h
enc_dummy.o: $(hdrdir)/ruby/internal/cast.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
enc_dummy.o: $(hdrdir)/ruby/internal/compiler_since.h
enc_dummy.o: $(hdrdir)/ruby/internal/config.h
enc_dummy.o: $(hdrdir)/ruby/internal/constant_p.h
enc_dummy.o: $(hdrdir)/ruby/internal/core.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rarray.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rbasic.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rbignum.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rclass.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rdata.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rfile.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rhash.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/robject.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rregexp.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rstring.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rstruct.h
enc_dummy.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
enc_dummy.o: $(hdrdir)/ruby/internal/ctype.h
enc_dummy.o: $(hdrdir)/ruby/internal/dllexport.h
enc_dummy.o: $(hdrdir)/ruby/internal/dosish.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/coderange.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/ctype.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/encoding.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/pathname.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/re.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/sprintf.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/string.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/symbol.h
enc_dummy.o: $(hdrdir)/ruby/internal/encoding/transcode.h
enc_dummy.o: $(hdrdir)/ruby/internal/error.h
enc_dummy.o: $(hdrdir)/ruby/internal/eval.h
enc_dummy.o: $(hdrdir)/ruby/internal/event.h
enc_dummy.o: $(hdrdir)/ruby/internal/fl_type.h
enc_dummy.o: $(hdrdir)/ruby/internal/gc.h
enc_dummy.o: $(hdrdir)/ruby/internal/glob.h
enc_dummy.o: $(hdrdir)/ruby/internal/globals.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/attribute.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/builtin.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/c_attribute.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/extension.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/feature.h
enc_dummy.o: $(hdrdir)/ruby/internal/has/warning.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/array.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/bignum.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/class.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/compar.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/complex.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/cont.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/dir.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/enum.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/enumerator.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/error.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/eval.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/file.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/gc.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/hash.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/io.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/load.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/marshal.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/numeric.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/object.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/parse.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/proc.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/process.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/random.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/range.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/rational.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/re.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/ruby.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/select.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/signal.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/sprintf.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/string.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/struct.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/thread.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/time.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/variable.h
enc_dummy.o: $(hdrdir)/ruby/internal/intern/vm.h
enc_dummy.o: $(hdrdir)/ruby/internal/interpreter.h
enc_dummy.o: $(hdrdir)/ruby/internal/iterator.h
enc_dummy.o: $(hdrdir)/ruby/internal/memory.h
enc_dummy.o: $(hdrdir)/ruby/internal/method.h
enc_dummy.o: $(hdrdir)/ruby/internal/module.h
enc_dummy.o: $(hdrdir)/ruby/internal/newobj.h
enc_dummy.o: $(hdrdir)/ruby/internal/rgengc.h
enc_dummy.o: $(hdrdir)/ruby/internal/scan_args.h
enc_dummy.o: $(hdrdir)/ruby/internal/special_consts.h
enc_dummy.o: $(hdrdir)/ruby/internal/static_assert.h
enc_dummy.o: $(hdrdir)/ruby/internal/stdalign.h
enc_dummy.o: $(hdrdir)/ruby/internal/stdbool.h
enc_dummy.o: $(hdrdir)/ruby/internal/symbol.h
enc_dummy.o: $(hdrdir)/ruby/internal/value.h
enc_dummy.o: $(hdrdir)/ruby/internal/value_type.h
enc_dummy.o: $(hdrdir)/ruby/internal/variable.h
enc_dummy.o: $(hdrdir)/ruby/internal/warning_push.h
enc_dummy.o: $(hdrdir)/ruby/internal/xmalloc.h
enc_dummy.o: $(hdrdir)/ruby/missing.h
enc_dummy.o: $(hdrdir)/ruby/onigmo.h
enc_dummy.o: $(hdrdir)/ruby/oniguruma.h
enc_dummy.o: $(hdrdir)/ruby/ruby.h
enc_dummy.o: $(hdrdir)/ruby/st.h
enc_dummy.o: $(hdrdir)/ruby/subst.h
enc_dummy.o: enc_dummy.c
enc_str_buf_cat.o: $(RUBY_EXTCONF_H) enc_str_buf_cat.o: $(RUBY_EXTCONF_H)
enc_str_buf_cat.o: $(arch_hdrdir)/ruby/config.h enc_str_buf_cat.o: $(arch_hdrdir)/ruby/config.h
enc_str_buf_cat.o: $(hdrdir)/ruby/assert.h enc_str_buf_cat.o: $(hdrdir)/ruby/assert.h

View File

@ -0,0 +1,15 @@
#include "ruby.h"
#include "ruby/encoding.h"
VALUE
bug_rb_define_dummy_encoding(VALUE self, VALUE name)
{
int idx = rb_define_dummy_encoding(RSTRING_PTR(name));
return rb_enc_from_encoding(rb_enc_from_index(idx));
}
void
Init_string_enc_dummy(VALUE klass)
{
rb_define_singleton_method(klass, "rb_define_dummy_encoding", bug_rb_define_dummy_encoding, 1);
}

View File

@ -138,23 +138,6 @@ RBIMPL_ATTR_NOALIAS()
*/ */
int rb_char_to_option_kcode(int c, int *option, int *kcode); int rb_char_to_option_kcode(int c, int *option, int *kcode);
/**
* Creates a new encoding, using the passed one as a template.
*
* @param[in] name Name of the creating encoding.
* @param[in] src Template.
* @exception rb_eArgError Duplicated or malformed `name`.
* @return Replicated new encoding's index.
* @post Encoding named `name` is created as a copy of `src`, whose index
* is the return value.
*
* @internal
*
* `name` can be `NULL`, but that just raises an exception. OTOH it seems no
* sanity check is done against `src`...?
*/
int rb_enc_replicate(const char *name, rb_encoding *src);
/** /**
* Creates a new "dummy" encoding. Roughly speaking, an encoding is dummy when * Creates a new "dummy" encoding. Roughly speaking, an encoding is dummy when
* it is stateful. Notable example of dummy encoding are those defined in * it is stateful. Notable example of dummy encoding are those defined in

View File

@ -67,7 +67,7 @@ describe "Encoding#replicate" do
end end
end end
ruby_version_is "3.4" do ruby_version_is "3.3" do
it "has been removed" do it "has been removed" do
Encoding::US_ASCII.should_not.respond_to?(:replicate, true) Encoding::US_ASCII.should_not.respond_to?(:replicate, true)
end end

View File

@ -0,0 +1,15 @@
# frozen_string_literal: false
require 'test/unit'
require "-test-/string"
class Test_TooManyDummyEncodings < Test::Unit::TestCase
def test_exceed_encoding_table_size
assert_separately(%w[--disable=gems], "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
require "-test-/string"
assert_raise_with_message(EncodingError, /too many encoding/) do
1_000.times{|i| Bug::String.rb_define_dummy_encoding("R_#{i}") } # now 256 entries
end
end;
end
end

View File

@ -55,40 +55,6 @@ class TestEncoding < Test::Unit::TestCase
assert_raise(TypeError, bug5150) {Encoding.find(1)} assert_raise(TypeError, bug5150) {Encoding.find(1)}
end end
def test_replicate
assert_separately([], "#{<<~'END;'}")
Warning[:deprecated] = false
assert_instance_of(Encoding, Encoding::UTF_8.replicate("UTF-8-ANOTHER#{Time.now.to_f}"))
assert_instance_of(Encoding, Encoding::ISO_2022_JP.replicate("ISO-2022-JP-ANOTHER#{Time.now.to_f}"))
bug3127 = '[ruby-dev:40954]'
assert_raise(TypeError, bug3127) {Encoding::UTF_8.replicate(0)}
assert_raise_with_message(ArgumentError, /\bNUL\b/, bug3127) {Encoding::UTF_8.replicate("\0")}
END;
end
def test_extra_encoding
assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
100.times {|i|
EnvUtil.suppress_warning { Encoding::UTF_8.replicate("dummy#{i}") }
}
e = Encoding.list.last
format = "%d".force_encoding(e)
assert_equal("0", format % 0)
assert_equal(e, format.dup.encoding)
assert_equal(e, (format*1).encoding)
assert_equal(e, (("x"*30).force_encoding(e)*1).encoding)
GC.start
name = "A" * 64
Encoding.list.each do |enc|
assert_raise(ArgumentError) { EnvUtil.suppress_warning { enc.replicate(name) } }
name.succ!
end
end;
end
def test_dummy_p def test_dummy_p
assert_equal(true, Encoding::ISO_2022_JP.dummy?) assert_equal(true, Encoding::ISO_2022_JP.dummy?)
assert_equal(false, Encoding::UTF_8.dummy?) assert_equal(false, Encoding::UTF_8.dummy?)
@ -160,18 +126,4 @@ class TestEncoding < Test::Unit::TestCase
end end
end; end;
end end
def test_exceed_encoding_table_size
assert_separately(%w[--disable=gems], "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
begin
enc = Encoding::UTF_8
1_000.times{|i| EnvUtil.suppress_warning{ enc.replicate("R_#{i}") } } # now 256 entries
rescue EncodingError => e
assert_match(/too many encoding/, e.message)
else
assert false
end
end;
end
end end