diff options
Diffstat (limited to 'ext/-test-/load')
-rw-r--r-- | ext/-test-/load/dot.dot/depend | 4 | ||||
-rw-r--r-- | ext/-test-/load/protect/depend | 4 | ||||
-rw-r--r-- | ext/-test-/load/resolve_symbol_resolver/extconf.rb | 1 | ||||
-rw-r--r-- | ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c | 55 | ||||
-rw-r--r-- | ext/-test-/load/resolve_symbol_target/extconf.rb | 1 | ||||
-rw-r--r-- | ext/-test-/load/resolve_symbol_target/resolve_symbol_target.c | 15 | ||||
-rw-r--r-- | ext/-test-/load/resolve_symbol_target/resolve_symbol_target.h | 4 | ||||
-rw-r--r-- | ext/-test-/load/stringify_symbols/extconf.rb | 1 | ||||
-rw-r--r-- | ext/-test-/load/stringify_symbols/stringify_symbols.c | 29 | ||||
-rw-r--r-- | ext/-test-/load/stringify_target/extconf.rb | 1 | ||||
-rw-r--r-- | ext/-test-/load/stringify_target/stringify_target.c | 15 | ||||
-rw-r--r-- | ext/-test-/load/stringify_target/stringify_target.h | 4 |
12 files changed, 130 insertions, 4 deletions
diff --git a/ext/-test-/load/dot.dot/depend b/ext/-test-/load/dot.dot/depend index d8b8937c3c..f9be79e957 100644 --- a/ext/-test-/load/dot.dot/depend +++ b/ext/-test-/load/dot.dot/depend @@ -52,6 +52,7 @@ dot.dot.o: $(hdrdir)/ruby/internal/attr/noexcept.h dot.dot.o: $(hdrdir)/ruby/internal/attr/noinline.h dot.dot.o: $(hdrdir)/ruby/internal/attr/nonnull.h dot.dot.o: $(hdrdir)/ruby/internal/attr/noreturn.h +dot.dot.o: $(hdrdir)/ruby/internal/attr/packed_struct.h dot.dot.o: $(hdrdir)/ruby/internal/attr/pure.h dot.dot.o: $(hdrdir)/ruby/internal/attr/restrict.h dot.dot.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -111,7 +112,6 @@ dot.dot.o: $(hdrdir)/ruby/internal/intern/enumerator.h dot.dot.o: $(hdrdir)/ruby/internal/intern/error.h dot.dot.o: $(hdrdir)/ruby/internal/intern/eval.h dot.dot.o: $(hdrdir)/ruby/internal/intern/file.h -dot.dot.o: $(hdrdir)/ruby/internal/intern/gc.h dot.dot.o: $(hdrdir)/ruby/internal/intern/hash.h dot.dot.o: $(hdrdir)/ruby/internal/intern/io.h dot.dot.o: $(hdrdir)/ruby/internal/intern/load.h @@ -142,12 +142,12 @@ dot.dot.o: $(hdrdir)/ruby/internal/memory.h dot.dot.o: $(hdrdir)/ruby/internal/method.h dot.dot.o: $(hdrdir)/ruby/internal/module.h dot.dot.o: $(hdrdir)/ruby/internal/newobj.h -dot.dot.o: $(hdrdir)/ruby/internal/rgengc.h dot.dot.o: $(hdrdir)/ruby/internal/scan_args.h dot.dot.o: $(hdrdir)/ruby/internal/special_consts.h dot.dot.o: $(hdrdir)/ruby/internal/static_assert.h dot.dot.o: $(hdrdir)/ruby/internal/stdalign.h dot.dot.o: $(hdrdir)/ruby/internal/stdbool.h +dot.dot.o: $(hdrdir)/ruby/internal/stdckdint.h dot.dot.o: $(hdrdir)/ruby/internal/symbol.h dot.dot.o: $(hdrdir)/ruby/internal/value.h dot.dot.o: $(hdrdir)/ruby/internal/value_type.h diff --git a/ext/-test-/load/protect/depend b/ext/-test-/load/protect/depend index dd4ee71b62..324c17237a 100644 --- a/ext/-test-/load/protect/depend +++ b/ext/-test-/load/protect/depend @@ -52,6 +52,7 @@ protect.o: $(hdrdir)/ruby/internal/attr/noexcept.h protect.o: $(hdrdir)/ruby/internal/attr/noinline.h protect.o: $(hdrdir)/ruby/internal/attr/nonnull.h protect.o: $(hdrdir)/ruby/internal/attr/noreturn.h +protect.o: $(hdrdir)/ruby/internal/attr/packed_struct.h protect.o: $(hdrdir)/ruby/internal/attr/pure.h protect.o: $(hdrdir)/ruby/internal/attr/restrict.h protect.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -111,7 +112,6 @@ protect.o: $(hdrdir)/ruby/internal/intern/enumerator.h protect.o: $(hdrdir)/ruby/internal/intern/error.h protect.o: $(hdrdir)/ruby/internal/intern/eval.h protect.o: $(hdrdir)/ruby/internal/intern/file.h -protect.o: $(hdrdir)/ruby/internal/intern/gc.h protect.o: $(hdrdir)/ruby/internal/intern/hash.h protect.o: $(hdrdir)/ruby/internal/intern/io.h protect.o: $(hdrdir)/ruby/internal/intern/load.h @@ -142,12 +142,12 @@ protect.o: $(hdrdir)/ruby/internal/memory.h protect.o: $(hdrdir)/ruby/internal/method.h protect.o: $(hdrdir)/ruby/internal/module.h protect.o: $(hdrdir)/ruby/internal/newobj.h -protect.o: $(hdrdir)/ruby/internal/rgengc.h protect.o: $(hdrdir)/ruby/internal/scan_args.h protect.o: $(hdrdir)/ruby/internal/special_consts.h protect.o: $(hdrdir)/ruby/internal/static_assert.h protect.o: $(hdrdir)/ruby/internal/stdalign.h protect.o: $(hdrdir)/ruby/internal/stdbool.h +protect.o: $(hdrdir)/ruby/internal/stdckdint.h protect.o: $(hdrdir)/ruby/internal/symbol.h protect.o: $(hdrdir)/ruby/internal/value.h protect.o: $(hdrdir)/ruby/internal/value_type.h diff --git a/ext/-test-/load/resolve_symbol_resolver/extconf.rb b/ext/-test-/load/resolve_symbol_resolver/extconf.rb new file mode 100644 index 0000000000..2299efcfd3 --- /dev/null +++ b/ext/-test-/load/resolve_symbol_resolver/extconf.rb @@ -0,0 +1 @@ +create_makefile('-test-/load/resolve_symbol_resolver') diff --git a/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c new file mode 100644 index 0000000000..a856319cfb --- /dev/null +++ b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c @@ -0,0 +1,55 @@ +#include <ruby.h> +#include "ruby/internal/intern/load.h" + +typedef VALUE(*target_func)(VALUE); + +static target_func rst_any_method; + +VALUE +rsr_any_method(VALUE klass) +{ + return rst_any_method((VALUE)NULL); +} + +VALUE +rsr_try_resolve_fname(VALUE klass) +{ + target_func rst_something_missing = + (target_func) rb_ext_resolve_symbol("-test-/load/resolve_symbol_missing", "rst_any_method"); + if (rst_something_missing == NULL) { + // This should be done in Init_*, so the error is LoadError + rb_raise(rb_eLoadError, "symbol not found: missing fname"); + } + return Qtrue; +} + +VALUE +rsr_try_resolve_sname(VALUE klass) +{ + target_func rst_something_missing = + (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_something_missing"); + if (rst_something_missing == NULL) { + // This should be done in Init_*, so the error is LoadError + rb_raise(rb_eLoadError, "symbol not found: missing sname"); + } + return Qtrue; +} + +void +Init_resolve_symbol_resolver(void) +{ + /* + * Resolving symbols at the head of Init_ because it raises LoadError (in cases). + * If the module and methods are defined before raising LoadError, retrying `require "this.so"` will + * cause re-defining those methods (and will be warned). + */ + rst_any_method = (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_any_method"); + if (rst_any_method == NULL) { + rb_raise(rb_eLoadError, "resolve_symbol_target is not loaded"); + } + + VALUE mod = rb_define_module("ResolveSymbolResolver"); + rb_define_singleton_method(mod, "any_method", rsr_any_method, 0); + rb_define_singleton_method(mod, "try_resolve_fname", rsr_try_resolve_fname, 0); + rb_define_singleton_method(mod, "try_resolve_sname", rsr_try_resolve_sname, 0); +} diff --git a/ext/-test-/load/resolve_symbol_target/extconf.rb b/ext/-test-/load/resolve_symbol_target/extconf.rb new file mode 100644 index 0000000000..b5a99ca7f1 --- /dev/null +++ b/ext/-test-/load/resolve_symbol_target/extconf.rb @@ -0,0 +1 @@ +create_makefile('-test-/load/resolve_symbol_target') diff --git a/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.c b/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.c new file mode 100644 index 0000000000..b5bc9e8ee0 --- /dev/null +++ b/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.c @@ -0,0 +1,15 @@ +#include <ruby.h> +#include "resolve_symbol_target.h" + +VALUE +rst_any_method(VALUE klass) +{ + return rb_str_new_cstr("from target"); +} + +void +Init_resolve_symbol_target(void) +{ + VALUE mod = rb_define_module("ResolveSymbolTarget"); + rb_define_singleton_method(mod, "any_method", rst_any_method, 0); +} diff --git a/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.h b/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.h new file mode 100644 index 0000000000..847dcb7dd3 --- /dev/null +++ b/ext/-test-/load/resolve_symbol_target/resolve_symbol_target.h @@ -0,0 +1,4 @@ +#include <ruby.h> +#include "ruby/internal/dllexport.h" + +RUBY_FUNC_EXPORTED VALUE rst_any_method(VALUE); diff --git a/ext/-test-/load/stringify_symbols/extconf.rb b/ext/-test-/load/stringify_symbols/extconf.rb new file mode 100644 index 0000000000..ac39c15f09 --- /dev/null +++ b/ext/-test-/load/stringify_symbols/extconf.rb @@ -0,0 +1 @@ +create_makefile('-test-/load/stringify_symbols') diff --git a/ext/-test-/load/stringify_symbols/stringify_symbols.c b/ext/-test-/load/stringify_symbols/stringify_symbols.c new file mode 100644 index 0000000000..11a5ee3bc5 --- /dev/null +++ b/ext/-test-/load/stringify_symbols/stringify_symbols.c @@ -0,0 +1,29 @@ +#include <ruby.h> +#include "ruby/internal/intern/load.h" +#include "ruby/util.h" + +#if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG +# define UINTPTR2NUM ULL2NUM +#elif SIZEOF_INTPTR_T == SIZEOF_LONG +# define UINTPTR2NUM ULONG2NUM +#else +# define UINTPTR2NUM UINT2NUM +#endif + +static VALUE +stringify_symbol(VALUE klass, VALUE fname, VALUE sname) +{ + void *ptr = rb_ext_resolve_symbol(StringValueCStr(fname), StringValueCStr(sname)); + if (ptr == NULL) { + return Qnil; + } + uintptr_t uintptr = (uintptr_t)ptr; + return UINTPTR2NUM(uintptr); +} + +void +Init_stringify_symbols(void) +{ + VALUE mod = rb_define_module("StringifySymbols"); + rb_define_singleton_method(mod, "stringify_symbol", stringify_symbol, 2); +} diff --git a/ext/-test-/load/stringify_target/extconf.rb b/ext/-test-/load/stringify_target/extconf.rb new file mode 100644 index 0000000000..4aa201cb09 --- /dev/null +++ b/ext/-test-/load/stringify_target/extconf.rb @@ -0,0 +1 @@ +create_makefile('-test-/load/stringify_target') diff --git a/ext/-test-/load/stringify_target/stringify_target.c b/ext/-test-/load/stringify_target/stringify_target.c new file mode 100644 index 0000000000..ce09b8fd77 --- /dev/null +++ b/ext/-test-/load/stringify_target/stringify_target.c @@ -0,0 +1,15 @@ +#include <ruby.h> +#include "stringify_target.h" + +VALUE +stt_any_method(VALUE klass) +{ + return rb_str_new_cstr("from target"); +} + +void +Init_stringify_target(void) +{ + VALUE mod = rb_define_module("StringifyTarget"); + rb_define_singleton_method(mod, "any_method", stt_any_method, 0); +} diff --git a/ext/-test-/load/stringify_target/stringify_target.h b/ext/-test-/load/stringify_target/stringify_target.h new file mode 100644 index 0000000000..d95fb65d7c --- /dev/null +++ b/ext/-test-/load/stringify_target/stringify_target.h @@ -0,0 +1,4 @@ +#include <ruby.h> +#include "ruby/internal/dllexport.h" + +RUBY_FUNC_EXPORTED VALUE stt_any_method(VALUE); |