[jruby~main:65f9a258] More improvements for java_signature support in jrubyc:
- From: nicksieger@kenai.com
- To: commits@jruby.kenai.com
- Subject: [jruby~main:65f9a258] More improvements for java_signature support in jrubyc:
- Date: Thu, 4 Mar 2010 21:18:43 +0000
Project: jruby
Repository: main
Revision: 65f9a258d68ebe73201fa4ddc551674c9df6c69e
Author: nicksieger
Date: 2010-03-04 21:16:58 UTC
Link:
Log Message:
------------
More improvements for java_signature support in jrubyc:
* Eliminate java_name since signature has name in it now
* Add getWrapperName to TypeNode for primitive wrappers
* Add isVoid to TypeNode
* Clean up .java signature generation using TypeNode stuff
* Clean up examples to all use new style java_signature
Revisions:
----------
65f9a258d68ebe73201fa4ddc551674c9df6c69e
Modified Paths:
---------------
lib/ruby/site_ruby/shared/jruby/compiler.rb
samples/jrubyc_java/my_runnable.rb
samples/jrubyc_java/overloads.rb
samples/jrubyc_java/simple_class.rb
samples/jrubyc_java/simple_class2.rb
src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
src/org/jruby/ast/java_signature/TypeNode.java
Diffs:
------
diff --git a/lib/ruby/site_ruby/shared/jruby/compiler.rb
b/lib/ruby/site_ruby/shared/jruby/compiler.rb
index 5c87e03..d66988f 100644
--- a/lib/ruby/site_ruby/shared/jruby/compiler.rb
+++ b/lib/ruby/site_ruby/shared/jruby/compiler.rb
@@ -188,8 +188,8 @@ module JRuby::Compiler
attr_accessor :methods, :name, :script_name, :annotations, :interfaces
- def new_method(name, java_signature = nil, annotations = [], java_name =
name)
- method = RubyMethod.new(name, java_signature, annotations, java_name)
+ def new_method(name, java_signature = nil, annotations = [])
+ method = RubyMethod.new(name, java_signature, annotations)
methods << method
method
end
@@ -247,16 +247,15 @@ EOJ
end
class RubyMethod
- def initialize(name, java_signature = nil, annotations = [], java_name =
name)
+ def initialize(name, java_signature = nil, annotations = [])
@name = name
@java_signature = java_signature
- @java_name = java_name
@static = false;
@args = []
@annotations = annotations
end
- attr_accessor :args, :name, :java_signature, :java_name, :static,
:annotations
+ attr_accessor :args, :name, :java_signature, :static, :annotations
def format_anno_value(value)
case value
@@ -271,96 +270,44 @@ EOJ
def to_s
signature = java_signature
- case signature
- when Array
- signature &&= signature.dup
- ret = signature ? signature.shift : 'Object'
- args_string = args.map {|a| "#{signature ? signature.shift :
'Object'} #{a}"}.join(',')
- passed_args = args.map {|a| "ruby_" + a}.join(',')
- passed_args = "," + passed_args if args.size > 0
- conv_string = args.map {|a| ' IRubyObject ruby_' + a + ' =
JavaUtil.convertJavaToRuby(__ruby__, ' + a + ');'}.join("\n")
- anno_string = annotations.map {|a| " @#{a.shift}(" + (a[0] ||
[]).map {|k,v| "#{k} = #{format_anno_value(v)}"}.join(',') + ")"}.join("\n")
- ret_string = case ret
- when 'void'
- ""
- when 'byte'
- "return (Byte)ruby_result.toJava(byte.class);"
- when 'short'
- "return (Short)ruby_result.toJava(short.class);"
- when 'char'
- "return (Character)ruby_result.toJava(char.class);"
- when 'int'
- "return (Integer)ruby_result.toJava(int.class);"
- when 'long'
- "return (Long)ruby_result.toJava(long.class);"
- when 'float'
- "return (Float)ruby_result.toJava(float.class);"
- when 'double'
- "return (Double)ruby_result.toJava(double.class);"
- when 'boolean'
- "return (Boolean)ruby_result.toJava(boolean.class);"
- else
- "return (#{ret})ruby_result.toJava(#{ret}.class);"
- end
- method_string = <<EOJ
-#{anno_string}
- public #{static ? 'static ' : ''}#{ret} #{java_name}(#{args_string}) {
-#{conv_string}
- IRubyObject ruby_result =
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), #{static ?
'__metaclass__' : 'this'}, \"#{name}\" #{passed_args});
- #{ret_string}
- }
-EOJ
- method_string
- when MethodSignatureNode
- ret = signature.return_type.name
-
- var_names = []
- i = 0;
- args_string = signature.parameter_list.map do |a|
- type = a.type.name
- if a.variable_name
- var_name = a.variable_name
- else
- var_name = args[i]
- i+=1
- end
+ if signature.parameter_list.size != args.size
+ raise "signature and method argument counts do not match"
+ end
- var_names << var_name
- "#{type} #{var_name}"
- end.join(', ')
-
- passed_string = var_names.map {|a| "ruby_#{a}"}.join(', ')
- passed_string = ', ' + passed_string if
signature.parameter_list.size > 0
-
- conv_string = var_names.map {|a| ' IRubyObject ruby_' + a + ' =
JavaUtil.convertJavaToRuby(__ruby__, ' + a + ');'}.join("\n")
-
- anno_string = annotations.map {|a| " @#{a.shift}(" + (a[0] ||
[]).map {|k,v| "#{k} = #{format_anno_value(v)}"}.join(',') + ")"}.join("\n")
-
- ret_string = case ret
- when 'void'
- ""
- when 'byte'
- "return (Byte)ruby_result.toJava(byte.class);"
- when 'short'
- "return (Short)ruby_result.toJava(short.class);"
- when 'char'
- "return (Character)ruby_result.toJava(char.class);"
- when 'int'
- "return (Integer)ruby_result.toJava(int.class);"
- when 'long'
- "return (Long)ruby_result.toJava(long.class);"
- when 'float'
- "return (Float)ruby_result.toJava(float.class);"
- when 'double'
- "return (Double)ruby_result.toJava(double.class);"
- when 'boolean'
- "return (Boolean)ruby_result.toJava(boolean.class);"
+ ret = signature.return_type
+
+ var_names = []
+ i = 0;
+ args_string = signature.parameter_list.map do |a|
+ type = a.type.name
+ if a.variable_name
+ var_name = a.variable_name
else
- "return (#{ret})ruby_result.toJava(#{ret}.class);"
+ var_name = args[i]
+ i+=1
end
- method_string = <<EOJ
+ var_names << var_name
+ "#{type} #{var_name}"
+ end.join(', ')
+
+ passed_args = var_names.map {|a| "ruby_#{a}"}.join(', ')
+ passed_args = ', ' + passed_args if signature.parameter_list.size > 0
+
+ conv_string = var_names.map {|a| ' IRubyObject ruby_' + a + ' =
JavaUtil.convertJavaToRuby(__ruby__, ' + a + ');'}.join("\n")
+
+ anno_string = annotations.map {|a| " @#{a.shift}(" + (a[0] || []).map
{|k,v| "#{k} = #{format_anno_value(v)}"}.join(',') + ")"}.join("\n")
+
+ java_name = signature.name
+
+ if ret.void?
+ ret_string = ""
+ else
+ ret_string = "return
(#{ret.wrapper_name})ruby_result.toJava(#{ret.name}.class);"
+ end
+
+ method_string = <<EOJ
#{anno_string}
public #{static ? 'static ' : ''}#{ret} #{java_name}(#{args_string}) {
#{conv_string}
@@ -368,8 +315,7 @@ EOJ
#{ret_string}
}
EOJ
- method_string
- end
+ method_string
end
end
@@ -386,7 +332,7 @@ EOJ
@name = nil
end
- attr_accessor :class_stack, :method_stack, :signature, :name, :script,
:annotations
+ attr_accessor :class_stack, :method_stack, :signature, :script,
:annotations
def add_import(name)
@script.add_import(name)
@@ -396,10 +342,6 @@ EOJ
@signature = name
end
- def set_name(name)
- @name = name
- end
-
def prepare_anno_value(value)
case value.node_type
when NodeType::STRNODE
@@ -453,19 +395,17 @@ EOJ
end
def new_method(name)
- @name ||= name
- method = current_class.new_method(name, @signature, @annotations,
@name)
- @signature = @name = nil
+ method = current_class.new_method(name, @signature, @annotations)
+ @signature = nil
@annotations = []
method_stack.push(method)
end
def new_static_method(name)
- @name ||= name
- method = current_class.new_method(name, @signature, @annotations,
@name)
+ method = current_class.new_method(name, @signature, @annotations)
method.static = true
- @signature = @name = nil
+ @signature = nil
@annotations = []
method_stack.push(method)
@@ -480,29 +420,12 @@ EOJ
end
def build_signature(signature_args)
- # assumes hash node
- case signature_args
- when org.jruby.ast.HashNode
- ary = signature_args.child_nodes[0].child_nodes
- params = ary[0]
- ret = ary[1]
-
- unless org.jruby.ast.ArrayNode === params ||
org.jruby.ast.ZArrayNode === params
- raise "signature needs an array of args at " + params.position.to_s
- end
- raise unless ret
-
- sig = [(defined? ret.name) ? ret.name : ret.value]
- param_strings = params.child_nodes.map do |param|
- name_or_value(param)
- end
- sig.concat(param_strings)
-
- sig
- when org.jruby.ast.StrNode
+ if org.jruby.ast.StrNode === signature_args
sig_node =
org.jruby.parser.JavaSignatureParser.parse(java.io.ByteArrayInputStream.new(signature_args.value.to_java_bytes))
sig_node
+ else
+ raise "java_signature must take a literal string"
end
end
@@ -577,8 +500,6 @@ EOJ
add_import node.args_node.child_nodes[0].value
when 'java_signature'
set_signature build_signature(node.args_node.child_nodes[0])
- when 'java_name'
- set_name name_or_value(node.args_node.child_nodes[0])
when 'java_annotation'
add_annotation(*node.args_node.child_nodes)
when 'java_implements'
diff --git a/samples/jrubyc_java/my_runnable.rb
b/samples/jrubyc_java/my_runnable.rb
index ef3b687..3d658ff 100644
--- a/samples/jrubyc_java/my_runnable.rb
+++ b/samples/jrubyc_java/my_runnable.rb
@@ -3,12 +3,12 @@ require 'java'
class MyRunnable
java_implements "java.lang.Runnable"
- java_signature [] => "void"
+ java_signature "void run()"
def run
puts 'here'
end
- java_signature ["String[]"] => 'void'
+ java_signature "void main(String[])"
def self.main(args)
t = java.lang.Thread.new(MyRunnable.new)
t.start
diff --git a/samples/jrubyc_java/overloads.rb
b/samples/jrubyc_java/overloads.rb
index 3206973..e21207f 100644
--- a/samples/jrubyc_java/overloads.rb
+++ b/samples/jrubyc_java/overloads.rb
@@ -1,12 +1,10 @@
require 'java'
class OverloadedClass
- java_name :run
- java_signature [String] => :void
+ java_signature "void run(String)"
def run1(a); end
- java_name :run
- java_signature ["int"] => :void
+ java_signature "void run(int)"
def run2(a); end
end
diff --git a/samples/jrubyc_java/simple_class.rb
b/samples/jrubyc_java/simple_class.rb
index 187296a..e6a1ec6 100644
--- a/samples/jrubyc_java/simple_class.rb
+++ b/samples/jrubyc_java/simple_class.rb
@@ -1,7 +1,7 @@
require 'java'
class SimpleRubyClass
- java_signature [] => :void
+ java_signature "void simple_method()"
def simple_method
puts "here!"
end
@@ -20,4 +20,4 @@ public class SimpleRubyClass extends org.jruby.RubyObject{
public void simple_method();
static {};
}
-=end
\ No newline at end of file
+=end
diff --git a/samples/jrubyc_java/simple_class2.rb
b/samples/jrubyc_java/simple_class2.rb
index 6a6e55c..19020ad 100644
--- a/samples/jrubyc_java/simple_class2.rb
+++ b/samples/jrubyc_java/simple_class2.rb
@@ -1,12 +1,12 @@
require 'java'
class MyRubyClass
- java_signature [] => :void
+ java_signature 'void helloWorld()'
def helloWorld
puts "Hello from Ruby"
end
- java_signature [String] => :void
+ java_signature 'void goodbyeWorld(String)'
def goodbyeWorld(a)
puts a
end
diff --git a/src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
b/src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
index 156f550..0cf50d7 100644
--- a/src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
+++ b/src/org/jruby/ast/java_signature/PrimitiveTypeNode.java
@@ -31,6 +31,16 @@ public class PrimitiveTypeNode extends TypeNode {
}
@Override
+ public boolean isVoid() {
+ return name.equals("void");
+ }
+
+ @Override
+ public String getWrapperName() {
+ return Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ }
+
+ @Override
public String toString() {
return name;
}
diff --git a/src/org/jruby/ast/java_signature/TypeNode.java
b/src/org/jruby/ast/java_signature/TypeNode.java
index 5733a38..4bf6a60 100644
--- a/src/org/jruby/ast/java_signature/TypeNode.java
+++ b/src/org/jruby/ast/java_signature/TypeNode.java
@@ -19,6 +19,14 @@ public class TypeNode {
return false;
}
+ public boolean isVoid() {
+ return false;
+ }
+
+ public String getWrapperName() {
+ return name;
+ }
+
public boolean isTyped() {
return false;
}
|
[jruby~main:65f9a258] More improvements for java_signature support in jrubyc: |
nicksieger | 03/04/2010 |





