java-inline 0.0.1-java

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 (4) hide show
  1. data/README +1 -0
  2. data/examples/fastmath.rb +56 -0
  3. data/lib/java_inline.rb +107 -0
  4. metadata +66 -0
data/README ADDED
@@ -0,0 +1 @@
1
+ java-inline is a plugin for RubyInline that adds JVM language support. See the examples dir for a simple example of using it.
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'inline'
3
+ require 'java_inline'
4
+ require 'benchmark'
5
+
6
+ class FastMath
7
+ def factorial_ruby(n)
8
+ f = 1
9
+ n.downto(2) { |x| f *= x }
10
+ return f
11
+ end
12
+
13
+ def fib_ruby(n)
14
+ if n < 2
15
+ n
16
+ else
17
+ fib_ruby(n - 2) + fib_ruby(n - 1)
18
+ end
19
+ end
20
+
21
+ inline :Java do |builder|
22
+ builder.package "org.jruby.test"
23
+ builder.java "
24
+ public static long factorial_java(int max) {
25
+ int i=max, result=1;
26
+ while (i >= 2) { result *= i--; }
27
+ return result;
28
+ }
29
+ "
30
+
31
+ builder.java "
32
+ public static int fib_java(int n) {
33
+ if (n < 2) return n;
34
+
35
+ return fib_java(n - 2) + fib_java(n - 1);
36
+ }
37
+ "
38
+ end
39
+
40
+ def bench
41
+ require 'benchmark'
42
+
43
+ Benchmark.bm(30) do |bm|
44
+ end
45
+ end
46
+ end
47
+
48
+ math = FastMath.new
49
+
50
+ Benchmark.bmbm(30) {|bm|
51
+ 5.times { bm.report("factorial_ruby") { 30000.times { math.factorial_ruby(30) } } }
52
+ 5.times { bm.report("factorial_java") { 30000.times { math.factorial_java(30) } } }
53
+ 5.times { bm.report("fib_ruby(35)") { math.fib_ruby(30) } }
54
+ 5.times { bm.report("fib_java(35)") { math.fib_java(30) } }
55
+ }
56
+
@@ -0,0 +1,107 @@
1
+ require 'rubygems'
2
+ require 'inline'
3
+ require 'java'
4
+
5
+ # Add the inline cache dir to CLASSPATH
6
+ $CLASSPATH << Inline.directory
7
+
8
+ module Inline
9
+
10
+ # A Java builder for RubyInline. Provides the basic methods needed to
11
+ # allow assembling a set of Java methods that compile into a class and
12
+ # get bound to the same names in the containing module.
13
+ class Java
14
+ JFile = java.io.File
15
+ import javax.tools.ToolProvider
16
+ import javax.tools.SimpleJavaFileObject
17
+ import javax.tools.StandardLocation
18
+
19
+ def initialize(mod)
20
+ @context = mod
21
+ @src = ""
22
+ @imports = []
23
+ @sigs = []
24
+ end
25
+
26
+ def load_cache
27
+ false
28
+ end
29
+
30
+ # Set the package to use for the Java class being generated, as in
31
+ # builder.package "org.foo.bar"
32
+ def package(pkg)
33
+ @pkg = pkg
34
+ end
35
+
36
+ # Add an "import" line with the given class, as in
37
+ # builder.import "java.util.ArrayList". The imports will be composed
38
+ # into an appropriate block of code and added to the top of the source.
39
+ def import(cls)
40
+ if cls.respond_to? :java_class
41
+ @imports << cls.java_class.name
42
+ else
43
+ @imports << cls.to_s
44
+ end
45
+ end
46
+
47
+ # Add a Java method to the built Java source. This expects the method to
48
+ # be public and static, so it can be called as a function.
49
+ def java(src)
50
+ @src << src << "\n"
51
+ signature = src.match(/public static\W+(\w+)\W+([a-zA-Z0-9_]+)\((.*)\)/)
52
+ raise "Could not parse method signature" unless signature
53
+ @sigs << [signature[1], signature[2], signature[3]]
54
+ end
55
+
56
+ def build
57
+ compiler = ToolProvider.system_java_compiler
58
+ file_mgr = compiler.get_standard_file_manager(nil, nil, nil)
59
+ file_mgr.set_location(StandardLocation::CLASS_OUTPUT, [JFile.new(Inline.directory)])
60
+
61
+ if @pkg
62
+ directory = "#{Inline.directory}/#{@pkg.gsub('.', '/')}"
63
+ unless File.directory? directory then
64
+ $stderr.puts "NOTE: creating #{directory} for RubyInline" if $DEBUG
65
+ FileUtils.mkdir_p directory
66
+ end
67
+
68
+ @name = "Java#{@src.hash.abs}"
69
+ @load_name = "#{@pkg}.#{@name}"
70
+ filename = "#{directory}/#{@name}.java"
71
+
72
+ imports = "import " + @imports.join(";\nimport ") + ";" if @imports.size > 0
73
+ full_src = "
74
+ package #{@pkg};
75
+ #{imports}
76
+ public class #{@name} {
77
+ #{@src}
78
+ }
79
+ "
80
+ else
81
+ @load_name = @name = "Java#{@src.hash.abs}"
82
+ filename = "#{Inline.directory}/#{@name}.java"
83
+
84
+ imports = "import " + @imports.join(";\nimport ") + ";" if @imports.size > 0
85
+ full_src = "
86
+ #{imports}
87
+ public class #{@name} {
88
+ #{@src}
89
+ }
90
+ "
91
+ end
92
+
93
+ File.open(filename, "w") {|file| file.write(full_src)}
94
+ file_objs = file_mgr.get_java_file_objects_from_strings([filename])
95
+
96
+ compiler.get_task(nil, file_mgr, nil, nil, nil, file_objs).call
97
+ file_mgr.close
98
+ end
99
+
100
+ def load
101
+ @context.module_eval "const_set :#{@name}, ::Java::#{@load_name}"
102
+ @sigs.each do |sig|
103
+ @context.module_eval "def #{sig[1]}(*args); #{@name}.#{sig[1]}(*args); end"
104
+ end
105
+ end
106
+ end
107
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: java-inline
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: java
6
+ authors:
7
+ - Charles Oliver Nutter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-18 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: RubyInline
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: A set of plugins for RubyInline to allow embedding JVM languages into Ruby code running on JRuby
26
+ email: headius@headius.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - README
35
+ - lib/java_inline.rb
36
+ - examples/fastmath.rb
37
+ has_rdoc: true
38
+ homepage: http://kenai.com/projects/java-inline
39
+ licenses: []
40
+
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project: java-inline
61
+ rubygems_version: 1.3.5
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: JVM language support for RubyInline
65
+ test_files: []
66
+