rallhook 0.7.0 → 0.7.1
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.
- data/CHANGELOG +10 -0
- data/README +27 -18
- data/Rakefile +1 -1
- data/ext/rallhook_base/rallhook.c +10 -1
- data/lib/rallhook.rb +9 -2
- metadata +27 -9
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
0.7.1 Fixed issue 9 ( http://github.com/tario/rallhook/issues#issue/9 ), "broken" object is processed by the GC due the impossibility of avoid
|
2
|
+
the deletion of an object of class Redirect returned by handle_method. The hotfix disabled the GC at each redirection and enable
|
3
|
+
it again each time that a WRAPPER redirection concludes. Also the GC are re-enabled when the hook block is terminated.
|
4
|
+
|
5
|
+
MULTI-THREAD SUPPORT DISABLED
|
6
|
+
This hotfix changes a flag, the global state of GC enabled. Due this flag is not by thread, concurrency executions of hook blocks
|
7
|
+
in many thread simulaniously has unexpected and maybe undesirable behaviours
|
8
|
+
|
9
|
+
The thread support will be added again to the next patch version 0.7.2
|
10
|
+
|
1
11
|
0.7.0 Concurrency support, any thread can hook without affect the hook state of the other threads
|
2
12
|
|
3
13
|
Restrictions about overwrite instance methods disabled
|
data/README
CHANGED
@@ -13,12 +13,18 @@ This package contains rallhook, a ruby C extension to intercept ruby methods cal
|
|
13
13
|
* distorm ( found at https://code.google.com/p/distorm/ )
|
14
14
|
|
15
15
|
|
16
|
-
===
|
16
|
+
=== Installation
|
17
|
+
|
18
|
+
* run in your system
|
19
|
+
|
20
|
+
sudo gem install rallhook
|
21
|
+
|
22
|
+
OR
|
17
23
|
|
18
24
|
* Download the last version of the gem from http://github.com/tario/ruby-cpp/downloads
|
19
25
|
* Install the gem with the following;
|
20
26
|
|
21
|
-
gem install rallhook-X.X.X.gem
|
27
|
+
sudo gem install rallhook-X.X.X.gem
|
22
28
|
|
23
29
|
== Usage
|
24
30
|
|
@@ -52,21 +58,21 @@ test.rb:
|
|
52
58
|
|
53
59
|
standard output:
|
54
60
|
|
55
|
-
method call each:4001 over 123:Array
|
56
|
-
method call print:7697 over main:Object
|
57
|
-
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
58
|
-
method call to_s:3137 over 1:Fixnum
|
59
|
-
1method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
61
|
+
method call each:4001 over 123:Array
|
62
|
+
method call print:7697 over main:Object
|
63
|
+
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
64
|
+
method call to_s:3137 over 1:Fixnum
|
65
|
+
1method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
60
66
|
|
61
|
-
method call print:7697 over main:Object
|
62
|
-
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
63
|
-
method call to_s:3137 over 2:Fixnum
|
64
|
-
2method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
67
|
+
method call print:7697 over main:Object
|
68
|
+
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
69
|
+
method call to_s:3137 over 2:Fixnum
|
70
|
+
2method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
65
71
|
|
66
|
-
method call print:7697 over main:Object
|
67
|
-
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
68
|
-
method call to_s:3137 over 3:Fixnum
|
69
|
-
3method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
72
|
+
method call print:7697 over main:Object
|
73
|
+
method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
74
|
+
method call to_s:3137 over 3:Fixnum
|
75
|
+
3method call write:7649 over #<IO:0x7fb15e54fad0>:IO
|
70
76
|
|
71
77
|
=== Redirecting calls
|
72
78
|
|
@@ -92,7 +98,7 @@ standard output:
|
|
92
98
|
|
93
99
|
nil # do nothing
|
94
100
|
end
|
95
|
-
|
101
|
+
|
96
102
|
def bar
|
97
103
|
print "bar in MethodHandler\n"
|
98
104
|
end
|
@@ -131,7 +137,7 @@ standard output:
|
|
131
137
|
|
132
138
|
class MethodHandler < HookHandler
|
133
139
|
include RallHook::Helper
|
134
|
-
|
140
|
+
|
135
141
|
class FooMethodWrapper < MethodWrapper
|
136
142
|
def call(*x)
|
137
143
|
# call with reyield if block_given
|
@@ -139,7 +145,7 @@ standard output:
|
|
139
145
|
original_call(*x) do |*a|
|
140
146
|
yield(*a)
|
141
147
|
end
|
142
|
-
# add "�bar?"
|
148
|
+
# add "�bar?"
|
143
149
|
yield("bar?")
|
144
150
|
else
|
145
151
|
original_call(*x)
|
@@ -205,3 +211,6 @@ main.rb
|
|
205
211
|
print y.method(Y,:foo).body.file,"\n" # source2.rb
|
206
212
|
|
207
213
|
|
214
|
+
== Copying
|
215
|
+
|
216
|
+
Copyright (c) 2010 Dario Seminara, released under the GPL License (see LICENSE)
|
data/Rakefile
CHANGED
@@ -117,6 +117,12 @@ VALUE get_hook_proc() {
|
|
117
117
|
Disable the hook. Is not usually necesary because of the RAII feature of Hook#hook
|
118
118
|
*/
|
119
119
|
VALUE unhook(VALUE self) {
|
120
|
+
disable_redirect(tinfo_from_thread( rb_thread_current() ) );
|
121
|
+
rb_gc_enable();
|
122
|
+
return Qnil;
|
123
|
+
}
|
124
|
+
|
125
|
+
VALUE restore_unhook(VALUE self) {
|
120
126
|
disable_redirect(tinfo_from_thread( rb_thread_current() ) );
|
121
127
|
return Qnil;
|
122
128
|
}
|
@@ -191,6 +197,9 @@ void rallhook_redirect_handler ( VALUE* klass, VALUE* recv, ID* mid ) {
|
|
191
197
|
|
192
198
|
// method named "binding" cannot be redirected
|
193
199
|
if (rb_obj_is_kind_of(result,rb_mMethodRedirect) == Qtrue ) {
|
200
|
+
|
201
|
+
rb_gc_disable();
|
202
|
+
|
194
203
|
*klass = rb_ivar_get(result,id_klass_var );
|
195
204
|
*recv = rb_ivar_get(result,id_recv_var );
|
196
205
|
*mid = rb_to_id( rb_ivar_get(result,id_method_var) );
|
@@ -257,7 +266,7 @@ If no call to Hook#hook has made, rehook does nothing
|
|
257
266
|
VALUE rehook(VALUE unused) {
|
258
267
|
enable_redirect(tinfo_from_thread( rb_thread_current() ));
|
259
268
|
if (rb_block_given_p() ) {
|
260
|
-
return rb_ensure(rb_yield, Qnil,
|
269
|
+
return rb_ensure(rb_yield, Qnil, restore_unhook, Qnil);
|
261
270
|
}
|
262
271
|
return Qnil;
|
263
272
|
}
|
data/lib/rallhook.rb
CHANGED
@@ -40,7 +40,7 @@ module RallHook
|
|
40
40
|
#
|
41
41
|
class Redirect
|
42
42
|
include MethodRedirect
|
43
|
-
|
43
|
+
|
44
44
|
attr_reader :recv
|
45
45
|
|
46
46
|
def initialize(klass, recv, m, unhook = nil)
|
@@ -225,7 +225,8 @@ module RallHook
|
|
225
225
|
call(*args)
|
226
226
|
end
|
227
227
|
ensure
|
228
|
-
|
228
|
+
GC.enable
|
229
|
+
::RallHook::Hook.rehook
|
229
230
|
end
|
230
231
|
|
231
232
|
#
|
@@ -325,6 +326,11 @@ class Object
|
|
325
326
|
# Anyway, it is desirable to use MethodWrapper instead to "wrap" method calls
|
326
327
|
#
|
327
328
|
# see RallHook::Helper::MethodWrapper
|
329
|
+
#
|
330
|
+
# NOTE: Rallhook internally disable the GC in a redirection, you must reactivate it after
|
331
|
+
#
|
332
|
+
# NOTE 2: If use the MethodWrapper functionallity, it reactivates the GC disabled by rallhook. You should not
|
333
|
+
# worry about it
|
328
334
|
#
|
329
335
|
def redirect_with_unhook(method_name, klass = nil)
|
330
336
|
if klass
|
@@ -358,6 +364,7 @@ class Object
|
|
358
364
|
#
|
359
365
|
# # hook using MethodHandler, etc... (see README and examples)
|
360
366
|
#
|
367
|
+
# NOTE: Rallhook internally disable the GC in a redirection, you must reactivate it after
|
361
368
|
#
|
362
369
|
def redirect(method_name, klass = nil)
|
363
370
|
if klass
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rallhook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 1
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 7
|
9
|
+
- 1
|
10
|
+
version: 0.7.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Dario Seminara
|
@@ -9,19 +15,25 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-21 00:00:00 -03:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: ruby-cymbol
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 1
|
33
|
+
- 0
|
23
34
|
version: 0.1.0
|
24
|
-
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
25
37
|
description:
|
26
38
|
email: robertodarioseminara@gmail.com
|
27
39
|
executables: []
|
@@ -91,21 +103,27 @@ rdoc_options:
|
|
91
103
|
require_paths:
|
92
104
|
- lib
|
93
105
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
94
107
|
requirements:
|
95
108
|
- - ">="
|
96
109
|
- !ruby/object:Gem::Version
|
110
|
+
hash: 3
|
111
|
+
segments:
|
112
|
+
- 0
|
97
113
|
version: "0"
|
98
|
-
version:
|
99
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
100
116
|
requirements:
|
101
117
|
- - ">="
|
102
118
|
- !ruby/object:Gem::Version
|
119
|
+
hash: 3
|
120
|
+
segments:
|
121
|
+
- 0
|
103
122
|
version: "0"
|
104
|
-
version:
|
105
123
|
requirements: []
|
106
124
|
|
107
125
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.3.
|
126
|
+
rubygems_version: 1.3.7
|
109
127
|
signing_key:
|
110
128
|
specification_version: 3
|
111
129
|
summary: Allow hooking of all method invocations transparently to control and / or monitor the behavior of a ruby program
|