looksee 1.0.3-universal-java-1.6 → 2.0.0-universal-java-1.6
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 +7 -0
- data/CHANGELOG +20 -0
- data/README.markdown +79 -88
- data/Rakefile +4 -0
- data/ext/extconf.rb +5 -1
- data/ext/mri/1.9.3/internal_falcon.h +248 -0
- data/ext/mri/2.0.0/internal.h +378 -0
- data/ext/mri/2.0.0/method.h +138 -0
- data/ext/mri/2.1.0/internal.h +889 -0
- data/ext/mri/2.1.0/method.h +142 -0
- data/ext/mri/mri.c +36 -5
- data/lib/looksee/JRuby.jar +0 -0
- data/lib/looksee/adapter/rubinius.rb +10 -5
- data/lib/looksee/clean.rb +4 -0
- data/lib/looksee/core_ext.rb +17 -24
- data/lib/looksee/editor.rb +8 -2
- data/lib/looksee/help.rb +1 -1
- data/lib/looksee/inspector.rb +15 -0
- data/lib/looksee/version.rb +1 -1
- data/spec/adapter_spec.rb +13 -7
- data/spec/editor_spec.rb +75 -93
- data/spec/spec_helper.rb +3 -7
- data/spec/support/temporary_classes.rb +1 -25
- data/spec/wirble_compatibility_spec.rb +2 -3
- metadata +104 -141
@@ -0,0 +1,142 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
method.h -
|
4
|
+
|
5
|
+
$Author: tmm1 $
|
6
|
+
created at: Wed Jul 15 20:02:33 2009
|
7
|
+
|
8
|
+
Copyright (C) 2009 Koichi Sasada
|
9
|
+
|
10
|
+
**********************************************************************/
|
11
|
+
#ifndef METHOD_H
|
12
|
+
#define METHOD_H
|
13
|
+
|
14
|
+
#include "internal.h"
|
15
|
+
|
16
|
+
#ifndef END_OF_ENUMERATION
|
17
|
+
# if defined(__GNUC__) &&! defined(__STRICT_ANSI__)
|
18
|
+
# define END_OF_ENUMERATION(key)
|
19
|
+
# else
|
20
|
+
# define END_OF_ENUMERATION(key) END_OF_##key##_PLACEHOLDER = 0
|
21
|
+
# endif
|
22
|
+
#endif
|
23
|
+
|
24
|
+
typedef enum {
|
25
|
+
NOEX_PUBLIC = 0x00,
|
26
|
+
NOEX_NOSUPER = 0x01,
|
27
|
+
NOEX_PRIVATE = 0x02,
|
28
|
+
NOEX_PROTECTED = 0x04,
|
29
|
+
NOEX_MASK = 0x06,
|
30
|
+
NOEX_BASIC = 0x08,
|
31
|
+
NOEX_UNDEF = NOEX_NOSUPER,
|
32
|
+
NOEX_MODFUNC = 0x12,
|
33
|
+
NOEX_SUPER = 0x20,
|
34
|
+
NOEX_VCALL = 0x40,
|
35
|
+
NOEX_RESPONDS = 0x80,
|
36
|
+
|
37
|
+
NOEX_BIT_WIDTH = 8,
|
38
|
+
NOEX_SAFE_SHIFT_OFFSET = ((NOEX_BIT_WIDTH+3)/4)*4 /* round up to nibble */
|
39
|
+
} rb_method_flag_t;
|
40
|
+
|
41
|
+
#define NOEX_SAFE(n) ((int)((n) >> NOEX_SAFE_SHIFT_OFFSET) & 0x0F)
|
42
|
+
#define NOEX_WITH(n, s) (((s) << NOEX_SAFE_SHIFT_OFFSET) | (n) | (ruby_running ? 0 : NOEX_BASIC))
|
43
|
+
#define NOEX_WITH_SAFE(n) NOEX_WITH((n), rb_safe_level())
|
44
|
+
|
45
|
+
/* method data type */
|
46
|
+
|
47
|
+
typedef enum {
|
48
|
+
VM_METHOD_TYPE_ISEQ,
|
49
|
+
VM_METHOD_TYPE_CFUNC,
|
50
|
+
VM_METHOD_TYPE_ATTRSET,
|
51
|
+
VM_METHOD_TYPE_IVAR,
|
52
|
+
VM_METHOD_TYPE_BMETHOD,
|
53
|
+
VM_METHOD_TYPE_ZSUPER,
|
54
|
+
VM_METHOD_TYPE_UNDEF,
|
55
|
+
VM_METHOD_TYPE_NOTIMPLEMENTED,
|
56
|
+
VM_METHOD_TYPE_OPTIMIZED, /* Kernel#send, Proc#call, etc */
|
57
|
+
VM_METHOD_TYPE_MISSING, /* wrapper for method_missing(id) */
|
58
|
+
VM_METHOD_TYPE_REFINED,
|
59
|
+
|
60
|
+
END_OF_ENUMERATION(VM_METHOD_TYPE)
|
61
|
+
} rb_method_type_t;
|
62
|
+
|
63
|
+
struct rb_call_info_struct;
|
64
|
+
|
65
|
+
typedef struct rb_method_cfunc_struct {
|
66
|
+
VALUE (*func)(ANYARGS);
|
67
|
+
VALUE (*invoker)(VALUE (*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv);
|
68
|
+
int argc;
|
69
|
+
} rb_method_cfunc_t;
|
70
|
+
|
71
|
+
typedef struct rb_method_attr_struct {
|
72
|
+
ID id;
|
73
|
+
const VALUE location;
|
74
|
+
} rb_method_attr_t;
|
75
|
+
|
76
|
+
typedef struct rb_iseq_struct rb_iseq_t;
|
77
|
+
|
78
|
+
typedef struct rb_method_definition_struct {
|
79
|
+
rb_method_type_t type; /* method type */
|
80
|
+
ID original_id;
|
81
|
+
union {
|
82
|
+
rb_iseq_t * const iseq; /* should be mark */
|
83
|
+
rb_method_cfunc_t cfunc;
|
84
|
+
rb_method_attr_t attr;
|
85
|
+
const VALUE proc; /* should be mark */
|
86
|
+
enum method_optimized_type {
|
87
|
+
OPTIMIZED_METHOD_TYPE_SEND,
|
88
|
+
OPTIMIZED_METHOD_TYPE_CALL,
|
89
|
+
|
90
|
+
OPTIMIZED_METHOD_TYPE__MAX
|
91
|
+
} optimize_type;
|
92
|
+
struct rb_method_entry_struct *orig_me;
|
93
|
+
} body;
|
94
|
+
int alias_count;
|
95
|
+
} rb_method_definition_t;
|
96
|
+
|
97
|
+
typedef struct rb_method_entry_struct {
|
98
|
+
rb_method_flag_t flag;
|
99
|
+
char mark;
|
100
|
+
rb_method_definition_t *def;
|
101
|
+
ID called_id;
|
102
|
+
VALUE klass; /* should be mark */
|
103
|
+
} rb_method_entry_t;
|
104
|
+
|
105
|
+
struct unlinked_method_entry_list_entry {
|
106
|
+
struct unlinked_method_entry_list_entry *next;
|
107
|
+
rb_method_entry_t *me;
|
108
|
+
};
|
109
|
+
|
110
|
+
#define UNDEFINED_METHOD_ENTRY_P(me) (!(me) || !(me)->def || (me)->def->type == VM_METHOD_TYPE_UNDEF)
|
111
|
+
|
112
|
+
void rb_add_method_cfunc(VALUE klass, ID mid, VALUE (*func)(ANYARGS), int argc, rb_method_flag_t noex);
|
113
|
+
rb_method_entry_t *rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_flag_t noex);
|
114
|
+
rb_method_entry_t *rb_method_entry(VALUE klass, ID id, VALUE *define_class_ptr);
|
115
|
+
rb_method_entry_t *rb_method_entry_at(VALUE obj, ID id);
|
116
|
+
void rb_add_refined_method_entry(VALUE refined_class, ID mid);
|
117
|
+
rb_method_entry_t *rb_resolve_refined_method(VALUE refinements,
|
118
|
+
const rb_method_entry_t *me,
|
119
|
+
VALUE *defined_class_ptr);
|
120
|
+
rb_method_entry_t *rb_method_entry_with_refinements(VALUE klass, ID id,
|
121
|
+
VALUE *defined_class_ptr);
|
122
|
+
rb_method_entry_t *rb_method_entry_without_refinements(VALUE klass, ID id,
|
123
|
+
VALUE *defined_class_ptr);
|
124
|
+
|
125
|
+
rb_method_entry_t *rb_method_entry_get_without_cache(VALUE klass, ID id, VALUE *define_class_ptr);
|
126
|
+
rb_method_entry_t *rb_method_entry_set(VALUE klass, ID mid, const rb_method_entry_t *, rb_method_flag_t noex);
|
127
|
+
|
128
|
+
int rb_method_entry_arity(const rb_method_entry_t *me);
|
129
|
+
int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2);
|
130
|
+
st_index_t rb_hash_method_entry(st_index_t hash, const rb_method_entry_t *me);
|
131
|
+
|
132
|
+
VALUE rb_method_entry_location(rb_method_entry_t *me);
|
133
|
+
VALUE rb_mod_method_location(VALUE mod, ID id);
|
134
|
+
VALUE rb_obj_method_location(VALUE obj, ID id);
|
135
|
+
|
136
|
+
void rb_mark_method_entry(const rb_method_entry_t *me);
|
137
|
+
void rb_free_method_entry(rb_method_entry_t *me);
|
138
|
+
void rb_sweep_method_entry(void *vm);
|
139
|
+
void rb_free_m_tbl(st_table *tbl);
|
140
|
+
void rb_free_m_tbl_wrapper(struct method_table_wrapper *wrapper);
|
141
|
+
|
142
|
+
#endif /* METHOD_H */
|
data/ext/mri/mri.c
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
#include "ruby.h"
|
2
2
|
|
3
|
-
#if RUBY_VERSION >=
|
3
|
+
#if RUBY_VERSION >= 200
|
4
|
+
# include "method.h"
|
4
5
|
# include "internal.h"
|
6
|
+
#elif RUBY_VERSION >= 193
|
7
|
+
# include "ruby/st.h"
|
8
|
+
# ifdef SA_EMPTY
|
9
|
+
# include "internal_falcon.h"
|
10
|
+
# define Looksee_method_table_foreach sa_foreach
|
11
|
+
# define Looksee_method_table_lookup sa_lookup
|
12
|
+
# else
|
13
|
+
# include "internal.h"
|
14
|
+
# endif
|
5
15
|
# include "vm_core.h"
|
6
16
|
# include "method.h"
|
7
|
-
# include "ruby/st.h"
|
8
17
|
#elif RUBY_VERSION >= 192
|
9
18
|
# include "vm_core.h"
|
10
19
|
# include "method.h"
|
@@ -17,6 +26,11 @@
|
|
17
26
|
# include "st.h"
|
18
27
|
#endif
|
19
28
|
|
29
|
+
#ifndef Looksee_method_table_foreach
|
30
|
+
# define Looksee_method_table_foreach st_foreach
|
31
|
+
# define Looksee_method_table_lookup st_lookup
|
32
|
+
#endif
|
33
|
+
|
20
34
|
#if RUBY_VERSION < 187
|
21
35
|
# define RCLASS_IV_TBL(c) (RCLASS(c)->iv_tbl)
|
22
36
|
# define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
|
@@ -77,8 +91,10 @@ typedef struct add_method_if_matching_arg {
|
|
77
91
|
} add_method_if_matching_arg_t;
|
78
92
|
|
79
93
|
static int add_method_if_matching(ID method_name, rb_method_entry_t *me, add_method_if_matching_arg_t *arg) {
|
94
|
+
# ifdef ID_ALLOCATOR
|
80
95
|
if (method_name == ID_ALLOCATOR)
|
81
96
|
return ST_CONTINUE;
|
97
|
+
# endif
|
82
98
|
|
83
99
|
if (UNDEFINED_METHOD_ENTRY_P(me))
|
84
100
|
return ST_CONTINUE;
|
@@ -90,6 +106,12 @@ static int add_method_if_matching(ID method_name, rb_method_entry_t *me, add_met
|
|
90
106
|
}
|
91
107
|
|
92
108
|
static int add_method_if_undefined(ID method_name, rb_method_entry_t *me, VALUE *names) {
|
109
|
+
# ifdef ID_ALLOCATOR
|
110
|
+
/* The allocator can be undefined with rb_undef_alloc_func, e.g. Struct. */
|
111
|
+
if (method_name == ID_ALLOCATOR)
|
112
|
+
return ST_CONTINUE;
|
113
|
+
# endif
|
114
|
+
|
93
115
|
if (UNDEFINED_METHOD_ENTRY_P(me))
|
94
116
|
rb_ary_push(*names, ID2SYM(method_name));
|
95
117
|
return ST_CONTINUE;
|
@@ -111,9 +133,11 @@ typedef struct add_method_if_matching_arg {
|
|
111
133
|
} add_method_if_matching_arg_t;
|
112
134
|
|
113
135
|
static int add_method_if_matching(ID method_name, NODE *body, add_method_if_matching_arg_t *arg) {
|
136
|
+
# ifdef ID_ALLOCATOR
|
114
137
|
/* This entry is for the internal allocator function. */
|
115
138
|
if (method_name == ID_ALLOCATOR)
|
116
139
|
return ST_CONTINUE;
|
140
|
+
# endif
|
117
141
|
|
118
142
|
/* Module#undef_method:
|
119
143
|
* * sets body->nd_body to NULL in ruby <= 1.8
|
@@ -128,6 +152,12 @@ static int add_method_if_matching(ID method_name, NODE *body, add_method_if_matc
|
|
128
152
|
}
|
129
153
|
|
130
154
|
static int add_method_if_undefined(ID method_name, NODE *body, VALUE *names) {
|
155
|
+
# ifdef ID_ALLOCATOR
|
156
|
+
/* The allocator can be undefined with rb_undef_alloc_func, e.g. Struct. */
|
157
|
+
if (method_name == ID_ALLOCATOR)
|
158
|
+
return ST_CONTINUE;
|
159
|
+
# endif
|
160
|
+
|
131
161
|
if (!body || !body->nd_body)
|
132
162
|
rb_ary_push(*names, ID2SYM(method_name));
|
133
163
|
return ST_CONTINUE;
|
@@ -139,7 +169,8 @@ static VALUE internal_instance_methods(VALUE klass, VISIBILITY_TYPE visibility)
|
|
139
169
|
add_method_if_matching_arg_t arg;
|
140
170
|
arg.names = rb_ary_new();
|
141
171
|
arg.visibility = visibility;
|
142
|
-
|
172
|
+
|
173
|
+
Looksee_method_table_foreach(RCLASS_M_TBL(klass), add_method_if_matching, (st_data_t)&arg);
|
143
174
|
return arg.names;
|
144
175
|
}
|
145
176
|
|
@@ -173,7 +204,7 @@ VALUE Looksee_internal_private_instance_methods(VALUE self, VALUE klass) {
|
|
173
204
|
*/
|
174
205
|
VALUE Looksee_internal_undefined_instance_methods(VALUE self, VALUE klass) {
|
175
206
|
VALUE names = rb_ary_new();
|
176
|
-
|
207
|
+
Looksee_method_table_foreach(RCLASS_M_TBL(klass), add_method_if_undefined, (st_data_t)&names);
|
177
208
|
return names;
|
178
209
|
}
|
179
210
|
|
@@ -184,7 +215,7 @@ VALUE Looksee_singleton_class_p(VALUE self, VALUE object) {
|
|
184
215
|
VALUE Looksee_singleton_instance(VALUE self, VALUE singleton_class) {
|
185
216
|
if (BUILTIN_TYPE(singleton_class) == T_CLASS && FL_TEST(singleton_class, FL_SINGLETON)) {
|
186
217
|
VALUE object;
|
187
|
-
if (!
|
218
|
+
if (!Looksee_method_table_lookup(RCLASS_IV_TBL(singleton_class), rb_intern("__attached__"), (st_data_t *)&object))
|
188
219
|
rb_raise(rb_eRuntimeError, "[looksee bug] can't find singleton object");
|
189
220
|
return object;
|
190
221
|
} else {
|
data/lib/looksee/JRuby.jar
CHANGED
Binary file
|
@@ -30,26 +30,31 @@ module Looksee
|
|
30
30
|
|
31
31
|
def internal_undefined_instance_methods(mod)
|
32
32
|
names = []
|
33
|
-
mod.method_table.
|
34
|
-
names <<
|
33
|
+
mod.method_table.entries.each do |(name, method, visibility)|
|
34
|
+
names << name if visibility.equal?(:undef)
|
35
35
|
end
|
36
36
|
names
|
37
37
|
end
|
38
38
|
|
39
39
|
def singleton_class?(object)
|
40
|
-
object.is_a?(Class) && object
|
40
|
+
object.is_a?(Class) && !!::Rubinius::Type.singleton_class_object(object)
|
41
41
|
end
|
42
42
|
|
43
43
|
def singleton_instance(singleton_class)
|
44
44
|
singleton_class?(singleton_class) or
|
45
45
|
raise TypeError, "expected singleton class, got #{singleton_class.class}"
|
46
|
-
singleton_class
|
46
|
+
::Rubinius::Type.singleton_class_object(singleton_class)
|
47
47
|
end
|
48
48
|
|
49
49
|
def module_name(mod)
|
50
50
|
mod.is_a?(Module) or
|
51
51
|
raise TypeError, "expected module, got #{mod.class}"
|
52
|
-
|
52
|
+
|
53
|
+
if ::Rubinius::Type.respond_to?(:module_name)
|
54
|
+
::Rubinius::Type.module_name(mod) || ''
|
55
|
+
else
|
56
|
+
mod.__name__
|
57
|
+
end
|
53
58
|
end
|
54
59
|
|
55
60
|
def source_location(method)
|
data/lib/looksee/clean.rb
CHANGED
@@ -4,6 +4,10 @@ require 'set'
|
|
4
4
|
module Looksee
|
5
5
|
Config = Object.const_defined?(:RbConfig) ? ::RbConfig : ::Config
|
6
6
|
|
7
|
+
NoMethodError = Class.new(RuntimeError)
|
8
|
+
NoSourceLocationError = Class.new(RuntimeError)
|
9
|
+
NoSourceFileError = Class.new(RuntimeError)
|
10
|
+
|
7
11
|
autoload :VERSION, 'looksee/version'
|
8
12
|
autoload :Adapter, 'looksee/adapter'
|
9
13
|
autoload :Columnizer, 'looksee/columnizer'
|
data/lib/looksee/core_ext.rb
CHANGED
@@ -42,38 +42,31 @@ module Looksee
|
|
42
42
|
Inspector.new(lookup_path, options)
|
43
43
|
end
|
44
44
|
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
#
|
50
|
-
# Only works for methods for which file and line numbers are
|
51
|
-
# accessible.
|
52
|
-
#
|
53
|
-
def edit(name)
|
54
|
-
Editor.new(Looksee.editor).edit(self, name)
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.rename(renamings) # :nodoc:
|
58
|
-
renamings.each do |old_name, new_name|
|
59
|
-
alias_method new_name, old_name
|
60
|
-
remove_method old_name
|
61
|
-
end
|
45
|
+
def self.rename(name) # :nodoc:
|
46
|
+
name = name[:ls] if name.is_a?(Hash)
|
47
|
+
alias_method name, :ls
|
48
|
+
remove_method :ls
|
62
49
|
end
|
63
50
|
end
|
64
51
|
|
65
52
|
#
|
66
|
-
# Rename the
|
53
|
+
# Rename the #ls method, added to every object. Example:
|
54
|
+
#
|
55
|
+
# rename :_ls
|
56
|
+
#
|
57
|
+
# This renames Looksee's #ls method to #_ls.
|
67
58
|
#
|
68
|
-
#
|
59
|
+
# For backward compatibility, the old-style invocation is also
|
60
|
+
# supported. Please note this is deprecated.
|
69
61
|
#
|
70
|
-
|
71
|
-
|
62
|
+
# rename :ls => :_ls
|
63
|
+
#
|
64
|
+
def self.rename(name)
|
65
|
+
ObjectMixin.rename(name)
|
72
66
|
end
|
73
67
|
|
74
|
-
|
75
|
-
rename
|
76
|
-
end
|
68
|
+
name = ENV['LOOKSEE_METHOD'] and
|
69
|
+
rename name
|
77
70
|
|
78
71
|
Object.send :include, ObjectMixin
|
79
72
|
end
|
data/lib/looksee/editor.rb
CHANGED
@@ -14,9 +14,15 @@ module Looksee
|
|
14
14
|
#
|
15
15
|
def edit(object, method_name)
|
16
16
|
method = LookupPath.new(object).find(method_name.to_s) or
|
17
|
-
|
17
|
+
raise NoMethodError, "no method `#{method_name}' in lookup path of #{object.class} instance"
|
18
18
|
file, line = Looksee.adapter.source_location(method)
|
19
|
-
|
19
|
+
if !file
|
20
|
+
raise NoSourceLocationError, "no source location for #{method.owner}##{method.name}"
|
21
|
+
elsif !File.exist?(file)
|
22
|
+
raise NoSourceFileError, "cannot find source file: #{file}"
|
23
|
+
else
|
24
|
+
run(file, line)
|
25
|
+
end
|
20
26
|
end
|
21
27
|
|
22
28
|
#
|
data/lib/looksee/help.rb
CHANGED
data/lib/looksee/inspector.rb
CHANGED
@@ -11,12 +11,27 @@ module Looksee
|
|
11
11
|
attr_reader :visibilities
|
12
12
|
attr_reader :filters
|
13
13
|
|
14
|
+
#
|
15
|
+
# Print the method lookup path of self. See the README for details.
|
16
|
+
#
|
14
17
|
def inspect
|
15
18
|
lookup_path.entries.reverse.map do |entry|
|
16
19
|
inspect_entry(entry)
|
17
20
|
end.join("\n")
|
18
21
|
end
|
19
22
|
|
23
|
+
#
|
24
|
+
# Open an editor at the named method's definition.
|
25
|
+
#
|
26
|
+
# Uses Looksee.editor to determine the editor command to run.
|
27
|
+
#
|
28
|
+
# Only works for methods for which file and line numbers are
|
29
|
+
# accessible.
|
30
|
+
#
|
31
|
+
def edit(name)
|
32
|
+
Editor.new(Looksee.editor).edit(lookup_path.object, name)
|
33
|
+
end
|
34
|
+
|
20
35
|
private
|
21
36
|
|
22
37
|
def inspect_entry(entry)
|
data/lib/looksee/version.rb
CHANGED
data/spec/adapter_spec.rb
CHANGED
@@ -95,33 +95,33 @@ describe "Looksee.adapter" do
|
|
95
95
|
def self.it_should_list_methods_with_visibility(visibility)
|
96
96
|
it "should return the list of #{visibility} instance methods defined directly on a class" do
|
97
97
|
temporary_class :C
|
98
|
-
|
98
|
+
add_methods C, visibility => [:one, :two]
|
99
99
|
@adapter.send(target_method, C).to_set.should == Set[:one, :two]
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should return the list of #{visibility} instance methods defined directly on a module" do
|
103
103
|
temporary_module :M
|
104
|
-
|
104
|
+
add_methods M, visibility => [:one, :two]
|
105
105
|
@adapter.send(target_method, M).to_set.should == Set[:one, :two]
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should return the list of #{visibility} instance methods defined directly on a singleton class" do
|
109
109
|
temporary_class :C
|
110
110
|
c = C.new
|
111
|
-
|
111
|
+
add_methods c.singleton_class, visibility => [:one, :two]
|
112
112
|
@adapter.send(target_method, c.singleton_class).to_set.should == Set[:one, :two]
|
113
113
|
end
|
114
114
|
|
115
115
|
it "should return the list of #{visibility} instance methods defined directly on a class' singleton class" do
|
116
116
|
temporary_class :C
|
117
|
-
|
117
|
+
add_methods C.singleton_class, visibility => [:one, :two], :class_singleton => true
|
118
118
|
@adapter.send(target_method, C.singleton_class).to_set.should == Set[:one, :two]
|
119
119
|
end
|
120
120
|
|
121
121
|
# Worth checking as ruby keeps undef'd methods in method tables.
|
122
122
|
it "should not return undefined methods" do
|
123
123
|
temporary_class :C
|
124
|
-
|
124
|
+
add_methods C, visibility => [:removed]
|
125
125
|
C.send(:undef_method, :removed)
|
126
126
|
@adapter.send(target_method, C).to_set.should == Set[]
|
127
127
|
end
|
@@ -130,7 +130,7 @@ describe "Looksee.adapter" do
|
|
130
130
|
def self.it_should_not_list_methods_with_visibility(visibility1, visibility2)
|
131
131
|
it "should not return any #{visibility1} or #{visibility2} instance methods" do
|
132
132
|
temporary_class :C
|
133
|
-
|
133
|
+
add_methods C, {visibility1 => [:a], visibility2 => [:b]}
|
134
134
|
@adapter.send(target_method, C).to_set.should == Set[]
|
135
135
|
end
|
136
136
|
end
|
@@ -195,6 +195,11 @@ describe "Looksee.adapter" do
|
|
195
195
|
C.send(:remove_method, :f)
|
196
196
|
@adapter.internal_undefined_instance_methods(C).should == []
|
197
197
|
end
|
198
|
+
|
199
|
+
it "should handle the MRI allocator being undefined (e.g. Struct)" do
|
200
|
+
struct_singleton_class = (class << Struct; self; end)
|
201
|
+
@adapter.internal_undefined_instance_methods(struct_singleton_class).should == []
|
202
|
+
end
|
198
203
|
end
|
199
204
|
end
|
200
205
|
|
@@ -431,7 +436,8 @@ describe "Looksee.adapter" do
|
|
431
436
|
describe "#source_location" do
|
432
437
|
def load_source(source)
|
433
438
|
@tmp = "#{ROOT}/spec/tmp"
|
434
|
-
|
439
|
+
# rbx 1.2.3 caches the file content by file name - ensure file names are different.
|
440
|
+
@source_path = "#@tmp/c#{__id__}.rb"
|
435
441
|
FileUtils.mkdir_p @tmp
|
436
442
|
open(@source_path, 'w') { |f| f.print source }
|
437
443
|
load @source_path
|