summaryrefslogtreecommitdiff
path: root/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c
blob: a856319cfb652c0f883128327c420d463ed3783e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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);
}