rubymirrors 0.0.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.
Files changed (60) hide show
  1. data/Gemfile +7 -0
  2. data/README.md +30 -0
  3. data/Rakefile +13 -0
  4. data/lib/abstract_reflection.rb +112 -0
  5. data/lib/abstract_reflection/class_mirror.rb +150 -0
  6. data/lib/abstract_reflection/compiler_mirror.rb +31 -0
  7. data/lib/abstract_reflection/field_mirror.rb +35 -0
  8. data/lib/abstract_reflection/gc_mirror.rb +19 -0
  9. data/lib/abstract_reflection/method_mirror.rb +253 -0
  10. data/lib/abstract_reflection/mirror.rb +108 -0
  11. data/lib/abstract_reflection/object_mirror.rb +48 -0
  12. data/lib/abstract_reflection/stack_frame_mirror.rb +61 -0
  13. data/lib/abstract_reflection/thread_mirror.rb +64 -0
  14. data/lib/maglev/reflection.rb +49 -0
  15. data/lib/maglev/reflection/class_mirror.rb +157 -0
  16. data/lib/maglev/reflection/core_ext/class_organizer.rb +20 -0
  17. data/lib/maglev/reflection/core_ext/maglev.rb +5 -0
  18. data/lib/maglev/reflection/core_ext/method.rb +154 -0
  19. data/lib/maglev/reflection/core_ext/module.rb +41 -0
  20. data/lib/maglev/reflection/core_ext/object.rb +4 -0
  21. data/lib/maglev/reflection/core_ext/thread.rb +226 -0
  22. data/lib/maglev/reflection/field_mirror.rb +39 -0
  23. data/lib/maglev/reflection/field_mirror/fixed_instance_variable_mirror.rb +25 -0
  24. data/lib/maglev/reflection/method_mirror.rb +149 -0
  25. data/lib/maglev/reflection/mirror.rb +6 -0
  26. data/lib/maglev/reflection/object_mirror.rb +18 -0
  27. data/lib/maglev/reflection/stack_frame_mirror.rb +104 -0
  28. data/lib/maglev/reflection/thread_mirror.rb +116 -0
  29. data/lib/rubinius/reflection.rb +6 -0
  30. data/lib/ruby/reflection.rb +74 -0
  31. data/lib/ruby/reflection/class_mirror.rb +89 -0
  32. data/lib/ruby/reflection/field_mirror.rb +32 -0
  33. data/lib/ruby/reflection/field_mirror/class_variable_mirror.rb +25 -0
  34. data/lib/ruby/reflection/field_mirror/constant_mirror.rb +36 -0
  35. data/lib/ruby/reflection/field_mirror/instance_variable_mirror.rb +25 -0
  36. data/lib/ruby/reflection/method_mirror.rb +122 -0
  37. data/lib/ruby/reflection/mirror.rb +12 -0
  38. data/lib/ruby/reflection/object_mirror.rb +25 -0
  39. data/lib/ruby/reflection/stack_frame_mirror.rb +49 -0
  40. data/lib/ruby/reflection/support/shift_reset.rb +29 -0
  41. data/lib/ruby/reflection/thread_mirror.rb +47 -0
  42. data/rubymirrors.gemspec +12 -0
  43. data/spec/class_spec.rb +92 -0
  44. data/spec/field_spec.rb +119 -0
  45. data/spec/fixtures/class_spec.rb +29 -0
  46. data/spec/fixtures/field_spec.rb +9 -0
  47. data/spec/fixtures/method_spec.rb +14 -0
  48. data/spec/fixtures/object_spec.rb +5 -0
  49. data/spec/fixtures/reflect_spec.rb +14 -0
  50. data/spec/fixtures/stack_frame_spec.rb +5 -0
  51. data/spec/fixtures/thread_spec.rb +5 -0
  52. data/spec/frame_spec.rb +80 -0
  53. data/spec/method_spec.rb +166 -0
  54. data/spec/object_spec.rb +18 -0
  55. data/spec/reflection_spec.rb +74 -0
  56. data/spec/spec_helper.rb +16 -0
  57. data/spec/spec_helper/mspec_patch.rb +29 -0
  58. data/spec/spec_helper/multiple_reflections.rb +14 -0
  59. data/spec/thread_spec.rb +142 -0
  60. metadata +173 -0
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+
3
+ gem 'mspec'
4
+
5
+ platform :mri do
6
+ gem "method_source", "~> 0.6.6"
7
+ end
@@ -0,0 +1,30 @@
1
+ ## A mirror API for Ruby
2
+
3
+ In various [research][p1] [projects][p2] the advantages of having a [mirror
4
+ API][p3] to separate reflection from a language implementation have
5
+ been discussed, and "industry grade" implementations exist for
6
+ [Java][p4] and [C#][p5]. This project aims at providing a number of
7
+ specs and classes that document a mirror API for Ruby. The mirror
8
+ implementation that is part of this project will use only those
9
+ language facilities that are available across Ruby implementations.
10
+ The specs, however, will also test behavior that cannot be provided in
11
+ such a manner. The idea here is that in time, all implementations
12
+ provide their own implementation of the mirror API, and all
13
+ implementations collaborate on this one spec.
14
+
15
+ Why do this, you ask? Because Ruby needs tools, and those tools need
16
+ to be written in Ruby. If they are not, then people will be excluded from
17
+ tinkering with their tools, thus impeding innovation. You only have to
18
+ look at Emacs or Smalltalk to see what's possible when programmers can
19
+ extend their tools, all tools, in a language they feel comfortable
20
+ in. If we have a standard mirror API, all tools that are written **for**
21
+ Ruby, **in** Ruby, can be shared across implementations, while at the same time
22
+ allowing language implementers to use the facilities of their platform
23
+ to provide optimal reflective capabilities without tying them to
24
+ internals.
25
+
26
+ [p1]: http://www.cs.virginia.edu/~lorenz/papers/icse03/icse2003.pdf "Pluggable Reflection: Decoupling Meta-Interface and Implementation"
27
+ [p2]: http://bracha.org/newspeak-spec.pdf "Newspeak Programming Language Draft Specification, Version 0.06, pages 40 onward"
28
+ [p3]: http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 "Linguistic Reflection Via Mirrors"
29
+ [p4]: http://bracha.org/mirrors.pdf "Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages"
30
+ [p5]: http://oreilly.com/catalog/progcsharp/chapter/ch18.html "See esp. 18-3, highlighting how C# reflection works on assembly rather than VM objects"
@@ -0,0 +1,13 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ RUBY_ENGINE = 'ruby' unless defined? RUBY_ENGINE
5
+
6
+ desc "Run the specs on the given mirror api. Defaults to 'ruby'"
7
+ task :spec, :impl do |task, args|
8
+ args.with_defaults :impl => RUBY_ENGINE
9
+ sh "mspec -t #{args.impl} spec/*_spec.rb"
10
+ end
11
+
12
+ task :test => :spec
13
+ task :default => :spec
@@ -0,0 +1,112 @@
1
+ module AbstractReflection
2
+ # A marker, raised when trying to run something
3
+ # that the reflective API doesn't support.
4
+ class CapabilitiesExceeded < StandardError; end
5
+
6
+ module ClassMethods
7
+ # A mirror has to reflect on something. file mirrors on files or
8
+ # directories, VM mirrors on the running VM or a remote instance and
9
+ # so on... This method allows you to query what kind of object you
10
+ # need to prepare to use it.
11
+ #
12
+ # @return [Array<Class>, Class] the class(es) that this reflective api can work on
13
+ def codebase
14
+ raise NotImplementedError, "#{self} should have implemented #codebase"
15
+ end
16
+ end
17
+
18
+ # Creates a new instance of a Reflection
19
+ # @param [Object] the codebase to work on, e.g. a file or a VM
20
+ # @return [Reflection] a new reflection object
21
+ def initialize(object)
22
+ raise NotImplementedError, "#{self} should have implemented #initialize"
23
+ end
24
+
25
+ def self.included(base)
26
+ base.extend(ClassMethods)
27
+ end
28
+
29
+ # This method can be used to query the system for known modules. It
30
+ # is not guaranteed that all possible modules are returned.
31
+ #
32
+ # @return [Array<ClassMirror>] a list of class mirrors
33
+ def modules
34
+ raise CapabilitiesExceeded
35
+ end
36
+
37
+ # This method can be used to query the system for known classes. It
38
+ # is not guaranteed that all possible classes are returned.
39
+ #
40
+ # @return [Array<ClassMirror>] a list of class mirrors
41
+ def classes
42
+ raise CapabilitiesExceeded
43
+ end
44
+
45
+ # Query the system for objects that are direct instances of the
46
+ # given class.
47
+ # @param [Class]
48
+ # @return [Array<ObjectMirror>] a list of appropriate mirrors for the requested objects
49
+ def instances_of(klass)
50
+ raise CapabilitiesExceeded
51
+ end
52
+
53
+ # Ask the system to find the object with the given object id
54
+ # @param [Numeric] object id
55
+ # @return [ObjectMirror, NilClass] the object mirror or nil
56
+ def object_by_id(id)
57
+ raise CapabilitiesExceeded
58
+ end
59
+
60
+ # Query the system for implementors of a particular message
61
+ # @param [String] the message name
62
+ # @return [Array<MethodMirror>] the implementing methods
63
+ def implementations_of(message)
64
+ raise CapabilitiesExceeded
65
+ end
66
+
67
+ # Query the system for senders of a particular message
68
+ # @param [String] the message name
69
+ # @return [Array<MethodMirror>] the sending methods
70
+ def senders_of(message)
71
+ raise CapabilitiesExceeded
72
+ end
73
+
74
+ # Return the currently active threads in the system
75
+ # @return [Array<ThreadMirror>] a list of thread mirrors
76
+ def threads
77
+ raise CapabilitiesExceeded
78
+ end
79
+
80
+ # @return [String] the platform the system is running on. usually RUBY_PLATFORM
81
+ def platform
82
+ raise CapabilitiesExceeded
83
+ end
84
+
85
+ # @return [String] the used implementation of Ruby
86
+ def engine
87
+ raise CapabilitiesExceeded
88
+ end
89
+
90
+ # @return [String] the version string describing the system
91
+ def version
92
+ raise CapabilitiesExceeded
93
+ end
94
+
95
+ # Create a mirror for a given object in the system under
96
+ # observation.
97
+ # @param [Object]
98
+ # @return [Mirror]
99
+ def reflect(o)
100
+ Mirror.reflect o, self
101
+ end
102
+ end
103
+
104
+ require 'abstract_reflection/mirror'
105
+ require 'abstract_reflection/object_mirror'
106
+ require 'abstract_reflection/field_mirror'
107
+ require 'abstract_reflection/class_mirror'
108
+ require 'abstract_reflection/method_mirror'
109
+ require 'abstract_reflection/thread_mirror'
110
+ require 'abstract_reflection/stack_frame_mirror'
111
+ require 'abstract_reflection/gc_mirror'
112
+ require 'abstract_reflection/compiler_mirror'
@@ -0,0 +1,150 @@
1
+ module AbstractReflection
2
+ # A specific mirror for a class, that includes all the capabilites
3
+ # and information we can gather about classes.
4
+ module ClassMirror
5
+ include ObjectMirror
6
+
7
+ # The known instance variables of this class. Ruby doesn't have a
8
+ # fixed number of instance variables, but static or runtime
9
+ # anlysis can give us a good idea what kind of variables we can
10
+ # expect.
11
+ #
12
+ # @return [FieldMirror]
13
+ def instance_variables
14
+ raise CapabilitiesExceeded
15
+ end
16
+
17
+ # The known class variables.
18
+ # @see #instance_variables
19
+ # @return [FieldMirror]
20
+ def class_variables
21
+ raise CapabilitiesExceeded
22
+ end
23
+
24
+ # The known class variables.
25
+ # @see #instance_variables
26
+ # @return [FieldMirror]
27
+ def class_instance_variables
28
+ raise CapabilitiesExceeded
29
+ end
30
+
31
+ # The source files this class is defined and/or extended in.
32
+ #
33
+ # @return [Array<String,File>]
34
+ def source_files
35
+ raise CapabilitiesExceeded
36
+ end
37
+
38
+ # The singleton class of this class
39
+ #
40
+ # @return [ClassMirror]
41
+ def singleton_class
42
+ raise CapabilitiesExceeded
43
+ end
44
+
45
+ # Predicate to determine whether the subject is a singleton class
46
+ #
47
+ # @return [true,false]
48
+ def singleton_class?
49
+ raise CapabilitiesExceeded
50
+ end
51
+
52
+ # The inverse of #singleton_class.
53
+ #
54
+ # @return [ClassMirror]
55
+ def singleton_instance
56
+ raise CapabilitiesExceeded
57
+ end
58
+
59
+ # The namespace of this class. Provides direct access to the
60
+ # enclosing namespace.
61
+ #
62
+ # @return [ClassMirror]
63
+ def namespace
64
+ raise CapabilitiesExceeded
65
+ end
66
+
67
+ # The full nesting.
68
+ #
69
+ # @return [Array<ClassMirror>]
70
+ def nesting
71
+ raise CapabilitiesExceeded
72
+ end
73
+
74
+ # The classes nested within the subject. Should _not_ trigger
75
+ # autloads!
76
+ #
77
+ # @return [Array<ClassMirror>]
78
+ def nested_classes
79
+ raise CapabilitiesExceeded
80
+ end
81
+
82
+ # The mixins included in the ancestors of this class.
83
+ #
84
+ # @return [Array<ClassMirror>]
85
+ def mixins
86
+ raise CapabilitiesExceeded
87
+ end
88
+
89
+ # The direct superclass
90
+ #
91
+ # @return [ClassMirror]
92
+ def superclass
93
+ raise CapabilitiesExceeded
94
+ end
95
+
96
+ # The known subclasses
97
+ #
98
+ # @return [Array<ClassMirror>]
99
+ def subclasses
100
+ raise CapabilitiesExceeded
101
+ end
102
+
103
+ # The list of ancestors
104
+ #
105
+ # @return [Array<ClassMirror>]
106
+ def ancestors
107
+ raise CapabilitiesExceeded
108
+ end
109
+
110
+ # The constants defined within this class. This includes nested
111
+ # classes and modules, but also all other kinds of constants.
112
+ # This should _not_ trigger autoloads!
113
+ #
114
+ # @return [Array<FieldMirror>]
115
+ def constants
116
+ raise CapabilitiesExceeded
117
+ end
118
+
119
+ # Searches for the named constant in the mirrored namespace. May
120
+ # include a colon (::) separated constant path. This _may_ trigger
121
+ # an autoload!
122
+ #
123
+ # @return [ClassMirror, nil] the requested constant, or nil
124
+ def constant(name)
125
+ raise CapabilitiesExceeded
126
+ end
127
+
128
+ # The instance methods of this class. To get to the class methods,
129
+ # ask the #singleton_class for its methods.
130
+ #
131
+ # @return [Array<MethodMirror>]
132
+ def methods
133
+ raise CapabilitiesExceeded
134
+ end
135
+
136
+ # The instance method of this class or any of its superclasses
137
+ # that has the specified selector
138
+ #
139
+ # @return [MethodMirror, nil] the method or nil, if none was found
140
+ def method(name)
141
+ raise CapabilitiesExceeded
142
+ end
143
+
144
+ # The method dictionary. Maps names to methods. Should ideally be
145
+ # writable.
146
+ def method_dictionary
147
+ raise CapabilitiesExceeded
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,31 @@
1
+ module AbstractReflection
2
+ # Reflecting on the compiler, both in a general sense (to just
3
+ # compile things) and in specific states. It should be possible to
4
+ # get a compiler instance and associated state from e.g. the
5
+ # execution of a thread.
6
+ #
7
+ # This class should also allow access to information about JIT,
8
+ # caches etc
9
+ module CompilerMirror
10
+ include Mirror
11
+
12
+ # Your Kernel#eval, but only compiles and returns
13
+ # the compiled method object.
14
+ #
15
+ # return [MethodMirror]
16
+ def compile(source)
17
+ raise CapabilitiesExceeded
18
+ end
19
+
20
+ # For a specific compiler state, this holds the current module
21
+ # definition stack. This should be a list of modules in which the
22
+ # Thread, that belongs to this compiler state, is currently
23
+ # nested. The first element is the module that would be target for
24
+ # the next method definition.
25
+ #
26
+ # return [Array<ClassMirror>]
27
+ def module_scope
28
+ raise CapabilitiesExceeded
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module AbstractReflection
2
+ # A class to reflect on instance, class, and class instance variables,
3
+ # as well as constants.
4
+ module FieldMirror
5
+ include Mirror
6
+
7
+ def value
8
+ raise CapabilitiesExceeded
9
+ end
10
+
11
+ def value= obj
12
+ raise CapabilitiesExceeded
13
+ end
14
+
15
+ def public?
16
+ raise CapabilitiesExceeded
17
+ end
18
+
19
+ def private?
20
+ raise CapabilitiesExceeded
21
+ end
22
+
23
+ def protected?
24
+ raise CapabilitiesExceeded
25
+ end
26
+
27
+ def writable?
28
+ true
29
+ end
30
+
31
+ def delete
32
+ raise CapabilitiesExceeded
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ module AbstractReflection
2
+ # Reflective access to the GC. This includes statistics, runtime
3
+ # behavior observation and triggering specific GC functionality.
4
+ module GCMirror
5
+ include Mirror
6
+
7
+ # Trigger a GC run
8
+ # @return stats about cleaned objects, freed memory, etc
9
+ def collect_garbage
10
+ raise CapabilitiesExceeded
11
+ end
12
+
13
+ # Run memory compaction
14
+ # @return info about freed memory, moved pages, etc
15
+ def compact_memory
16
+ raise CapabilitiesExceeded
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,253 @@
1
+ module AbstractReflection
2
+ # A MethodMirror should reflect on methods, but in a more general
3
+ # sense than the Method and UnboundMethod classes in Ruby are able
4
+ # to offer.
5
+ #
6
+ # In actual execution, a method is pretty much every chunk of code,
7
+ # even loading a file triggers a process not unlike compiling a
8
+ # method (if only for the side-effects). Method mirrors should allow
9
+ # access to the runtime objects, but also to their static
10
+ # representations (bytecode, source, ...), their debugging
11
+ # information and statistical information
12
+ module MethodMirror
13
+ include Mirror
14
+
15
+ # @return [ClassMirror] The class this method was originally defined in
16
+ def defining_class
17
+ raise CapabilitiesExceeded
18
+ end
19
+
20
+ # @return [String] The source code of this method
21
+ def source
22
+ raise CapabilitiesExceeded
23
+ end
24
+
25
+ # @return [Fixnum] The source line
26
+ def line
27
+ raise CapabilitiesExceeded
28
+ end
29
+
30
+ # @return [String] The method name
31
+ def selector
32
+ raise CapabilitiesExceeded
33
+ end
34
+
35
+ # @return [String] The filename
36
+ def file
37
+ raise CapabilitiesExceeded
38
+ end
39
+
40
+ # Queries the method for it's arguments and returns a list of
41
+ # mirrors that hold name and value information.
42
+ #
43
+ # @return [Array<FieldMirror>]
44
+ def arguments
45
+ raise CapabilitiesExceeded
46
+ end
47
+
48
+ # Returns a field mirror with name and possibly value of the splat
49
+ # argument, or nil, if there is none to this method.
50
+ #
51
+ # @return [FieldMirror, nil]
52
+ def splat_argument
53
+ raise CapabilitiesExceeded
54
+ end
55
+
56
+ # Returns names and values of the optional arguments.
57
+ #
58
+ # @return [Array<FieldMirror>, nil]
59
+ def optional_arguments
60
+ raise CapabilitiesExceeded
61
+ end
62
+
63
+ # Returns the name and possibly values of the required arguments
64
+ # @return [Array<FieldMirror>, nil]
65
+ def required_arguments
66
+ raise CapabilitiesExceeded
67
+ end
68
+
69
+ # Return the value the block argument, or nil
70
+ #
71
+ # @return [FieldMirror, nil]
72
+ def block_argument
73
+ raise CapabilitiesExceeded
74
+ end
75
+
76
+ # Replace the sourcecode. This should be an in-place operation and
77
+ # immediately visible to the system.
78
+ def source= string
79
+ raise CapabilitiesExceeded
80
+ end
81
+
82
+ # Change the information about which file this method is stored
83
+ # in. Possibly moves the method into the new file.
84
+ def file= string
85
+ raise CapabilitiesExceeded
86
+ end
87
+
88
+ # Change the information about the line this method starts
89
+ # at. Possibly moves the method.
90
+ def line= string
91
+ raise CapabilitiesExceeded
92
+ end
93
+
94
+ # The offsets into the source code for method sends.
95
+ #
96
+ # @return [Hash<String, Fixnum>] a hash of selector-offset pairs
97
+ def send_offsets
98
+ raise CapabilitiesExceeded
99
+ end
100
+
101
+ # The offsets into the source code for stepping in a debugger
102
+ def step_offsets
103
+ raise CapabilitiesExceeded
104
+ end
105
+
106
+ # Allows setting a breakpoint in the method, optionally at an
107
+ # offset.
108
+ def break(step_offset = 1)
109
+ raise CapabilitiesExceeded
110
+ end
111
+
112
+ # Query the method for active breakpoints.
113
+ def breakpoints
114
+ raise CapabilitiesExceeded
115
+ end
116
+
117
+ # Predicate to determine whether this method was compiled for closure
118
+ #
119
+ # @return [true, false]
120
+ def is_closure?
121
+ raise CapabilitiesExceeded
122
+ end
123
+
124
+ # The binding of the method. May be nil.
125
+ #
126
+ # @return [Binding, NilClass]
127
+ def binding
128
+ raise CapabilitiesExceeded
129
+ end
130
+
131
+ # Predicate to determine whether this method is an alias.
132
+ #
133
+ # @return [true, false]
134
+ def is_alias?
135
+ raise CapabilitiesExceeded
136
+ end
137
+
138
+ # Returns the original method to an alias, a proc, or an unbound
139
+ # method object, or the method itself, if the previous options are
140
+ # not applicable.
141
+ #
142
+ # @return [MethodMirror]
143
+ def original_method
144
+ raise CapabilitiesExceeded
145
+ end
146
+
147
+ # Predicate to determine whether a given message is send within
148
+ # this method. This should at least report all direct sends, but
149
+ # might also report sends within #evals or through #send
150
+ #
151
+ # @return [true, false]
152
+ def sends_message?(string)
153
+ raise CapabilitiesExceeded
154
+ end
155
+
156
+ # Determine whether this method references the passed name. This
157
+ # should be in a state useable enough to allow e.g. dead local
158
+ # detection.
159
+ #
160
+ # @return [true, false]
161
+ def references_name?(string)
162
+ raise CapabilitiesExceeded
163
+ end
164
+
165
+ # Each method contributes a certain percentage to the runtime of
166
+ # the system. This method can be used to query the system for the
167
+ # percentage of the mirrored method (in the range 0 < p < 1). If
168
+ # the number is closer to one, that means that the system spends a
169
+ # considerable amount of time executing this method. This method
170
+ # does not consider how often a method is called, i.e. a high
171
+ # share doesn't tell you whether the method is slow or if it is
172
+ # just called very often.
173
+ #
174
+ # @return [Time]
175
+ def execution_time_share
176
+ raise CapabilitiesExceeded
177
+ end
178
+
179
+ # The absolute, total time this method was executed (on top of the
180
+ # stack)
181
+ #
182
+ # @return [Time]
183
+ def execution_time
184
+ raise CapabilitiesExceeded
185
+ end
186
+
187
+ # The average time each method invocation executes the method,
188
+ # before returning.
189
+ #
190
+ # @return [Time]
191
+ def execution_time_average
192
+ raise CapabilitiesExceeded
193
+ end
194
+
195
+ # The number of times this method has been called. Not
196
+ # neccessarily an exact number (to allow for optimizations), but
197
+ # should at least give an indication.
198
+ #
199
+ # @return [Fixnum]
200
+ def invocation_count
201
+ raise CapabilitiesExceeded
202
+ end
203
+
204
+ # If this method was JITed, this should return the native code
205
+ # location. nil, if this method was not jitted,
206
+ # CapabilitiesExceeded should be thrown for implementations that
207
+ # do not have a JIT.
208
+ def native_code
209
+ raise CapabilitiesExceeded
210
+ end
211
+
212
+ # If this method was compiled into a VM bytecode representation,
213
+ # return an object describing the bytecode. Like #native_code,
214
+ # this should raise a CapabilitiesExceeded only for implementations
215
+ # that do not have a bytecode representation.
216
+ def bytecode
217
+ raise CapabilitiesExceeded
218
+ end
219
+
220
+ # The AST representation of this method.
221
+ def ast
222
+ raise CapabilitiesExceeded
223
+ end
224
+
225
+ def public?
226
+ raise CapabilitiesExceeded
227
+ end
228
+
229
+ def public!
230
+ raise CapabilitiesExceeded
231
+ end
232
+
233
+ def private?
234
+ raise CapabilitiesExceeded
235
+ end
236
+
237
+ def private!
238
+ raise CapabilitiesExceeded
239
+ end
240
+
241
+ def protected?
242
+ raise CapabilitiesExceeded
243
+ end
244
+
245
+ def protected!
246
+ raise CapabilitiesExceeded
247
+ end
248
+
249
+ def delete
250
+ raise CapabilitiesExceeded
251
+ end
252
+ end
253
+ end