evilr 1.0.0-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +19 -0
- data/README.rdoc +148 -0
- data/Rakefile +41 -0
- data/ext/evilr/evilr.c +993 -0
- data/ext/evilr/extconf.rb +7 -0
- data/lib/1.8/evilr.so +0 -0
- data/lib/1.9/evilr.so +0 -0
- data/lib/evilr.rb +1 -0
- data/spec/evilr_spec.rb +1157 -0
- metadata +88 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010-2011 Jeremy Evans
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
19
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
= evilr
|
2
|
+
|
3
|
+
evilr subverts ruby's runtime and lets you do things you shouldn't
|
4
|
+
do, such as changing the classes of objects. It's inspired by
|
5
|
+
evil.rb, but is a C extension as opposed to ruby code that uses DL.
|
6
|
+
|
7
|
+
== Why?
|
8
|
+
|
9
|
+
It's a good way to learn about how ruby works under the hood. It's
|
10
|
+
fun to push the boundries of ruby's runtime, to see the difference
|
11
|
+
between what's just not allowed (i.e. changing classes) and what's
|
12
|
+
not possible for technical reasons (i.e. sharing singleton classes,
|
13
|
+
instance variables, or method tables).
|
14
|
+
|
15
|
+
== Installation
|
16
|
+
|
17
|
+
gem install evilr
|
18
|
+
|
19
|
+
== What evil is currently available?
|
20
|
+
|
21
|
+
* Object
|
22
|
+
* class= : Change the class of an object
|
23
|
+
* detach_singleton_class : Make current singleton class not a
|
24
|
+
singleton, becoming the object's main class.
|
25
|
+
* dup_singleton_class : Make a copy of the current singleton
|
26
|
+
class as a regular class.
|
27
|
+
* evilr_debug_print : Print method ancestry chain to standard
|
28
|
+
output.
|
29
|
+
* extend_between : Given a module and a block, calls the block
|
30
|
+
repeatedly with two arguments, each a module or class in the super
|
31
|
+
chain. The first time the block returns true, the module argument
|
32
|
+
given to the method is inserted between the given extended modules.
|
33
|
+
Starts with the object's singleton class and continues until
|
34
|
+
the object's class. If the argument given already extends the
|
35
|
+
object, will remove it and reinsert it. If the argument is
|
36
|
+
already included in the object's class, raises an exception.
|
37
|
+
* pop_singleton_class : Remove closest singleton class from the
|
38
|
+
object
|
39
|
+
* push_singleton_class : Add a new singleton class to the object
|
40
|
+
in front of any existing singleton class.
|
41
|
+
* remove_singleton_class : Remove an object's singleton class
|
42
|
+
and any modules that extend the object.
|
43
|
+
* remove_singleton_classes : Remove all singleton classes
|
44
|
+
and extended modules.
|
45
|
+
* set_singleton_class : Take a given class and make it the object's
|
46
|
+
singleton class, replacing any existing singleton class.
|
47
|
+
* swap : Completely swap two objects (singleton class, class,
|
48
|
+
instance variables).
|
49
|
+
* swap_singleton_class : Swap an object's singleton class with
|
50
|
+
another object's singleton class.
|
51
|
+
* swap_instance_variables: Swap two instance's instance variables.
|
52
|
+
* unextend : Remove a module that extends the object from the super
|
53
|
+
chain.
|
54
|
+
* unfreeze : Unfreeze the object.
|
55
|
+
* Kernel
|
56
|
+
* segfault : Dereferences NULL.
|
57
|
+
* seppuku : kill -KILL's the current process.
|
58
|
+
* set_safe_level : Allows you to lower ruby's $SAFE level.
|
59
|
+
* Module
|
60
|
+
* include_between : Given a module and a block, calls the block
|
61
|
+
repeatedly with two arguments, each a module or class in the super
|
62
|
+
chain. The first time the block returns true, the module argument
|
63
|
+
given to the method is inserted between the given modules. Continues
|
64
|
+
until the end of the super chain. If the argument given is already
|
65
|
+
included, will remove it and reinsert it.
|
66
|
+
* swap_method_tables : Swap the method tables of the receiver with
|
67
|
+
the ones in the given module/class.
|
68
|
+
* to_class : Return a copy of the module as a class.
|
69
|
+
* uninclude : Remove the given module from the super chain, including
|
70
|
+
going into superclasses if the receiver is a class.
|
71
|
+
* Class
|
72
|
+
* detach_singleton : If the class is a singleton class, remove
|
73
|
+
its singleton status.
|
74
|
+
* inherit : Allows inheriting from multiple classes, basically
|
75
|
+
including them as modules.
|
76
|
+
* singleton_class_instance : If the class is a singleton class,
|
77
|
+
return the related instance.
|
78
|
+
* superclass= : Modify the superclass of the receiver.
|
79
|
+
* to_module : Return a copy of the class as a module.
|
80
|
+
* UnboundMethod
|
81
|
+
* force_bind : Bind the method to the object even if it is a different
|
82
|
+
class than the method.
|
83
|
+
* Proc
|
84
|
+
* self : Get the default receiver of the proc's methods
|
85
|
+
* self= : Change the default receiver of the proc's methods
|
86
|
+
* Empty
|
87
|
+
* A class with no superclass, only allocate, new, initialize, and
|
88
|
+
superclass defined. More basic than even BasicObject.
|
89
|
+
|
90
|
+
== Good bugs
|
91
|
+
|
92
|
+
If bugs are evil in good code, then surely bugs in evil code are good:
|
93
|
+
|
94
|
+
http://github.com/jeremyevans/evilr/issues
|
95
|
+
|
96
|
+
== Contributing
|
97
|
+
|
98
|
+
I'm happy to accept more evil, hopefully without good bugs and with
|
99
|
+
evil specs:
|
100
|
+
|
101
|
+
http://github.com/jeremyevans/evilr
|
102
|
+
|
103
|
+
evilr currently requires:
|
104
|
+
|
105
|
+
* rake
|
106
|
+
* rake-compiler
|
107
|
+
* rspec
|
108
|
+
|
109
|
+
== Running the specs
|
110
|
+
|
111
|
+
Even evil code should have specs! The default rake task runs the
|
112
|
+
specs:
|
113
|
+
|
114
|
+
rake
|
115
|
+
|
116
|
+
== Platforms Tested
|
117
|
+
|
118
|
+
=== Operating Systems/Platforms
|
119
|
+
|
120
|
+
* OpenBSD (amd64, i386)
|
121
|
+
* Linux (i386)
|
122
|
+
* Windows XP (i386)
|
123
|
+
|
124
|
+
=== Compiler Versions
|
125
|
+
|
126
|
+
* gcc 4.2.1
|
127
|
+
* gcc 4.4.5
|
128
|
+
|
129
|
+
== Ruby Versions
|
130
|
+
|
131
|
+
* ruby 1.8.6
|
132
|
+
* ruby 1.8.7
|
133
|
+
* ruby 1.9.2
|
134
|
+
|
135
|
+
ruby 1.9.1 is not supported. It mostly works but has spec failures.
|
136
|
+
|
137
|
+
If your platform, compiler version, or ruby version is not listed
|
138
|
+
above, please test and send me a report including:
|
139
|
+
|
140
|
+
* Your operating system and platform (e.g. i386, x86_64/amd64)
|
141
|
+
* Your compiler
|
142
|
+
* Your ruby version
|
143
|
+
* The output of rake
|
144
|
+
|
145
|
+
== Author
|
146
|
+
|
147
|
+
Jeremy Evans <code@jeremyevans.net>
|
148
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rake/clean"
|
3
|
+
|
4
|
+
CLEAN.include %w'*.core doc ext/evilr/Makefile ext/evilr/evilr.o ext/evilr/evilr.so lib tmp evilr-*.gem'
|
5
|
+
|
6
|
+
desc "Build the gem"
|
7
|
+
task :gem do
|
8
|
+
sh %{gem build evilr.gemspec}
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rake/extensiontask'
|
13
|
+
Rake::ExtensionTask.new('evilr')
|
14
|
+
dependencies = [:compile]
|
15
|
+
rescue LoadError
|
16
|
+
dependencies = []
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
require "spec/rake/spectask"
|
21
|
+
|
22
|
+
Spec::Rake::SpecTask.new("spec" => dependencies) do |t|
|
23
|
+
t.spec_files = ["spec/evilr_spec.rb"]
|
24
|
+
end
|
25
|
+
task :default => :spec
|
26
|
+
|
27
|
+
rescue LoadError
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Start an IRB shell using the extension"
|
31
|
+
task :irb => dependencies do
|
32
|
+
require 'irb'
|
33
|
+
$:.unshift 'lib'
|
34
|
+
require 'evilr'
|
35
|
+
c = IRB.conf
|
36
|
+
def c.[]=(k,v)
|
37
|
+
super unless k == :SCRIPT
|
38
|
+
end
|
39
|
+
IRB.start
|
40
|
+
end
|
41
|
+
|