multiarray 0.11.3 → 0.11.4
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/README.md +61 -0
- data/Rakefile +1 -1
- data/lib/multiarray.rb +28 -0
- data/lib/multiarray/complex.rb +310 -13
- data/lib/multiarray/composite.rb +7 -0
- data/lib/multiarray/diagonal.rb +18 -3
- data/lib/multiarray/elementwise.rb +7 -2
- data/lib/multiarray/float.rb +43 -3
- data/lib/multiarray/gcccache.rb +4 -1
- data/lib/multiarray/gcccontext.rb +119 -21
- data/lib/multiarray/gccfunction.rb +92 -3
- data/lib/multiarray/gcctype.rb +26 -0
- data/lib/multiarray/gccvalue.rb +204 -2
- data/lib/multiarray/histogram.rb +65 -1
- data/lib/multiarray/index.rb +11 -0
- data/lib/multiarray/inject.rb +18 -1
- data/lib/multiarray/int.rb +49 -18
- data/lib/multiarray/integral.rb +65 -1
- data/lib/multiarray/lambda.rb +19 -5
- data/lib/multiarray/list.rb +8 -0
- data/lib/multiarray/lookup.rb +8 -1
- data/lib/multiarray/lut.rb +96 -2
- data/lib/multiarray/methods.rb +13 -3
- data/lib/multiarray/multiarray.rb +11 -0
- data/lib/multiarray/node.rb +52 -9
- data/lib/multiarray/operations.rb +118 -15
- data/lib/multiarray/pointer.rb +35 -1
- data/lib/multiarray/rgb.rb +139 -14
- data/lib/multiarray/sequence.rb +140 -2
- data/lib/multiarray/shortcuts.rb +76 -30
- data/lib/multiarray/store.rb +54 -0
- data/lib/multiarray/variable.rb +19 -0
- data/test/tc_lazy.rb +9 -0
- metadata +3 -3
data/lib/multiarray/composite.rb
CHANGED
@@ -103,6 +103,13 @@ module Hornetseye
|
|
103
103
|
|
104
104
|
end
|
105
105
|
|
106
|
+
# Decompose composite number
|
107
|
+
#
|
108
|
+
# This method decomposes the composite number.
|
109
|
+
#
|
110
|
+
# @return [Node] Returns the requested component.
|
111
|
+
#
|
112
|
+
# @private
|
106
113
|
def decompose( i )
|
107
114
|
self.class.element_type.new @value.decompose( i )
|
108
115
|
end
|
data/lib/multiarray/diagonal.rb
CHANGED
@@ -35,8 +35,18 @@ module Hornetseye
|
|
35
35
|
|
36
36
|
# Constructor
|
37
37
|
#
|
38
|
-
# @param [Node] value Initial value of injection
|
39
|
-
# @param [Node] index0 Index
|
38
|
+
# @param [Node] value Initial value of injection.
|
39
|
+
# @param [Node] index0 Index to select starting point of injection.
|
40
|
+
# @param [Node] index1 Index to diagonally iterate over +value+.
|
41
|
+
# @param [Node] index2 Index to diagonally iterate over +value+.
|
42
|
+
# @param [Node,NilClass] initial Initial value for injection.
|
43
|
+
# @param [Node] block Expression with body of injection.
|
44
|
+
# @param [Variable] var1 Variable for performing substitutions on body of
|
45
|
+
# injection.
|
46
|
+
# @param [Variable] var2 Variable for performing substitutions on body of
|
47
|
+
# injection.
|
48
|
+
#
|
49
|
+
# @private
|
40
50
|
def initialize( value, index0, index1, index2, initial, block, var1,
|
41
51
|
var2 )
|
42
52
|
@value, @index0, @index1, @index2, @initial, @block, @var1, @var2 =
|
@@ -67,7 +77,11 @@ module Hornetseye
|
|
67
77
|
#
|
68
78
|
# @private
|
69
79
|
def array_type
|
70
|
-
Hornetseye::MultiArray @block.typecode, *@value.shape
|
80
|
+
retval = Hornetseye::MultiArray @block.typecode, *@value.shape
|
81
|
+
( class << self; self; end ).instance_eval do
|
82
|
+
define_method( :array_type ) { retval }
|
83
|
+
end
|
84
|
+
retval
|
71
85
|
end
|
72
86
|
|
73
87
|
# Reevaluate computation
|
@@ -179,3 +193,4 @@ module Hornetseye
|
|
179
193
|
end
|
180
194
|
|
181
195
|
end
|
196
|
+
|
@@ -17,6 +17,7 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Class for representing element-wise operations
|
20
21
|
class ElementWise_ < Node
|
21
22
|
|
22
23
|
class << self
|
@@ -26,7 +27,7 @@ module Hornetseye
|
|
26
27
|
# @return [Proc] A closure with the operation.
|
27
28
|
attr_accessor :operation
|
28
29
|
|
29
|
-
# Unique key to identify operation
|
30
|
+
# Unique key to identify operation
|
30
31
|
#
|
31
32
|
# @return [Symbol,String] A unique key to identify this operation.
|
32
33
|
attr_accessor :key
|
@@ -92,7 +93,11 @@ module Hornetseye
|
|
92
93
|
# @private
|
93
94
|
def array_type
|
94
95
|
array_types = @values.collect { |value| value.array_type }
|
95
|
-
self.class.conversion.call *array_types
|
96
|
+
retval = self.class.conversion.call *array_types
|
97
|
+
( class << self; self; end ).instance_eval do
|
98
|
+
define_method( :array_type ) { retval }
|
99
|
+
end
|
100
|
+
retval
|
96
101
|
end
|
97
102
|
|
98
103
|
# Reevaluate computation
|
data/lib/multiarray/float.rb
CHANGED
@@ -17,10 +17,16 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Class for representing native floating point numbers
|
20
21
|
class FLOAT_ < Element
|
21
22
|
|
22
23
|
class << self
|
23
24
|
|
25
|
+
# Boolean indicating whether this number is single or double precision
|
26
|
+
#
|
27
|
+
# @return [Boolean] +true+ for double precision, +false+ for single precision.
|
28
|
+
#
|
29
|
+
# @private
|
24
30
|
attr_accessor :double
|
25
31
|
|
26
32
|
# Memory type required to store elements of this type
|
@@ -102,11 +108,15 @@ module Hornetseye
|
|
102
108
|
double ? 'd' : 'f'
|
103
109
|
end
|
104
110
|
|
105
|
-
# Return string with information about this class
|
111
|
+
# Return string with information about this class
|
106
112
|
#
|
107
113
|
# @return [String] Returns a string (e.g. "SFLOAT").
|
108
114
|
def inspect
|
109
|
-
"#{ double ? 'D' : 'S' }FLOAT"
|
115
|
+
retval = "#{ double ? 'D' : 'S' }FLOAT"
|
116
|
+
( class << self; self; end ).instance_eval do
|
117
|
+
define_method( :inspect ) { retval }
|
118
|
+
end
|
119
|
+
retval
|
110
120
|
end
|
111
121
|
|
112
122
|
# Get unique descriptor of this class
|
@@ -129,7 +139,7 @@ module Hornetseye
|
|
129
139
|
other.is_a? Class and other < FLOAT_ and double == other.double
|
130
140
|
end
|
131
141
|
|
132
|
-
# Compute hash value for this class
|
142
|
+
# Compute hash value for this class
|
133
143
|
#
|
134
144
|
# @return [Fixnum] Hash value
|
135
145
|
#
|
@@ -151,6 +161,11 @@ module Hornetseye
|
|
151
161
|
|
152
162
|
end
|
153
163
|
|
164
|
+
# Namespace containing method for matching elements of type FLOAT_
|
165
|
+
#
|
166
|
+
# @see FLOAT_
|
167
|
+
#
|
168
|
+
# @private
|
154
169
|
module Match
|
155
170
|
|
156
171
|
# Method for matching elements of type FLOAT_
|
@@ -197,9 +212,31 @@ module Hornetseye
|
|
197
212
|
|
198
213
|
end
|
199
214
|
|
215
|
+
# Boolean constant to use as a parameter for creating floating point classes
|
216
|
+
#
|
217
|
+
# The value is +false+.
|
218
|
+
#
|
219
|
+
# @see #FLOAT
|
200
220
|
SINGLE = false
|
221
|
+
|
222
|
+
# Boolean constant to use as a parameter for creating floating point classes
|
223
|
+
#
|
224
|
+
# The value is +true+.
|
225
|
+
#
|
226
|
+
# @see #FLOAT
|
201
227
|
DOUBLE = true
|
202
228
|
|
229
|
+
# Create a class deriving from +FLOAT_+
|
230
|
+
#
|
231
|
+
# Create a class deriving from +FLOAT_+. The parameters +double+ is assigned to the
|
232
|
+
# corresponding attributes of the resulting class.
|
233
|
+
#
|
234
|
+
# @param [Boolean] double Specify +SINGLE+ or +DOUBLE+ here.
|
235
|
+
#
|
236
|
+
# @return [Class] A class deriving from +FLOAT_+.
|
237
|
+
#
|
238
|
+
# @see FLOAT_
|
239
|
+
# @see FLOAT_.double
|
203
240
|
def FLOAT( double )
|
204
241
|
retval = Class.new FLOAT_
|
205
242
|
retval.double = double
|
@@ -208,7 +245,10 @@ module Hornetseye
|
|
208
245
|
|
209
246
|
module_function :FLOAT
|
210
247
|
|
248
|
+
# Single-precision floating-point number
|
211
249
|
SFLOAT = FLOAT SINGLE
|
250
|
+
|
251
|
+
# Double-precision floating-point number
|
212
252
|
DFLOAT = FLOAT DOUBLE
|
213
253
|
|
214
254
|
# Shortcut for constructor
|
data/lib/multiarray/gcccache.rb
CHANGED
@@ -16,30 +16,68 @@
|
|
16
16
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
|
-
|
19
|
+
|
20
|
+
# Context object for creating a Ruby extension
|
21
|
+
#
|
22
|
+
# @private
|
20
23
|
class GCCContext
|
21
24
|
|
25
|
+
# Ruby configuration
|
26
|
+
#
|
27
|
+
# @private
|
22
28
|
CFG = RbConfig::CONFIG
|
29
|
+
|
23
30
|
if CFG[ 'rubyhdrdir' ]
|
31
|
+
# GCC compiler flags
|
32
|
+
#
|
33
|
+
# @private
|
24
34
|
CFLAGS = "-DNDEBUG #{CFG[ 'CFLAGS' ]} " +
|
25
35
|
"-I#{CFG['rubyhdrdir']} -I#{CFG['rubyhdrdir']}/#{CFG['arch']}"
|
26
36
|
else
|
27
37
|
CFLAGS = "-DNDEBUG #{CFG[ 'CFLAGS' ]} " +
|
28
38
|
"-I#{CFG['archdir']}"
|
29
39
|
end
|
40
|
+
|
41
|
+
# Arguments for linking the Ruby extension
|
42
|
+
#
|
43
|
+
# @private
|
30
44
|
LIBRUBYARG = "-L#{CFG[ 'libdir' ]} #{CFG[ 'LIBRUBYARG' ]} #{CFG[ 'LDFLAGS' ]} "
|
31
45
|
"#{CFG[ 'SOLIBS' ]} #{CFG[ 'DLDLIBS' ]}"
|
46
|
+
|
47
|
+
# Command for linking the Ruby extension
|
48
|
+
#
|
49
|
+
# @private
|
32
50
|
LDSHARED = CFG[ 'LDSHARED' ]
|
51
|
+
|
52
|
+
# Shared library file extension under current operating system
|
53
|
+
#
|
54
|
+
# @private
|
33
55
|
DLEXT = CFG[ 'DLEXT' ]
|
56
|
+
|
57
|
+
# Directory for storing the Ruby extensions
|
58
|
+
#
|
59
|
+
# @private
|
34
60
|
DIRNAME = "#{Dir.tmpdir}/hornetseye-ruby#{RUBY_VERSION}-" +
|
35
61
|
"#{ENV[ 'USER' ] || ENV[ 'USERNAME' ]}"
|
62
|
+
|
63
|
+
# Lock file to prevent conflicts
|
64
|
+
#
|
65
|
+
# @private
|
36
66
|
LOCKFILE = "#{DIRNAME}/lock"
|
67
|
+
|
37
68
|
Dir.mkdir DIRNAME, 0700 unless File.exist? DIRNAME
|
69
|
+
|
70
|
+
# The actual file lock
|
71
|
+
#
|
72
|
+
# @private
|
38
73
|
@@lock = File.new LOCKFILE, 'w', 0600
|
39
74
|
unless @@lock.flock File::LOCK_EX | File::LOCK_NB
|
40
75
|
raise "Could not lock file \"#{LOCKFILE}\""
|
41
76
|
end
|
42
77
|
|
78
|
+
# Next available base name for a Ruby extension
|
79
|
+
#
|
80
|
+
# @private
|
43
81
|
@@lib_name = 'hornetseye_aaaaaaaa'
|
44
82
|
|
45
83
|
if ENV[ 'HORNETSEYE_PRELOAD_CACHE' ]
|
@@ -51,6 +89,15 @@ module Hornetseye
|
|
51
89
|
|
52
90
|
class << self
|
53
91
|
|
92
|
+
# Method for compiling Ruby to C
|
93
|
+
#
|
94
|
+
# @param [Proc] action The code block needs to accept a GCCContext object.
|
95
|
+
#
|
96
|
+
# @return [Object] Returns result of code block.
|
97
|
+
#
|
98
|
+
# @see GCCFunction.run
|
99
|
+
#
|
100
|
+
# @private
|
54
101
|
def build( &action )
|
55
102
|
lib_name, @@lib_name = @@lib_name, @@lib_name.succ
|
56
103
|
new( lib_name ).build &action
|
@@ -58,6 +105,11 @@ module Hornetseye
|
|
58
105
|
|
59
106
|
end
|
60
107
|
|
108
|
+
# Initialises an empty Ruby extension
|
109
|
+
#
|
110
|
+
# @param [String] lib_name Base name of library to create later.
|
111
|
+
#
|
112
|
+
# @private
|
61
113
|
def initialize( lib_name )
|
62
114
|
@lib_name = lib_name
|
63
115
|
@instructions = ''
|
@@ -65,39 +117,67 @@ module Hornetseye
|
|
65
117
|
@registrations = ''
|
66
118
|
end
|
67
119
|
|
120
|
+
# Create Ruby extension
|
121
|
+
#
|
122
|
+
# @param [Proc] action Code block accepting a GCCContext object.
|
123
|
+
#
|
124
|
+
# @return [Object] Returns result of code block.
|
125
|
+
#
|
126
|
+
# @private
|
68
127
|
def build( &action )
|
69
128
|
action.call self
|
70
129
|
end
|
71
130
|
|
131
|
+
# Add a new function to the Ruby extension
|
132
|
+
#
|
133
|
+
# @param [String] descriptor Method name of function.
|
134
|
+
# @param [Array<GCCType>] param_types Array with parameter types.
|
135
|
+
#
|
136
|
+
# @return [GCCFunction] Object representing the function.
|
137
|
+
#
|
138
|
+
# @private
|
72
139
|
def function( descriptor, *param_types )
|
73
140
|
@instructions << <<EOS
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
141
|
+
struct Arguments
|
142
|
+
{
|
143
|
+
#{
|
144
|
+
param_types.collect do |t|
|
145
|
+
t.identifiers
|
146
|
+
end.flatten.collect_with_index do |ident,i|
|
147
|
+
" #{ident} param#{i};"
|
148
|
+
end.join( "\n" )
|
149
|
+
}
|
150
|
+
};
|
151
|
+
|
152
|
+
VALUE #{descriptor}( void *args )
|
153
|
+
{
|
154
|
+
#{
|
155
|
+
param_types.collect do |t|
|
156
|
+
t.identifiers
|
157
|
+
end.flatten.collect_with_index do |ident,i|
|
158
|
+
" #{ident} param#{i} = ((struct Arguments *)args)->param#{i};"
|
159
|
+
end.join( "\n" )
|
160
|
+
}
|
85
161
|
EOS
|
86
162
|
|
87
163
|
@wrappers << <<EOS
|
88
164
|
VALUE wrap#{descriptor.capitalize}( int argc, VALUE *argv, VALUE rbSelf )
|
89
165
|
{
|
90
|
-
|
91
|
-
|
92
|
-
|
166
|
+
struct Arguments args;
|
167
|
+
#{
|
168
|
+
param_types.collect do |t|
|
169
|
+
t.r2c
|
170
|
+
end.flatten.collect_with_index do |conv,i|
|
171
|
+
" args.param#{i} = #{conv.call "argv[ #{i} ]"};"
|
172
|
+
end.join( "\n" )
|
173
|
+
}
|
174
|
+
#{
|
175
|
+
if RUBY_VERSION < '1.9.0'
|
176
|
+
" #{descriptor}( &args );"
|
93
177
|
else
|
94
|
-
|
95
|
-
t.r2c
|
96
|
-
end.flatten.collect_with_index do |conv,i|
|
97
|
-
conv.call "argv[ #{i} ]"
|
98
|
-
end.join( ', ' ) + ' '
|
178
|
+
" rb_thread_blocking_region( &#{descriptor}, &args, RUBY_UBF_PROCESS, NULL );"
|
99
179
|
end
|
100
|
-
}
|
180
|
+
}
|
101
181
|
return Qnil;
|
102
182
|
}
|
103
183
|
EOS
|
@@ -107,6 +187,15 @@ EOS
|
|
107
187
|
RUBY_METHOD_FUNC( wrap#{descriptor.capitalize} ), -1 );
|
108
188
|
EOS
|
109
189
|
end
|
190
|
+
|
191
|
+
# Compile the Ruby extension
|
192
|
+
#
|
193
|
+
# This method writes the source code to a file and calls GCC to compile it.
|
194
|
+
# Finally the Ruby extension is loaded.
|
195
|
+
#
|
196
|
+
# @return [Boolean] Returns of loading the Ruby extension.
|
197
|
+
#
|
198
|
+
# @private
|
110
199
|
def compile
|
111
200
|
template = <<EOS
|
112
201
|
#include <ruby.h>
|
@@ -140,6 +229,15 @@ EOS
|
|
140
229
|
require "#{DIRNAME}/#{@lib_name}"
|
141
230
|
end
|
142
231
|
|
232
|
+
# Add instructions to Ruby extension
|
233
|
+
#
|
234
|
+
# The given string is appended to the source code of the Ruby extension.
|
235
|
+
#
|
236
|
+
# @param [String] str String with source code fragment of Ruby extension.
|
237
|
+
#
|
238
|
+
# @return [GCCContext] Returns +self+.
|
239
|
+
#
|
240
|
+
# @private
|
143
241
|
def <<( str )
|
144
242
|
@instructions << str
|
145
243
|
self
|
@@ -16,17 +16,41 @@
|
|
16
16
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
|
-
|
19
|
+
|
20
|
+
# Class representing a compiled function
|
20
21
|
class GCCFunction
|
21
22
|
|
22
23
|
class << self
|
23
24
|
|
25
|
+
# Compile a block of Ruby code if not compiled already and run it
|
26
|
+
#
|
27
|
+
# @param [Node] block Expression to compile and run.
|
28
|
+
#
|
29
|
+
# @return [Object] Result returned by the compiled function.
|
30
|
+
#
|
31
|
+
# @private
|
24
32
|
def run( block )
|
25
33
|
keys, values, term = block.strip
|
26
34
|
labels = Hash[ *keys.zip( ( 0 ... keys.size ).to_a ).flatten ]
|
27
35
|
method_name = ( '_' + term.descriptor( labels ) ).
|
28
36
|
tr( '(),+\-*/%.@?~&|^<=>',
|
29
37
|
'0123\456789ABCDEFGH' )
|
38
|
+
compile method_name, term, *keys
|
39
|
+
args = values.collect { |arg| arg.values }.flatten
|
40
|
+
GCCCache.send method_name, *args
|
41
|
+
end
|
42
|
+
|
43
|
+
# Compile a block of Ruby code if not compiled already
|
44
|
+
#
|
45
|
+
# @param [String] method_name Unique method name of function.
|
46
|
+
# @param [Node] term Stripped expression to compile.
|
47
|
+
# @param [Array<Variable>] keys Variables for performing substitutions on
|
48
|
+
# +term+.
|
49
|
+
#
|
50
|
+
# @return [Object] The return value should be ignored.
|
51
|
+
#
|
52
|
+
# @private
|
53
|
+
def compile( method_name, term, *keys )
|
30
54
|
unless GCCCache.respond_to? method_name
|
31
55
|
GCCContext.build do |context|
|
32
56
|
function = GCCFunction.new context, method_name,
|
@@ -43,12 +67,17 @@ module Hornetseye
|
|
43
67
|
function.compile
|
44
68
|
end
|
45
69
|
end
|
46
|
-
args = values.collect { |arg| arg.values }.flatten
|
47
|
-
GCCCache.send method_name, *args
|
48
70
|
end
|
49
71
|
|
50
72
|
end
|
51
73
|
|
74
|
+
# Constructor
|
75
|
+
#
|
76
|
+
# @param [GCContext] context Context object for compiling function.
|
77
|
+
# @param [String] method_name Unique method name.
|
78
|
+
# @param [Array<Class>] param_types Native types of parameters.
|
79
|
+
#
|
80
|
+
# @private
|
52
81
|
def initialize( context, method_name, *param_types )
|
53
82
|
context.function method_name, *param_types.collect { |t| GCCType.new t }
|
54
83
|
@context = context
|
@@ -58,31 +87,70 @@ module Hornetseye
|
|
58
87
|
@ids = 0
|
59
88
|
end
|
60
89
|
|
90
|
+
# Close the function and compile it
|
91
|
+
#
|
92
|
+
# @return [GCCFunction] Returns +self+.
|
93
|
+
#
|
94
|
+
# @private
|
61
95
|
def compile
|
62
96
|
self << '}'
|
63
97
|
@context.compile
|
64
98
|
self
|
65
99
|
end
|
66
100
|
|
101
|
+
# Create a new identifier unique to this function
|
102
|
+
#
|
103
|
+
# @param [String] prefix Prefix for constructing the identifier.
|
104
|
+
#
|
105
|
+
# @return [String] A new identifier.
|
106
|
+
#
|
107
|
+
# @private
|
67
108
|
def id( prefix )
|
68
109
|
@ids += 1
|
69
110
|
"%s%02d"% [ prefix, @ids ]
|
70
111
|
end
|
71
112
|
|
113
|
+
# Create a new C variable of given type
|
114
|
+
#
|
115
|
+
# @param [Class] typecode Native type of variable.
|
116
|
+
# @param [String] prefix Prefix for creating variable name.
|
117
|
+
#
|
118
|
+
# @return [GCCValue] GCC value object refering to the C variable.
|
119
|
+
#
|
120
|
+
# @private
|
72
121
|
def variable( typecode, prefix )
|
73
122
|
retval = GCCValue.new( self, id( prefix ) )
|
74
123
|
self << "#{indent}#{GCCType.new( typecode ).identifier} #{retval};\n"
|
75
124
|
retval
|
76
125
|
end
|
77
126
|
|
127
|
+
# Auxiliary method for code intendation
|
128
|
+
#
|
129
|
+
# @return [String] String to use for indentation.
|
130
|
+
#
|
131
|
+
# @private
|
78
132
|
def indent
|
79
133
|
' ' * @indent
|
80
134
|
end
|
81
135
|
|
136
|
+
# Increase/decrease amount of indentation
|
137
|
+
#
|
138
|
+
# @param [Integer] offset Offset to add to current amount of indentation.
|
139
|
+
#
|
140
|
+
# @return [Integer] Resulting amount of indentation.
|
141
|
+
#
|
142
|
+
# @private
|
82
143
|
def indent_offset( offset )
|
83
144
|
@indent += offset
|
84
145
|
end
|
85
146
|
|
147
|
+
# Retrieve a parameter
|
148
|
+
#
|
149
|
+
# @param [Integer] i Parameter to retrieve.
|
150
|
+
#
|
151
|
+
# @return [Node] Object for handling the parameter.
|
152
|
+
#
|
153
|
+
# @private
|
86
154
|
def param( i )
|
87
155
|
offset = ( 0 ... i ).inject( 0 ) do |s,idx|
|
88
156
|
s + GCCType.new( @param_types[ idx ] ).identifiers.size
|
@@ -92,14 +160,35 @@ module Hornetseye
|
|
92
160
|
@param_types[ i ].construct *args
|
93
161
|
end
|
94
162
|
|
163
|
+
# Call the native method
|
164
|
+
#
|
165
|
+
# @param [Array<Node>] args Arguments of method call.
|
166
|
+
#
|
167
|
+
# @return The return value of the native method.
|
168
|
+
#
|
169
|
+
# @private
|
95
170
|
def call( *args )
|
96
171
|
@context.send @method_name, *args.collect { |v| v.get }
|
97
172
|
end
|
98
173
|
|
174
|
+
# Add return instruction to native method
|
175
|
+
#
|
176
|
+
# @param [Object,NilClass] value Return value or +nil+.
|
177
|
+
#
|
178
|
+
# @return [GCCFunction] Returns +self+.
|
179
|
+
#
|
180
|
+
# @private
|
99
181
|
def insn_return( value = nil )
|
100
182
|
self << "#{indent}return#{ value ? ' ' + value.get.to_s : '' };\n"
|
101
183
|
end
|
102
184
|
|
185
|
+
# Add instructions to C function
|
186
|
+
#
|
187
|
+
# @param [String] str C code fragment.
|
188
|
+
#
|
189
|
+
# @return [GCCFunction] Returns +self+.
|
190
|
+
#
|
191
|
+
# @private
|
103
192
|
def <<( str )
|
104
193
|
@context << str
|
105
194
|
self
|