texplay 0.3.5 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +222 -222
- data/README.markdown +43 -43
- data/Rakefile +3 -99
- data/examples/common.rb +18 -18
- data/examples/example_alpha_blend.rb +29 -29
- data/examples/example_bezier.rb +41 -41
- data/examples/example_blank.rb +37 -37
- data/examples/example_cache.rb +21 -21
- data/examples/example_color_control.rb +69 -69
- data/examples/example_color_transform.rb +62 -62
- data/examples/example_color_transform_circle.rb +34 -34
- data/examples/example_darken.rb +24 -24
- data/examples/example_dup.rb +73 -73
- data/examples/example_each.rb +39 -39
- data/examples/example_effect.rb +34 -34
- data/examples/example_fill.rb +43 -43
- data/examples/example_fill_old.rb +48 -48
- data/examples/example_fluent.rb +29 -29
- data/examples/example_font.rb +31 -31
- data/examples/example_hash_arguments.rb +46 -46
- data/examples/example_ippa.rb +23 -23
- data/examples/example_light.rb +75 -75
- data/examples/example_light_multiply.rb +18 -18
- data/examples/example_lsystem.rb +61 -61
- data/examples/example_melt.rb +25 -25
- data/examples/example_meyet.rb +62 -62
- data/examples/example_polyline.rb +42 -42
- data/examples/example_scale.rb +27 -27
- data/examples/example_select.rb +36 -36
- data/examples/example_select2.rb +25 -25
- data/examples/example_simple.rb +46 -46
- data/examples/example_splice.rb +26 -26
- data/examples/example_sync.rb +59 -59
- data/examples/example_tiles.rb +41 -41
- data/examples/example_trace.rb +22 -22
- data/examples/example_transparent.rb +28 -28
- data/examples/example_transparent2.rb +24 -24
- data/examples/example_transparent3.rb +20 -20
- data/examples/example_turtle.rb +39 -39
- data/examples/example_weird.rb +22 -22
- data/examples/example_window_render_to_image.rb +41 -41
- data/examples/example_window_to_blob.rb +35 -35
- data/examples/media/maria.png +0 -0
- data/examples/media/rose.bmp +0 -0
- data/ext/texplay/actions.c +1006 -1006
- data/ext/texplay/actions.h +60 -60
- data/ext/texplay/bindings.c +1125 -1186
- data/ext/texplay/bindings.h +46 -46
- data/ext/texplay/cache.c +118 -118
- data/ext/texplay/cache.h +24 -24
- data/ext/texplay/compat.h +27 -27
- data/ext/texplay/extconf.rb +28 -28
- data/ext/texplay/graphics_utils.c +1313 -1313
- data/ext/texplay/graphics_utils.h +22 -22
- data/ext/texplay/texplay.c +201 -216
- data/ext/texplay/texplay.h +153 -153
- data/ext/texplay/utils.c +891 -891
- data/ext/texplay/utils.h +153 -153
- data/lib/texplay-contrib.rb +147 -164
- data/lib/texplay.rb +341 -356
- data/lib/texplay/alone.rb +20 -20
- data/lib/texplay/c_function_docs.rb +178 -190
- data/lib/texplay/live.rb +84 -84
- data/lib/texplay/version.rb +3 -3
- data/live/live.rb +85 -85
- data/test/image_spec.rb +45 -45
- data/test/texplay_spec.rb +144 -141
- metadata +54 -42
- data/examples/example_gen_eval.rb +0 -32
- data/ext/texplay/gen_eval.c +0 -211
- data/ext/texplay/gen_eval.h +0 -20
- data/ext/texplay/object2module.c +0 -171
- data/ext/texplay/object2module.h +0 -11
metadata
CHANGED
@@ -1,46 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: texplay
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.5
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: "0.4"
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- John Mair (banisterfiend)
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
|
13
|
+
date: 2011-11-08 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
16
|
name: gosu
|
17
|
-
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
19
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
22
23
|
version: 0.7.25
|
23
24
|
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
24
28
|
prerelease: false
|
25
|
-
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: bacon
|
28
|
-
requirement: &16942356 !ruby/object:Gem::Requirement
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
30
|
none: false
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.0.0
|
34
35
|
type: :development
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake-compiler
|
35
39
|
prerelease: false
|
36
|
-
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.7.9
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
37
48
|
description: TexPlay is a light-weight image manipulation framework for Ruby and Gosu
|
38
|
-
email:
|
49
|
+
email:
|
50
|
+
- jrmair@gmail.com
|
39
51
|
executables: []
|
40
|
-
|
52
|
+
|
53
|
+
extensions:
|
41
54
|
- ext/texplay/extconf.rb
|
42
55
|
extra_rdoc_files: []
|
43
|
-
|
56
|
+
|
57
|
+
files:
|
44
58
|
- Rakefile
|
45
59
|
- README.markdown
|
46
60
|
- CHANGELOG
|
@@ -55,17 +69,13 @@ files:
|
|
55
69
|
- ext/texplay/bindings.h
|
56
70
|
- ext/texplay/cache.h
|
57
71
|
- ext/texplay/compat.h
|
58
|
-
- ext/texplay/gen_eval.h
|
59
72
|
- ext/texplay/graphics_utils.h
|
60
|
-
- ext/texplay/object2module.h
|
61
73
|
- ext/texplay/texplay.h
|
62
74
|
- ext/texplay/utils.h
|
63
75
|
- ext/texplay/actions.c
|
64
76
|
- ext/texplay/bindings.c
|
65
77
|
- ext/texplay/cache.c
|
66
|
-
- ext/texplay/gen_eval.c
|
67
78
|
- ext/texplay/graphics_utils.c
|
68
|
-
- ext/texplay/object2module.c
|
69
79
|
- ext/texplay/texplay.c
|
70
80
|
- ext/texplay/utils.c
|
71
81
|
- examples/common.rb
|
@@ -84,7 +94,6 @@ files:
|
|
84
94
|
- examples/example_fill_old.rb
|
85
95
|
- examples/example_fluent.rb
|
86
96
|
- examples/example_font.rb
|
87
|
-
- examples/example_gen_eval.rb
|
88
97
|
- examples/example_hash_arguments.rb
|
89
98
|
- examples/example_ippa.rb
|
90
99
|
- examples/example_light.rb
|
@@ -126,29 +135,32 @@ files:
|
|
126
135
|
- test/texplay_spec.rb
|
127
136
|
- live/live.rb
|
128
137
|
- .gemtest
|
129
|
-
has_rdoc: true
|
130
138
|
homepage: http://banisterfiend.wordpress.com/2008/08/23/texplay-an-image-manipulation-tool-for-ruby-and-gosu/
|
131
139
|
licenses: []
|
140
|
+
|
132
141
|
post_install_message:
|
133
142
|
rdoc_options: []
|
134
|
-
|
143
|
+
|
144
|
+
require_paths:
|
135
145
|
- lib
|
136
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
146
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
147
|
none: false
|
138
|
-
requirements:
|
139
|
-
- -
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version:
|
142
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: "0"
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
153
|
none: false
|
144
|
-
requirements:
|
145
|
-
- -
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
version:
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: "0"
|
148
158
|
requirements: []
|
159
|
+
|
149
160
|
rubyforge_project:
|
150
|
-
rubygems_version: 1.
|
161
|
+
rubygems_version: 1.8.11
|
151
162
|
signing_key:
|
152
163
|
specification_version: 3
|
153
164
|
summary: TexPlay is a light-weight image manipulation framework for Ruby and Gosu
|
154
165
|
test_files: []
|
166
|
+
|
@@ -1,32 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__))
|
2
|
-
require 'common'
|
3
|
-
|
4
|
-
|
5
|
-
class W < Gosu::Window
|
6
|
-
def initialize
|
7
|
-
super(500, 500, false, 20)
|
8
|
-
@img = Gosu::Image.new(self, "#{Common::MEDIA}/empty2.png")
|
9
|
-
|
10
|
-
@width = @img.width
|
11
|
-
@height = @img.height
|
12
|
-
|
13
|
-
# turn alpha blending and filling on
|
14
|
-
@img.set_options :alpha_blend => true, :fill => true
|
15
|
-
end
|
16
|
-
def draw
|
17
|
-
|
18
|
-
# Gen_eval lets us use local instance vars within the block
|
19
|
-
# even though the block appears to be getting instance_eval'd
|
20
|
-
# for more information see gen_eval.c and object2module.c
|
21
|
-
@img.paint {
|
22
|
-
rect @width * rand, @height * rand, @width * rand, @height * rand,
|
23
|
-
:color => [rand, rand ,rand, rand]
|
24
|
-
}
|
25
|
-
|
26
|
-
@img.draw 0, 0,1
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
w = W.new
|
31
|
-
w.show
|
32
|
-
|
data/ext/texplay/gen_eval.c
DELETED
@@ -1,211 +0,0 @@
|
|
1
|
-
/* gen_eval.c */
|
2
|
-
/* (C) John Mair 2009
|
3
|
-
* This program is distributed under the terms of the MIT License
|
4
|
-
* */
|
5
|
-
|
6
|
-
#include <ruby.h>
|
7
|
-
#include "object2module.h"
|
8
|
-
#include "compat.h"
|
9
|
-
|
10
|
-
VALUE
|
11
|
-
retrieve_hidden_self(VALUE duped_context)
|
12
|
-
{
|
13
|
-
VALUE thread_id, unique_name, hidden_self;
|
14
|
-
|
15
|
-
/* retrieve hidden self (if it exists) */
|
16
|
-
thread_id = rb_funcall(rb_obj_id(rb_thread_current()), rb_intern("to_s"), 0);
|
17
|
-
unique_name = rb_str_plus(rb_str_new2("__hidden_self__"), thread_id);
|
18
|
-
|
19
|
-
hidden_self = rb_ivar_get(duped_context, rb_to_id(unique_name));
|
20
|
-
|
21
|
-
return hidden_self;
|
22
|
-
}
|
23
|
-
|
24
|
-
void
|
25
|
-
set_hidden_self(VALUE duped_context, VALUE hidden_self)
|
26
|
-
{
|
27
|
-
VALUE thread_id, unique_name;
|
28
|
-
|
29
|
-
/* generate a unique (thread safe) name for the hidden self */
|
30
|
-
thread_id = rb_funcall(rb_obj_id(rb_thread_current()), rb_intern("to_s"), 0);
|
31
|
-
unique_name = rb_str_plus(rb_str_new2("__hidden_self__"), thread_id);
|
32
|
-
|
33
|
-
/* store self in hidden var in duped context */
|
34
|
-
rb_ivar_set(duped_context, rb_to_id(unique_name), hidden_self);
|
35
|
-
}
|
36
|
-
|
37
|
-
VALUE
|
38
|
-
rb_capture(VALUE self) {
|
39
|
-
VALUE hidden_self;
|
40
|
-
VALUE result;
|
41
|
-
|
42
|
-
rb_need_block();
|
43
|
-
|
44
|
-
hidden_self = retrieve_hidden_self(self);
|
45
|
-
|
46
|
-
/* 2 cases: (1) if rb_gen_eval is active then instance_eval wrt hidden_self
|
47
|
-
(2) otherwise simply yield to the block
|
48
|
-
*/
|
49
|
-
if(!NIL_P(hidden_self))
|
50
|
-
result = rb_obj_instance_eval(0, 0, hidden_self);
|
51
|
-
else
|
52
|
-
result = rb_yield(Qnil);
|
53
|
-
|
54
|
-
/* we want the return value of capture to be the return value of the block */
|
55
|
-
return result;
|
56
|
-
}
|
57
|
-
|
58
|
-
/** ruby 1.9 funcs **/
|
59
|
-
#ifdef RUBY_19
|
60
|
-
void
|
61
|
-
redirect_iv_for_object(VALUE obj, VALUE dest)
|
62
|
-
{
|
63
|
-
if(TYPE(obj) != T_OBJECT)
|
64
|
-
rb_raise(rb_eArgError, "must provide a T_OBJECT");
|
65
|
-
|
66
|
-
if (!(RBASIC(dest)->flags & ROBJECT_EMBED) && ROBJECT_IVPTR(dest)) {
|
67
|
-
rb_raise(rb_eArgError, "im sorry gen_eval does not yet work with this type of ROBJECT");
|
68
|
-
}
|
69
|
-
if (RBASIC(obj)->flags & ROBJECT_EMBED) {
|
70
|
-
rb_raise(rb_eArgError, "im sorry gen_eval does not yet work with ROBJECT_EMBED types");
|
71
|
-
}
|
72
|
-
else {
|
73
|
-
ROBJECT(dest)->as.heap.ivptr = ROBJECT(obj)->as.heap.ivptr;
|
74
|
-
ROBJECT(dest)->as.heap.numiv = ROBJECT(obj)->as.heap.numiv;
|
75
|
-
ROBJECT(dest)->as.heap.iv_index_tbl = ROBJECT(obj)->as.heap.iv_index_tbl;
|
76
|
-
RBASIC(dest)->flags &= ~ROBJECT_EMBED;
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
void
|
81
|
-
release_iv_for_object(VALUE obj)
|
82
|
-
{
|
83
|
-
if(TYPE(obj) != T_OBJECT)
|
84
|
-
rb_raise(rb_eArgError, "must provide a T_OBJECT");
|
85
|
-
|
86
|
-
ROBJECT(obj)->as.heap.ivptr = (void *) 0;
|
87
|
-
ROBJECT(obj)->as.heap.numiv = 0;
|
88
|
-
ROBJECT(obj)->as.heap.iv_index_tbl = (void *) 0;
|
89
|
-
RBASIC(obj)->flags &= ~ROBJECT_EMBED;
|
90
|
-
}
|
91
|
-
#endif
|
92
|
-
/** end of ruby 1.9 funcs **/
|
93
|
-
|
94
|
-
VALUE
|
95
|
-
rb_gen_eval(int argc, VALUE * argv, VALUE self) {
|
96
|
-
VALUE duped_context;
|
97
|
-
VALUE is_a_module;
|
98
|
-
VALUE context;
|
99
|
-
VALUE result;
|
100
|
-
|
101
|
-
rb_need_block();
|
102
|
-
|
103
|
-
context = rb_funcall(rb_block_proc(), rb_intern("__context__"), 0);
|
104
|
-
|
105
|
-
/* using Class instead of Object (where possible) because Object's iv_tbl setup in 1.9 is weird */
|
106
|
-
#ifdef RUBY_19
|
107
|
-
if(TYPE(context) == T_OBJECT)
|
108
|
-
duped_context = rb_funcall(rb_cObject, rb_intern("new"), 0);
|
109
|
-
else
|
110
|
-
duped_context = rb_funcall(rb_cClass, rb_intern("new"), 0);
|
111
|
-
|
112
|
-
#else
|
113
|
-
|
114
|
-
duped_context = rb_funcall(rb_cClass, rb_intern("new"), 0);
|
115
|
-
|
116
|
-
#endif
|
117
|
-
|
118
|
-
|
119
|
-
/* the duped_context shares the context's iv_tbl.
|
120
|
-
2 cases: (1) external iv_tbl, (2) local iv_tbl
|
121
|
-
|
122
|
-
NOTE: we do not need to save original iv_tbl before replacing it, a brand new Class
|
123
|
-
instance does not yet have an iv_tbl (the pointer is set to 0)
|
124
|
-
*/
|
125
|
-
if(FL_TEST(context, FL_EXIVAR))
|
126
|
-
RCLASS_IV_TBL(duped_context) = (struct st_table *) rb_generic_ivar_table(context);
|
127
|
-
else {
|
128
|
-
#ifdef RUBY_19
|
129
|
-
if(TYPE(context) == T_OBJECT)
|
130
|
-
redirect_iv_for_object(context, duped_context);
|
131
|
-
else {
|
132
|
-
RCLASS_IV_TBL(duped_context) = (struct st_table *) RCLASS_IV_TBL(context);
|
133
|
-
}
|
134
|
-
#else
|
135
|
-
RCLASS_IV_TBL(duped_context) = (struct st_table *) RCLASS_IV_TBL(context);
|
136
|
-
#endif
|
137
|
-
|
138
|
-
|
139
|
-
}
|
140
|
-
|
141
|
-
/* ensure singleton exists */
|
142
|
-
rb_singleton_class(context);
|
143
|
-
|
144
|
-
/* set up the class hierarchy for our dup_context */
|
145
|
-
KLASS_OF(duped_context) = rb_singleton_class_clone(context);
|
146
|
-
|
147
|
-
/* if no args then default to mixing in 'self' */
|
148
|
-
if(argc == 0) {
|
149
|
-
argc = 1;
|
150
|
-
argv = &self;
|
151
|
-
}
|
152
|
-
|
153
|
-
/* mix the objects (or self) into the duped context */
|
154
|
-
rb_gen_extend(argc, argv, duped_context);
|
155
|
-
|
156
|
-
/* store self in hidden var in duped context */
|
157
|
-
set_hidden_self(duped_context, self);
|
158
|
-
|
159
|
-
is_a_module = rb_funcall(duped_context, rb_intern("is_a?"), 1, rb_cModule);
|
160
|
-
|
161
|
-
/* eval block wrt duped_context */
|
162
|
-
if(is_a_module == Qtrue)
|
163
|
-
result = rb_mod_module_eval(0, 0, duped_context);
|
164
|
-
else
|
165
|
-
result = rb_obj_instance_eval(0, 0, duped_context);
|
166
|
-
|
167
|
-
/* clean up goes below */
|
168
|
-
|
169
|
-
/* release context's iv_tbl from duped_context. */
|
170
|
-
#ifdef RUBY_19
|
171
|
-
if(TYPE(duped_context) == T_OBJECT)
|
172
|
-
release_iv_for_object(duped_context);
|
173
|
-
else {
|
174
|
-
RCLASS_IV_TBL(duped_context) = (struct st_table *) 0;
|
175
|
-
}
|
176
|
-
#else
|
177
|
-
RCLASS_IV_TBL(duped_context) = (struct st_table *) 0;
|
178
|
-
#endif
|
179
|
-
|
180
|
-
/* delete hidden self */
|
181
|
-
set_hidden_self(duped_context, Qnil);
|
182
|
-
|
183
|
-
return result;
|
184
|
-
}
|
185
|
-
|
186
|
-
void
|
187
|
-
Init_gen_eval() {
|
188
|
-
|
189
|
-
rb_define_method(rb_cObject, "gen_eval", rb_gen_eval, -1);
|
190
|
-
rb_define_method(rb_cObject, "capture", rb_capture, 0);
|
191
|
-
|
192
|
-
rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
|
193
|
-
rb_define_method(rb_cObject, "reset_tbls", rb_reset_tbls , 0);
|
194
|
-
rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
|
195
|
-
rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
|
196
|
-
|
197
|
-
/* below is much too hard to achieve in pure C */
|
198
|
-
rb_eval_string("class Proc;"
|
199
|
-
" def __context__;"
|
200
|
-
" eval('self', self.binding);"
|
201
|
-
" end;"
|
202
|
-
"end;"
|
203
|
-
);
|
204
|
-
|
205
|
-
rb_define_alias(rb_cObject, "gen_eval_with", "gen_eval");
|
206
|
-
}
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
data/ext/texplay/gen_eval.h
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
/* gen_eval.h */
|
2
|
-
|
3
|
-
#ifndef GUARD_GEN_EVAL_H
|
4
|
-
#define GUARD_GEN_EVAL_H
|
5
|
-
|
6
|
-
#include <ruby.h>
|
7
|
-
|
8
|
-
VALUE rb_gen_eval(int argc, VALUE * argv, VALUE self);
|
9
|
-
VALUE rb_capture(VALUE self);
|
10
|
-
VALUE retrieve_hidden_self(VALUE duped_context);
|
11
|
-
void set_hidden_self(VALUE duped_context, VALUE hidden_self);
|
12
|
-
|
13
|
-
/* change self to hidden self if __hidden_self__ defined */
|
14
|
-
#define ADJUST_SELF(X) \
|
15
|
-
do { \
|
16
|
-
if(!NIL_P(retrieve_hidden_self((X)))) \
|
17
|
-
(X) = retrieve_hidden_self((X)); \
|
18
|
-
} while(0)
|
19
|
-
|
20
|
-
#endif
|
data/ext/texplay/object2module.c
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
/* object2module.c */
|
2
|
-
/* (C) John Mair 2009
|
3
|
-
* This program is distributed under the terms of the MIT License
|
4
|
-
* */
|
5
|
-
|
6
|
-
#include <ruby.h>
|
7
|
-
#include "compat.h"
|
8
|
-
|
9
|
-
#ifdef RUBY_19
|
10
|
-
# include <ruby/st.h>
|
11
|
-
#else
|
12
|
-
# include <st.h>
|
13
|
-
#endif
|
14
|
-
|
15
|
-
/* class creation. from class.c in 1.9.1 */
|
16
|
-
#ifdef RUBY_19
|
17
|
-
static VALUE
|
18
|
-
class_alloc(VALUE flags, VALUE klass)
|
19
|
-
{
|
20
|
-
rb_classext_t *ext = ALLOC(rb_classext_t);
|
21
|
-
NEWOBJ(obj, struct RClass);
|
22
|
-
OBJSETUP(obj, klass, flags);
|
23
|
-
obj->ptr = ext;
|
24
|
-
RCLASS_IV_TBL(obj) = 0;
|
25
|
-
RCLASS_M_TBL(obj) = 0;
|
26
|
-
RCLASS_SUPER(obj) = 0;
|
27
|
-
RCLASS_IV_INDEX_TBL(obj) = 0;
|
28
|
-
return (VALUE)obj;
|
29
|
-
}
|
30
|
-
#endif
|
31
|
-
|
32
|
-
/* a modified version of include_class_new from class.c */
|
33
|
-
static VALUE
|
34
|
-
j_class_new(VALUE module, VALUE sup)
|
35
|
-
{
|
36
|
-
|
37
|
-
#ifdef RUBY_19
|
38
|
-
VALUE klass = class_alloc(T_ICLASS, rb_cClass);
|
39
|
-
#else
|
40
|
-
NEWOBJ(klass, struct RClass);
|
41
|
-
OBJSETUP(klass, rb_cClass, T_ICLASS);
|
42
|
-
#endif
|
43
|
-
|
44
|
-
if (BUILTIN_TYPE(module) == T_ICLASS) {
|
45
|
-
module = KLASS_OF(module);
|
46
|
-
}
|
47
|
-
|
48
|
-
if (!RCLASS_IV_TBL(module)) {
|
49
|
-
|
50
|
-
RCLASS_IV_TBL(module) = (struct st_table *)st_init_numtable();
|
51
|
-
}
|
52
|
-
|
53
|
-
/* assign iv_tbl, m_tbl and super */
|
54
|
-
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
|
55
|
-
RCLASS_SUPER(klass) = sup;
|
56
|
-
if(TYPE(module) != T_OBJECT) {
|
57
|
-
|
58
|
-
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
|
59
|
-
}
|
60
|
-
else {
|
61
|
-
RCLASS_M_TBL(klass) = RCLASS_M_TBL(CLASS_OF(module));
|
62
|
-
}
|
63
|
-
|
64
|
-
/* */
|
65
|
-
|
66
|
-
if (TYPE(module) == T_ICLASS) {
|
67
|
-
KLASS_OF(klass) = KLASS_OF(module);
|
68
|
-
}
|
69
|
-
else {
|
70
|
-
KLASS_OF(klass) = module;
|
71
|
-
}
|
72
|
-
|
73
|
-
if(TYPE(module) != T_OBJECT) {
|
74
|
-
OBJ_INFECT(klass, module);
|
75
|
-
OBJ_INFECT(klass, sup);
|
76
|
-
}
|
77
|
-
return (VALUE)klass;
|
78
|
-
}
|
79
|
-
|
80
|
-
VALUE
|
81
|
-
rb_to_module(VALUE self)
|
82
|
-
{
|
83
|
-
VALUE rclass, chain_start, jcur, klass;
|
84
|
-
|
85
|
-
switch(BUILTIN_TYPE(self)) {
|
86
|
-
case T_MODULE:
|
87
|
-
return self;
|
88
|
-
case T_CLASS:
|
89
|
-
klass = self;
|
90
|
-
break;
|
91
|
-
case T_OBJECT:
|
92
|
-
default:
|
93
|
-
klass = rb_singleton_class(self);
|
94
|
-
}
|
95
|
-
|
96
|
-
chain_start = j_class_new(klass, rb_cObject);
|
97
|
-
|
98
|
-
KLASS_OF(chain_start) = rb_cModule;
|
99
|
-
RBASIC(chain_start)->flags = T_MODULE;
|
100
|
-
|
101
|
-
jcur = chain_start;
|
102
|
-
for(rclass = RCLASS_SUPER(klass); rclass != rb_cObject;
|
103
|
-
rclass = RCLASS_SUPER(rclass)) {
|
104
|
-
|
105
|
-
RCLASS_SUPER(jcur) = j_class_new(rclass, rb_cObject);
|
106
|
-
jcur = RCLASS_SUPER(jcur);
|
107
|
-
}
|
108
|
-
|
109
|
-
RCLASS_SUPER(jcur) = (VALUE)NULL;
|
110
|
-
|
111
|
-
return chain_start;
|
112
|
-
}
|
113
|
-
|
114
|
-
VALUE
|
115
|
-
rb_reset_tbls(VALUE self)
|
116
|
-
{
|
117
|
-
RCLASS_IV_TBL(self) = (struct st_table *) 0;
|
118
|
-
RCLASS_M_TBL(self) = (struct st_table *) st_init_numtable();
|
119
|
-
return Qnil;
|
120
|
-
}
|
121
|
-
|
122
|
-
/* cannot simply forward to gen_include as need to invoke 'extended' hook */
|
123
|
-
VALUE
|
124
|
-
rb_gen_extend(int argc, VALUE * argv, VALUE self)
|
125
|
-
{
|
126
|
-
int i;
|
127
|
-
|
128
|
-
if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
|
129
|
-
|
130
|
-
rb_singleton_class(self);
|
131
|
-
|
132
|
-
for(i = 0; i < argc; i++) {
|
133
|
-
VALUE mod = rb_to_module(argv[i]);
|
134
|
-
rb_funcall(mod, rb_intern("extend_object"), 1, self);
|
135
|
-
rb_funcall(mod, rb_intern("extended"), 1, self);
|
136
|
-
|
137
|
-
/* only redirect if argv[i] is not a module */
|
138
|
-
if(argv[i] != mod) rb_reset_tbls(mod);
|
139
|
-
}
|
140
|
-
|
141
|
-
return self;
|
142
|
-
}
|
143
|
-
|
144
|
-
VALUE
|
145
|
-
rb_gen_include(int argc, VALUE * argv, VALUE self)
|
146
|
-
{
|
147
|
-
int i;
|
148
|
-
|
149
|
-
if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
|
150
|
-
|
151
|
-
for(i = 0; i < argc; i++) {
|
152
|
-
VALUE mod = rb_to_module(argv[i]);
|
153
|
-
rb_funcall(mod, rb_intern("append_features"), 1, self);
|
154
|
-
rb_funcall(mod, rb_intern("included"), 1, self);
|
155
|
-
|
156
|
-
if(argv[i] != mod) rb_reset_tbls(mod);
|
157
|
-
}
|
158
|
-
|
159
|
-
return self;
|
160
|
-
}
|
161
|
-
|
162
|
-
|
163
|
-
void Init_object2module()
|
164
|
-
{
|
165
|
-
|
166
|
-
rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
|
167
|
-
rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
|
168
|
-
rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
|
169
|
-
rb_define_method(rb_cModule, "reset_tbls", rb_reset_tbls, 0);
|
170
|
-
}
|
171
|
-
|