summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-11-30 15:19:49 +0900
committerGitHub <noreply@github.com>2020-11-30 15:19:49 +0900
commit555bd83a8e8b1e859f698089cbbd9ad938159a0e (patch)
treefb9ff23ae3bf790d9af16d76dae9baba95e1dd93
parent73a337e21461469290005f169c05bc1791112d67 (diff)
Raise when loading unprovided builtin function [Bug #17192]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3622 Merged-By: nobu <nobu@ruby-lang.org>
-rw-r--r--compile.c7
-rw-r--r--test/ruby/test_iseq.rb15
2 files changed, 18 insertions, 4 deletions
diff --git a/compile.c b/compile.c
index f6f5a1d848..0525c3ed87 100644
--- a/compile.c
+++ b/compile.c
@@ -10296,14 +10296,13 @@ ibf_load_builtin(const struct ibf_load *load, ibf_offset_t *offset)
const char *name = (char *)ibf_load_ptr(load, offset, len);
if (0) {
- for (int i=0; i<len; i++) fprintf(stderr, "%c", name[i]);
- fprintf(stderr, "!!\n");
+ fprintf(stderr, "%.*s!!\n", len, name);
}
const struct rb_builtin_function *table = GET_VM()->builtin_function_table;
- if (table == NULL) rb_bug("%s: table is not provided.", RUBY_FUNCTION_NAME_STRING);
+ if (table == NULL) rb_raise(rb_eArgError, "builtin function table is not provided");
if (strncmp(table[i].name, name, len) != 0) {
- rb_bug("%s: index (%d) mismatch (expect %s but %s).", RUBY_FUNCTION_NAME_STRING, i, name, table[i].name);
+ rb_raise(rb_eArgError, "builtin function index (%d) mismatch (expect %s but %s)", i, name, table[i].name);
}
// fprintf(stderr, "load-builtin: name:%s(%d)\n", table[i].name, table[i].argc);
diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb
index 78be07dc78..e3ca1ba926 100644
--- a/test/ruby/test_iseq.rb
+++ b/test/ruby/test_iseq.rb
@@ -590,6 +590,21 @@ class TestISeq < Test::Unit::TestCase
assert_equal([:func_ptr, :argc, :index, :name], invokebuiltin[1].keys)
end
+ def test_iseq_builtin_load
+ Tempfile.create(["builtin", ".iseq"]) do |f|
+ f.binmode
+ f.write(RubyVM::InstructionSequence.of(1.method(:abs)).to_binary)
+ f.close
+ assert_separately(["-", f.path], "#{<<~"begin;"}\n#{<<~'end;'}")
+ begin;
+ bin = File.binread(ARGV[0])
+ assert_raise(ArgumentError) do
+ RubyVM::InstructionSequence.load_from_binary(bin)
+ end
+ end;
+ end
+ end
+
def test_iseq_option_debug_level
assert_raise(TypeError) {ISeq.compile("", debug_level: "")}
assert_ruby_status([], "#{<<~"begin;"}\n#{<<~'end;'}")