ruby-libjit 0.2.0 → 0.2.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.
- data/README +4 -2
- data/VERSION +1 -0
- data/ext/jit.c +32 -2
- data/lib/jit.rb +1 -0
- data/lib/jit/type.rb +38 -0
- data/sample/fib.rb +1 -6
- data/sample/simple.rb +5 -11
- metadata +4 -2
data/README
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
Ruby-libjit
|
|
2
|
-
|
|
1
|
+
Ruby-libjit
|
|
2
|
+
:include: VERSION
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2009 Paul Brannan
|
|
3
5
|
|
|
4
6
|
Ruby-libjit is a wrapper for the libjit library. It provides basic
|
|
5
7
|
functionality for jit-compiling functions, including integrating those
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.1
|
data/ext/jit.c
CHANGED
|
@@ -182,6 +182,22 @@ static VALUE context_build(VALUE self)
|
|
|
182
182
|
#endif
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
static VALUE function_s_compile(int argc, VALUE * argv, VALUE klass);
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* call-seq:
|
|
189
|
+
* function = context.compile_function(signature) { |f| ... }
|
|
190
|
+
*
|
|
191
|
+
* Acquire a lock on the context so it can be used to build a function.
|
|
192
|
+
*/
|
|
193
|
+
static VALUE context_compile_function(VALUE self, VALUE signature)
|
|
194
|
+
{
|
|
195
|
+
/* TODO: support passing in parent function */
|
|
196
|
+
VALUE argv[] = { self, signature };
|
|
197
|
+
int argc = 2;
|
|
198
|
+
return function_s_compile(argc, argv, rb_cFunction);
|
|
199
|
+
}
|
|
200
|
+
|
|
185
201
|
/*
|
|
186
202
|
* call-seq:
|
|
187
203
|
* Context.build { |context| ... }
|
|
@@ -259,6 +275,19 @@ static VALUE create_function(int argc, VALUE * argv, VALUE klass)
|
|
|
259
275
|
|
|
260
276
|
rb_scan_args(argc, argv, "21", &context_v, &signature_v, &parent_function_v);
|
|
261
277
|
|
|
278
|
+
/* Allow the user to specific the signature as a hash */
|
|
279
|
+
if (TYPE(signature_v) == T_HASH)
|
|
280
|
+
{
|
|
281
|
+
signature_v = rb_funcall(
|
|
282
|
+
rb_cType,
|
|
283
|
+
rb_intern("create_signature"),
|
|
284
|
+
1,
|
|
285
|
+
signature_v);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
check_type("context", rb_cContext, context_v);
|
|
289
|
+
check_type("signature", rb_cType, signature_v);
|
|
290
|
+
|
|
262
291
|
Data_Get_Struct(context_v, struct _jit_context, context);
|
|
263
292
|
Data_Get_Struct(signature_v, struct _jit_type, signature);
|
|
264
293
|
|
|
@@ -1008,7 +1037,7 @@ static VALUE wrap_type(jit_type_t type)
|
|
|
1008
1037
|
|
|
1009
1038
|
/*
|
|
1010
1039
|
* call-seq:
|
|
1011
|
-
* type = Type.
|
|
1040
|
+
* type = Type._create_signature(abi, return_type, array_of_param_types)
|
|
1012
1041
|
*
|
|
1013
1042
|
* Create a new signature.
|
|
1014
1043
|
*/
|
|
@@ -1436,6 +1465,7 @@ void Init_jit()
|
|
|
1436
1465
|
rb_cContext = rb_define_class_under(rb_mJIT, "Context", rb_cObject);
|
|
1437
1466
|
rb_define_singleton_method(rb_cContext, "new", context_s_new, 0);
|
|
1438
1467
|
rb_define_method(rb_cContext, "build", context_build, 0);
|
|
1468
|
+
rb_define_method(rb_cContext, "compile_function", context_compile_function, 1);
|
|
1439
1469
|
rb_define_singleton_method(rb_cContext, "build", context_s_build, 0);
|
|
1440
1470
|
|
|
1441
1471
|
rb_cClosure = rb_define_class_under(rb_mJIT, "Closure", rb_cObject);
|
|
@@ -1465,7 +1495,7 @@ void Init_jit()
|
|
|
1465
1495
|
rb_define_method(rb_cFunction, "compiled?", function_is_compiled, 0);
|
|
1466
1496
|
|
|
1467
1497
|
rb_cType = rb_define_class_under(rb_mJIT, "Type", rb_cObject);
|
|
1468
|
-
rb_define_singleton_method(rb_cType, "
|
|
1498
|
+
rb_define_singleton_method(rb_cType, "_create_signature", type_s_create_signature, 3);
|
|
1469
1499
|
rb_define_singleton_method(rb_cType, "create_struct", type_s_create_struct, 1);
|
|
1470
1500
|
rb_define_singleton_method(rb_cType, "create_pointer", type_s_create_pointer, 1);
|
|
1471
1501
|
rb_define_method(rb_cType, "get_offset", type_get_offset, 1);
|
data/lib/jit.rb
CHANGED
data/lib/jit/type.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module JIT
|
|
2
|
+
class Type
|
|
3
|
+
# Create a new signature.
|
|
4
|
+
#
|
|
5
|
+
# call-seq:
|
|
6
|
+
# jit = JIT::Type.create_signature(abi, return_type, array_of_param_types)
|
|
7
|
+
# jit = JIT::Type.create_signature(array_of_param_types => return_type)
|
|
8
|
+
# jit = JIT::Type.create_signature(array_of_param_types => return_type, :abi => abi)
|
|
9
|
+
def self.create_signature(*args)
|
|
10
|
+
if args.size == 1 then
|
|
11
|
+
h = args[0]
|
|
12
|
+
return_type = nil
|
|
13
|
+
param_types = nil
|
|
14
|
+
abi = :CDECL
|
|
15
|
+
h.each do |k, v|
|
|
16
|
+
if k == :abi then
|
|
17
|
+
abi = v
|
|
18
|
+
else
|
|
19
|
+
param_types = k
|
|
20
|
+
return_type = v
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if return_type.nil? or param_types.nil? then
|
|
25
|
+
raise ArgumentError, "Missing return_type and/or param types"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
return self._create_signature(abi, return_type, param_types)
|
|
29
|
+
|
|
30
|
+
elsif args.size == 3 then
|
|
31
|
+
return self._create_signature(args[0], args[1], args[2])
|
|
32
|
+
|
|
33
|
+
else
|
|
34
|
+
raise ArgumentError, "Wrong number of arguments (expected 3)"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/sample/fib.rb
CHANGED
data/sample/simple.rb
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
require 'jit'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
JIT::Type::INT, # returns an integer
|
|
8
|
-
[ JIT::Type::INT ]) # and tages an integer as a parameter
|
|
9
|
-
function = JIT::Function.compile(context, signature) do |f|
|
|
10
|
-
value = f.get_param(0)
|
|
11
|
-
f.insn_return(value)
|
|
12
|
-
end
|
|
3
|
+
multiply = JIT::Function.build([:INT, :INT] => :INT) do |f|
|
|
4
|
+
lhs = f.param(0)
|
|
5
|
+
rhs = f.param(1)
|
|
6
|
+
f.return(lhs * rhs)
|
|
13
7
|
end
|
|
14
8
|
|
|
15
|
-
p
|
|
9
|
+
p multiply.apply(6, 7) #=> 42
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-libjit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Paul Brannan
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-12-
|
|
12
|
+
date: 2009-12-04 00:00:00 -05:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|
|
@@ -27,6 +27,7 @@ extensions:
|
|
|
27
27
|
extra_rdoc_files: []
|
|
28
28
|
|
|
29
29
|
files:
|
|
30
|
+
- VERSION
|
|
30
31
|
- COPYING
|
|
31
32
|
- LGPL
|
|
32
33
|
- LICENSE
|
|
@@ -37,6 +38,7 @@ files:
|
|
|
37
38
|
- lib/jit/struct.rb
|
|
38
39
|
- lib/jit/pointer.rb
|
|
39
40
|
- lib/jit/value.rb
|
|
41
|
+
- lib/jit/type.rb
|
|
40
42
|
- ext/extconf.rb
|
|
41
43
|
- ext/rubypp.rb
|
|
42
44
|
- ext/jit.c
|