[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
  • Mysql
  • Glassfish
  • Jruby
  • Rails
  • Nblogo
Terms of Use; Privacy Policy;
© 2010, Oracle Corporation and/or its affiliates
(revision 20120518.3c65429)
 
 
Close
loading
Please Confirm
Close