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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e3985d26424ff4d447445b3d10b132cb45a578272a14b0f9439a70a1da22030
4
- data.tar.gz: e18ec85c05f64b05b22dd0623330bac0146376df4ec25daf3ba74d6157e9d93c
3
+ metadata.gz: 2ad79094c679e0044908f36687249abd41da98b4df01c1528a03c7832fd2fb6f
4
+ data.tar.gz: d49eaba2f5462f1d6cdd10610e8c27b1207b64258ff84a624ef936309db124e7
5
5
  SHA512:
6
- metadata.gz: 3ee1ae6ceea846f070549ce145715d4091a012979f2830f5cd425e701dd493f9ca15eaf46a084099ee4964436e508f114fab4f274d350f522a08466a874b2156
7
- data.tar.gz: 758bce3ec8a248e43ec6273b026aa4e384ee260575d05a2150fb3a72c0e815600080f77ea68d5a9fbe6fbf7d830820ccbad6453d7fd5b956841fff4e880bb83e
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 "bundler/gem_tasks"
4
- require "minitest/test_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/extensiontask'
5
+ require 'minitest/test_task'
5
6
 
6
- Minitest::TestTask.create
7
+ task default: [:compile]
7
8
 
8
- task default: :test
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
@@ -0,0 +1,5 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS << ' -g -fsanitize=undefined'
4
+
5
+ create_makefile 'gvars/gvars'
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Gvars
4
- VERSION = "0.1.0"
3
+ module GVars
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/gvars.rb CHANGED
@@ -1,8 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "gvars/version"
4
-
5
- module Gvars
6
- class Error < StandardError; end
7
- # Your code goes here...
8
- end
4
+ require_relative "gvars/gvars"
data/sig/gvars.rbs CHANGED
@@ -1,4 +1,20 @@
1
- module Gvars
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.0
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