gvars 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +21 -4
- data/ext/gvars/extconf.rb +5 -0
- data/ext/gvars/gvars.c +125 -0
- data/lib/gvars/version.rb +2 -2
- data/lib/gvars.rb +1 -5
- data/sig/gvars.rbs +17 -1
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2ad79094c679e0044908f36687249abd41da98b4df01c1528a03c7832fd2fb6f
|
|
4
|
+
data.tar.gz: d49eaba2f5462f1d6cdd10610e8c27b1207b64258ff84a624ef936309db124e7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3350ee1b36efea744b2bb63c9b5da0dad533172348b998dc17a78fc7e2905de5703283390949cc7eb117d5bf727289f66c32ffc206987be7e61ee857b612696e
|
|
7
|
+
data.tar.gz: 356f099483a5bda93da5ae6da01a71887f86dcf81974818cb1fa225447a0c6f354eb0ab3bcc62754cc24140b5fbcf5ce57a054201aa00abc52f6e4586d4cd271
|
data/Rakefile
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rake/extensiontask'
|
|
5
|
+
require 'minitest/test_task'
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
task default: [:compile]
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Rake::ExtensionTask.new('gvars') do |ext|
|
|
10
|
+
ext.lib_dir = 'lib/gvars'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Minitest::TestTask.create
|
|
14
|
+
|
|
15
|
+
# task default: :test
|
|
16
|
+
|
|
17
|
+
desc 'clean compiled files'
|
|
18
|
+
task :clean do
|
|
19
|
+
require 'fileutils'
|
|
20
|
+
FileUtils.rm_rf 'ext/gvars/Makefile'
|
|
21
|
+
FileUtils.rm_rf 'ext/gvars/gvars.so'
|
|
22
|
+
FileUtils.rm_rf 'ext/gvars/gvars.bundle'
|
|
23
|
+
FileUtils.rm_rf 'lib/gvars/gvars.so'
|
|
24
|
+
FileUtils.rm_rf 'lib/gvars/gvars.bundle'
|
|
25
|
+
end
|
data/ext/gvars/gvars.c
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#include "ruby.h"
|
|
2
|
+
|
|
3
|
+
static VALUE
|
|
4
|
+
gvars_global_variable_get(VALUE self, VALUE name)
|
|
5
|
+
{
|
|
6
|
+
if (RB_SYMBOL_P(name)) name = rb_sym2str(name);
|
|
7
|
+
return rb_gv_get(StringValueCStr(name));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
static VALUE
|
|
11
|
+
gvars_global_variable_set(VALUE self, VALUE name, VALUE value)
|
|
12
|
+
{
|
|
13
|
+
if (RB_SYMBOL_P(name)) name = rb_sym2str(name);
|
|
14
|
+
return rb_gv_set(StringValueCStr(name), value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static VALUE
|
|
18
|
+
gvars_global_variable_defined_p(VALUE self, VALUE name)
|
|
19
|
+
{
|
|
20
|
+
extern VALUE rb_gvar_defined(ID);
|
|
21
|
+
return rb_gvar_defined(rb_check_id(&name));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static VALUE
|
|
25
|
+
gvars_global_variables(VALUE self)
|
|
26
|
+
{
|
|
27
|
+
return rb_f_global_variables();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static VALUE
|
|
31
|
+
gvars_alias_global_variable(VALUE self, VALUE new, VALUE old)
|
|
32
|
+
{
|
|
33
|
+
if (RB_SYMBOL_P(new)) new = rb_sym2str(new);
|
|
34
|
+
if (RB_SYMBOL_P(old)) old = rb_sym2str(old);
|
|
35
|
+
|
|
36
|
+
// ID newid = rb_intern_str(new);
|
|
37
|
+
// ID newid = rb_check_id(&new);
|
|
38
|
+
// ID oldid = rb_check_id(&old);
|
|
39
|
+
|
|
40
|
+
rb_alias_variable(rb_intern_str(new), rb_intern_str(old));
|
|
41
|
+
return new;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
struct hooked_var {
|
|
45
|
+
VALUE getter, setter;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
static VALUE hooked_var_getter(ID id, VALUE *data) {
|
|
49
|
+
struct hooked_var *bv = (struct hooked_var *)data;
|
|
50
|
+
return rb_proc_call_kw(bv->getter, rb_ary_new3(1, rb_id2str(id)), RB_NO_KEYWORDS);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static void hooked_var_setter(VALUE val, ID id, VALUE *data) {
|
|
54
|
+
struct hooked_var *bv = (struct hooked_var *)data;
|
|
55
|
+
rb_proc_call_kw(bv->setter, rb_ary_new3(2, rb_id2str(id), val), RB_NO_KEYWORDS);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static VALUE
|
|
59
|
+
gvars_define_virtual_global(int argc, VALUE *argv, VALUE self)
|
|
60
|
+
{
|
|
61
|
+
VALUE name, getter, setter;
|
|
62
|
+
|
|
63
|
+
switch (rb_scan_args(argc, argv, "12", &name, &getter, &setter)) {
|
|
64
|
+
case 1: getter = (rb_need_block(), rb_block_proc());
|
|
65
|
+
case 2: setter = Qnil;
|
|
66
|
+
case 3: break;
|
|
67
|
+
default: rb_bug("oops");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const char *name_str = rb_id2name(rb_check_id(&name));
|
|
71
|
+
|
|
72
|
+
VALUE getter_proc, setter_proc;
|
|
73
|
+
|
|
74
|
+
getter_proc = rb_convert_type(getter, T_DATA, "Proc", "to_proc");
|
|
75
|
+
if (NIL_P(getter_proc) || !rb_obj_is_proc(getter_proc)) {
|
|
76
|
+
rb_raise(rb_eTypeError, "wrong getter type %s (expected Proc)", rb_obj_classname(getter_proc));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (NIL_P(setter)) {
|
|
80
|
+
setter_proc = Qnil;
|
|
81
|
+
} else {
|
|
82
|
+
setter_proc = rb_convert_type(setter, T_DATA, "Proc", "to_proc");
|
|
83
|
+
if (NIL_P(setter_proc) || !rb_obj_is_proc(setter_proc)) {
|
|
84
|
+
rb_raise(rb_eTypeError, "wrong setter type %s (expected Proc)", rb_obj_classname(setter_proc));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// todo: not just leak memory here lol
|
|
89
|
+
struct hooked_var *hv = (struct hooked_var *)malloc(sizeof(struct hooked_var));
|
|
90
|
+
hv->getter = getter_proc;
|
|
91
|
+
hv->setter = setter_proc;
|
|
92
|
+
|
|
93
|
+
rb_define_hooked_variable(name_str, (VALUE *)hv, hooked_var_getter, setter_proc == Qnil ? rb_gvar_readonly_setter : hooked_var_setter);
|
|
94
|
+
return name;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
VALUE gvars_module;
|
|
98
|
+
|
|
99
|
+
void
|
|
100
|
+
Init_gvars(void)
|
|
101
|
+
{
|
|
102
|
+
gvars_module = rb_define_module("GVars");
|
|
103
|
+
|
|
104
|
+
// Define module-level functions that can be used as mixins
|
|
105
|
+
rb_define_module_function(gvars_module, "global_variable_get", gvars_global_variable_get, 1);
|
|
106
|
+
rb_define_module_function(gvars_module, "global_variable_set", gvars_global_variable_set, 2);
|
|
107
|
+
rb_define_module_function(gvars_module, "global_variable_defined?", gvars_global_variable_defined_p, 1);
|
|
108
|
+
rb_define_module_function(gvars_module, "alias_global_variable", gvars_alias_global_variable, 2);
|
|
109
|
+
|
|
110
|
+
// Don't make mixin, as it exists in Kernel
|
|
111
|
+
rb_define_singleton_method(gvars_module, "global_variables", gvars_global_variables, 0);
|
|
112
|
+
|
|
113
|
+
// aliases at top-level
|
|
114
|
+
rb_define_alias(rb_singleton_class(gvars_module), "get", "global_variable_get");
|
|
115
|
+
rb_define_alias(rb_singleton_class(gvars_module), "set", "global_variable_set");
|
|
116
|
+
rb_define_alias(rb_singleton_class(gvars_module), "defined?", "global_variable_defined?");
|
|
117
|
+
rb_define_alias(rb_singleton_class(gvars_module), "alias", "alias_global_variable");
|
|
118
|
+
rb_define_alias(rb_singleton_class(gvars_module), "list", "global_variables");
|
|
119
|
+
rb_define_alias(rb_singleton_class(gvars_module), "[]", "global_variable_get");
|
|
120
|
+
rb_define_alias(rb_singleton_class(gvars_module), "[]=", "global_variable_set");
|
|
121
|
+
|
|
122
|
+
rb_define_singleton_method(gvars_module, "define_virtual_global", gvars_define_virtual_global, -1);
|
|
123
|
+
|
|
124
|
+
// Virtual methods: TODO
|
|
125
|
+
}
|
data/lib/gvars/version.rb
CHANGED
data/lib/gvars.rb
CHANGED
data/sig/gvars.rbs
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
module
|
|
1
|
+
module GVars
|
|
2
2
|
VERSION: String
|
|
3
|
+
|
|
4
|
+
def self?.global_variable_get: (interned name) -> untyped
|
|
5
|
+
def self?.global_variable_set: [T] (interned name, T value) -> T
|
|
6
|
+
def self?.alias_global_variable: (interned to_set, interned original) -> __todo__
|
|
7
|
+
def self?.global_variables: () -> Array[Symbol]
|
|
8
|
+
|
|
9
|
+
alias self.get self.global_variable_get
|
|
10
|
+
alias self.[] self.global_variable_get
|
|
11
|
+
alias self.set self.global_variable_set
|
|
12
|
+
alias self.[]= self.global_variable_set
|
|
13
|
+
alias self.list self.global_variables
|
|
14
|
+
alias self.alias self.alias_global_variable
|
|
15
|
+
|
|
16
|
+
def self.define_virtual_global: (interned name) { (Symbol name) -> untyped } -> void
|
|
17
|
+
| (interned name, proc getter, ?proc setter) -> void
|
|
18
|
+
|
|
3
19
|
# See the writing guide of rbs: https://github.com/ruby/rbs#guides
|
|
4
20
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gvars
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SamW
|
|
@@ -13,12 +13,15 @@ description: 'TO DO: Write a longer description or delete this line.'
|
|
|
13
13
|
email:
|
|
14
14
|
- mail@sampersand.me
|
|
15
15
|
executables: []
|
|
16
|
-
extensions:
|
|
16
|
+
extensions:
|
|
17
|
+
- ext/gvars/extconf.rb
|
|
17
18
|
extra_rdoc_files: []
|
|
18
19
|
files:
|
|
19
20
|
- LICENSE.txt
|
|
20
21
|
- README.md
|
|
21
22
|
- Rakefile
|
|
23
|
+
- ext/gvars/extconf.rb
|
|
24
|
+
- ext/gvars/gvars.c
|
|
22
25
|
- lib/gvars.rb
|
|
23
26
|
- lib/gvars/version.rb
|
|
24
27
|
- sig/gvars.rbs
|