iseq_collector 0.2.0 → 0.3.0

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
  SHA1:
3
- metadata.gz: 65748299ec8c1bc18d1b2331297771eeecf8f3dd
4
- data.tar.gz: d29f03e81016604d187f8353cf785e20564bcdde
3
+ metadata.gz: 361f51f935c26f922c5470d8043546c1f7101fb2
4
+ data.tar.gz: 567c243aabeb8c264d0bd4b108ca376798f62924
5
5
  SHA512:
6
- metadata.gz: 42cc8cebb4387e286ba8aa17ea2b130b225e45405d913d28c698452b109e43c7030ef5e095e5e7c56078b68829177b95f13cb2975e518e4e48981953fffd0393
7
- data.tar.gz: 12acb6034afd13b57f49059769a1f19eb31165bb4da0ae9af1c9bb967cc2ed69ec961a0af6c99a1ec7afea8366b7b661f55d32b0530816e6e4ceecd0377025c6
6
+ metadata.gz: fce8a1e216b67a9bc7a2e70c40709162615625864e048c0719b391b59bdc7c8af150ebaff6c3fe94dad1efe0cce39fb0a88a447afb574caffe26abd7e5daa8d1
7
+ data.tar.gz: 571af44fa45469d851950983412d8f4886d35a8c4cd181414a279746500b19032b12458948a49dc6ee3a42d965fbd60fbaf0c878e31048c017aed3dee150a2eb
@@ -0,0 +1,101 @@
1
+ #include <ruby/ruby.h>
2
+
3
+ #ifdef T_IMEMO
4
+
5
+ VALUE rb_iseqw_new(VALUE v);
6
+ void rb_objspace_each_objects(
7
+ int (*callback)(void *start, void *end, size_t stride, void *data),
8
+ void *data);
9
+ size_t rb_obj_memsize_of(VALUE);
10
+
11
+ enum imemo_type {
12
+ imemo_none = 0,
13
+ imemo_cref = 1,
14
+ imemo_svar = 2,
15
+ imemo_throw_data = 3,
16
+ imemo_ifunc = 4,
17
+ imemo_memo = 5,
18
+ imemo_ment = 6,
19
+ imemo_iseq = 7,
20
+ imemo_mask = 0x07
21
+ };
22
+
23
+ static inline enum imemo_type
24
+ imemo_type(VALUE imemo)
25
+ {
26
+ return (RBASIC(imemo)->flags >> FL_USHIFT) & imemo_mask;
27
+ }
28
+
29
+ static inline int
30
+ rb_obj_is_iseq(VALUE iseq)
31
+ {
32
+ return RB_TYPE_P(iseq, T_IMEMO) && imemo_type(iseq) == imemo_iseq;
33
+ }
34
+
35
+ struct iseq_i_data {
36
+ void (*func)(VALUE v, void *data);
37
+ void *data;
38
+ };
39
+
40
+ int
41
+ iseq_i(void *vstart, void *vend, size_t stride, void *ptr)
42
+ {
43
+ VALUE v;
44
+ struct iseq_i_data *data = (struct iseq_i_data *)ptr;
45
+
46
+ for (v = (VALUE)vstart; v != (VALUE)vend; v += stride) {
47
+ if (RBASIC(v)->flags) {
48
+ switch (BUILTIN_TYPE(v)) {
49
+ case T_IMEMO:
50
+ if (rb_obj_is_iseq(v)) {
51
+ data->func(v, data->data);
52
+ }
53
+ continue;
54
+ default:
55
+ continue;
56
+ }
57
+ }
58
+ }
59
+
60
+ return 0;
61
+ }
62
+
63
+ static void
64
+ each_iseq_i(VALUE v, void *ptr)
65
+ {
66
+ rb_yield(rb_iseqw_new(v));
67
+ }
68
+
69
+ static VALUE
70
+ each_iseq(VALUE self)
71
+ {
72
+ struct iseq_i_data data = {each_iseq_i, NULL};
73
+ rb_objspace_each_objects(iseq_i, &data);
74
+ return Qnil;
75
+ }
76
+
77
+ static void
78
+ count_iseq_i(VALUE v, void *ptr)
79
+ {
80
+ size_t *sizep = (size_t *)ptr;
81
+ *sizep += 1;
82
+ }
83
+
84
+ static VALUE
85
+ count_iseq(VALUE self)
86
+ {
87
+ size_t size = 0;
88
+ struct iseq_i_data data = {count_iseq_i, &size};
89
+ rb_objspace_each_objects(iseq_i, &data);
90
+ return SIZET2NUM(size);
91
+ }
92
+
93
+ void
94
+ Init_iseq_collector(void)
95
+ {
96
+ VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
97
+ rb_define_singleton_method(rb_mObjSpace, "each_iseq", each_iseq, 0);
98
+ rb_define_singleton_method(rb_mObjSpace, "count_iseq", count_iseq, 0);
99
+ }
100
+
101
+ #endif
@@ -1,3 +1,3 @@
1
1
  module IseqCollector
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iseq_collector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Sasada
@@ -83,6 +83,7 @@ files:
83
83
  - bin/console
84
84
  - bin/setup
85
85
  - ext/iseq_collector/extconf.rb
86
+ - ext/iseq_collector/iseq_collector.c
86
87
  - iseq_collector.gemspec
87
88
  - lib/iseq_collector.rb
88
89
  - lib/iseq_collector/version.rb