Skip to content

Commit

Permalink
checking what is failing on Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
tagomoris committed Nov 28, 2023
1 parent bc3ecd3 commit 41592c1
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 9 deletions.
25 changes: 19 additions & 6 deletions ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c
@@ -1,5 +1,6 @@
#include <ruby.h>
#include "ruby/internal/intern/load.h"
#include <stdio.h>

VALUE (*rst_any_method)(VALUE);

Expand All @@ -14,21 +15,29 @@ rsr_any_method(VALUE klass)
VALUE
rsr_try_resolve_fname(VALUE klass)
{
rst_something_missing = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_missing", "rst_any_method");
int ret = 0;
char errmsg[100];
rst_something_missing = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_missing", "rst_any_method", &ret);
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");
snprintf(errmsg, sizeof(errmsg), "symbol not found: missing fname (%d)", ret);
rb_raise(rb_eLoadError, errmsg);
// rb_raise(rb_eLoadError, "symbol not found: missing fname");
}
return Qtrue;
}

VALUE
rsr_try_resolve_sname(VALUE klass)
{
rst_something_missing = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_something_missing");
int ret = 0;
char errmsg[100];
rst_something_missing = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_something_missing", &ret);
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");
snprintf(errmsg, sizeof(errmsg), "symbol not found: missing sname (%d)", ret);
rb_raise(rb_eLoadError, errmsg);
// rb_raise(rb_eLoadError, "symbol not found: missing sname");
}
return Qtrue;
}
Expand All @@ -37,12 +46,16 @@ void
Init_resolve_symbol_resolver(void)
{
VALUE mod = rb_define_module("ResolveSymbolResolver");
int ret = 0;
char errmsg[100];
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);

rst_any_method = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_any_method");
rst_any_method = (VALUE(*)(VALUE))rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_any_method", &ret);
if (rst_any_method == NULL) {
rb_raise(rb_eLoadError, "resolve_symbol_target is not loaded");
snprintf(errmsg, sizeof(errmsg), "resolve_symbol_target is not loaded: %d", ret);
// rb_raise(rb_eLoadError, "resolve_symbol_target is not loaded");
rb_raise(rb_eLoadError, errmsg);
}
}
3 changes: 2 additions & 1 deletion ext/-test-/load/stringify_symbols/stringify_symbols.c
Expand Up @@ -4,7 +4,8 @@
static VALUE
stringify_symbol(VALUE klass, VALUE fname, VALUE sname)
{
void *ptr = rb_ext_resolve_symbol(RSTRING_PTR(fname), RSTRING_PTR(sname));
int ret = 0;
void *ptr = rb_ext_resolve_symbol(RSTRING_PTR(fname), RSTRING_PTR(sname), &ret);
if (ptr == NULL) {
return Qnil;
}
Expand Down
2 changes: 1 addition & 1 deletion include/ruby/internal/intern/load.h
Expand Up @@ -187,7 +187,7 @@ VALUE rb_require_string(VALUE feature);
* feature. It may be NULL when the feature is not loaded, the
* feature was not extension, or the symbol was not found.
*/
void *rb_ext_resolve_symbol(const char *feature, const char *symbol);
void *rb_ext_resolve_symbol(const char *feature, const char *symbol, int *ret);

/**
* @name extension configuration
Expand Down
5 changes: 4 additions & 1 deletion load.c
Expand Up @@ -1522,7 +1522,7 @@ rb_f_autoload_p(int argc, VALUE *argv, VALUE obj)
}

void *
rb_ext_resolve_symbol(const char* fname, const char* symbol)
rb_ext_resolve_symbol(const char* fname, const char* symbol, int *ret)
{
VALUE handle;
VALUE resolved;
Expand All @@ -1539,14 +1539,17 @@ rb_ext_resolve_symbol(const char* fname, const char* symbol)
if (rb_feature_p(GET_VM(), fname, 0, FALSE, FALSE, 0)) {
return dln_symbol(NULL, symbol);
}
*ret = 1; // fname cannot be resolved
return NULL;
}
if (RARRAY_LEN(resolved) != 2 || rb_ary_entry(resolved, 0) != ID2SYM(rb_intern("so"))) {
*ret = 2; // fname is not an extension
return NULL;
}
path = rb_ary_entry(resolved, 1);
handle = rb_hash_lookup(ruby_dln_libmap, path);
if (NIL_P(handle)) {
*ret = 3; // fname is not loaded
return NULL;
}
return dln_symbol((void *)NUM2SVALUE(handle), symbol);
Expand Down

0 comments on commit 41592c1

Please sign in to comment.