Skip to content

Commit

Permalink
Adding a test case and suite to the build for Duby, and start buildin…
Browse files Browse the repository at this point in the history
…g out some better test cases.

git-svn-id: http://svn.codehaus.org/jruby/trunk/jruby@6185 961051c9-f516-0410-bf72-c9f7e237a7b7
  • Loading branch information
headius committed Mar 12, 2008
1 parent eacc068 commit 2c83092
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 45 deletions.
1 change: 1 addition & 0 deletions build.xml
Expand Up @@ -483,6 +483,7 @@
<test name="org.jruby.test.ScriptTestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.BFTSTestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.JRubyTestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.DubyTestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.MRITestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.RubiconTestSuite" todir="${test.results.dir}" unless="test"/>
<test name="org.jruby.test.RubyTestTestSuite" todir="${test.results.dir}" unless="test"/>
Expand Down
37 changes: 15 additions & 22 deletions lib/ruby/site_ruby/1.8/compiler/builder.rb
Expand Up @@ -49,6 +49,11 @@ class FileBuilder
include Util
include TypeNamespace

attr_accessor :file_name
attr_accessor :class_builders
attr_accessor :imports
attr_accessor :package

def initialize(file_name)
@file_name = file_name
@class_builders = {}
Expand Down Expand Up @@ -116,6 +121,14 @@ class ClassBuilder
import java.lang.Object
import java.lang.Void
include Signature

attr_accessor :class_name
attr_accessor :superclass
attr_accessor :constructor
attr_accessor :instance_methods
attr_accessor :static_methods
attr_accessor :imports
attr_accessor :fields

def initialize(file_builder, class_name, file_name, superclass = Object, *interfaces)
@parent = file_builder
Expand Down Expand Up @@ -173,21 +186,6 @@ def generate
String.from_java_bytes(@class_writer.to_byte_array)
end

# def field(name, type)
# @class_writer.visitField(ACC_PUBLIC, name.to_s, ci(type), nil, nil)
# end

def constructor(*signature, &block)
signature.unshift Void::TYPE

MethodBuilder.build(self, ACC_PUBLIC, "<init>", signature, &block)
end

def method(name, *signature, &block)
@instance_signatures[name] = signature
MethodBuilder.build(self, ACC_PUBLIC, name.to_s, signature, &block)
end

class DeferredMethodBuilder
attr_accessor :signature

Expand Down Expand Up @@ -219,7 +217,7 @@ def generate_constructor(superclass)
end

# New version does not instance_eval, to allow for easier embedding
def method2(name, *signature, &block)
def method(name, *signature, &block)
if @constructor && name == "<init>"
raise "Overloading not yet supported"
end
Expand All @@ -233,13 +231,8 @@ def method2(name, *signature, &block)
end
end

def static_method(name, *signature, &block)
@static_signatures[name] = signature
MethodBuilder.build(self, ACC_PUBLIC | ACC_STATIC, name.to_s, signature, &block)
end

# New version does not instance_eval, to allow for easier embedding
def static_method2(name, *signature, &block)
def static_method(name, *signature, &block)
mb = MethodBuilder.new(self, ACC_PUBLIC | ACC_STATIC, name, signature)
deferred_builder = DeferredMethodBuilder.new(name, mb, signature, block)
@static_methods[name] = deferred_builder
Expand Down
4 changes: 2 additions & 2 deletions lib/ruby/site_ruby/1.8/compiler/duby/compiler.rb
Expand Up @@ -264,7 +264,7 @@ def compile(builder)
signature ||= [Void]

log "Compiling instance method for #{name} as #{signature.join(',')}"
builder.method2(mapped_name(builder), *signature) do |method|
builder.method(mapped_name(builder), *signature) do |method|
# Run through any type declarations first
first_real_node.declare_types(method) if HashNode === first_real_node

Expand Down Expand Up @@ -300,7 +300,7 @@ def compile(builder)
signature ||= [Void]

log "Compiling static method for #{name} as #{signature.join(',')}"
builder.static_method2(name, *signature) do |method|
builder.static_method(name, *signature) do |method|
# Run through any type declarations first
first_real_node.declare_types(method) if HashNode === first_real_node

Expand Down
44 changes: 23 additions & 21 deletions lib/ruby/site_ruby/1.8/compiler/duby/typer.rb
Expand Up @@ -20,7 +20,7 @@ class ClassNode
class BlockNode
# Type of a block is the type of its final element
def type(builder)
child_nodes.get(child_nodes.size - 1).type
@type ||= child_nodes.get(child_nodes.size - 1).type
end
end

Expand Down Expand Up @@ -142,7 +142,7 @@ def declared_type(builder)

class ConstNode
def type(builder)
builder.type(name)
@type ||= builder.type(name)
end
end

Expand Down Expand Up @@ -189,18 +189,20 @@ def special_signature(recv_type, builder)
end

def type(builder)
arg_types = []
args_node.child_nodes.each do |node|
arg_types << node.type(builder)
end if args_node
if builder.static
signature = builder.static_signature(name, arg_types)
else
signature = builder.instance_signature(name, arg_types)
@type ||= begin
arg_types = []
args_node.child_nodes.each do |node|
arg_types << node.type(builder)
end if args_node
if builder.static
signature = builder.static_signature(name, arg_types)
else
signature = builder.instance_signature(name, arg_types)
end
raise CompileError.new(position, "Signature not found for call #{name}") unless signature

signature[0]
end
raise CompileError.new(position, "Signature not found for call #{name}") unless signature

signature[0]
end
end

Expand Down Expand Up @@ -248,7 +250,7 @@ class IfNode

class InstVarNode
def type(builder)
builder.field_type(mapped_name(builder))
@type ||= builder.field_type(mapped_name(builder))
end

def mapped_name(builder)
Expand All @@ -259,7 +261,7 @@ def mapped_name(builder)
class InstAsgnNode
def type(builder)
builder.field(mapped_name(builder), value_node.type(builder))
builder.field_type(mapped_name(builder))
@type ||= builder.field_type(mapped_name(builder))
end

def mapped_name(builder)
Expand All @@ -269,13 +271,13 @@ def mapped_name(builder)

class LocalAsgnNode
def type(builder)
builder.local_type(name)
@type ||= builder.local_type(name)
end
end

class LocalVarNode
def type(builder)
builder.local_type(name)
@type ||= builder.local_type(name)
end
end

Expand All @@ -284,7 +286,7 @@ class ModuleNode

class NewlineNode
def type(builder)
next_node.type(builder)
@type ||= next_node.type(builder)
end
end

Expand All @@ -299,13 +301,13 @@ class SelfNode

class StrNode
def type(builder)
java.lang.String
JString
end
end

class SymbolNode
def declared_type(builder)
builder.type(name.intern)
@type ||= builder.type(name.intern)
end
end

Expand All @@ -316,7 +318,7 @@ def mapped_name(builder)
end

def type(builder)
if builder.static
@type ||= if builder.static
builder.static_signature(name, [])[0]
else
builder.instance_signature(name, [])[0]
Expand Down
46 changes: 46 additions & 0 deletions test/compiler/duby/test_compiler.rb
@@ -0,0 +1,46 @@
require 'test/unit'
require 'compiler/duby/compiler'
require 'jruby'

class TestCompiler < Test::Unit::TestCase
def setup
@file_builder = Compiler::FileBuilder.new(__FILE__)
end

def test_class
node = JRuby.parse "
class TestClass
def initialize
end
def self.foo
end
end
class TestClass2
def foo
@a = 1
end
end
"
node.compile(@file_builder)

assert_equal(2, @file_builder.class_builders.size)
class_builder1 = @file_builder.class_builders["TestClass"]
class_builder2 = @file_builder.class_builders["TestClass2"]

assert_equal("TestClass", class_builder1.class_name)
assert_equal("TestClass2", class_builder2.class_name)

assert_equal(0, class_builder1.instance_methods.size)
assert_equal(1, class_builder2.instance_methods.size)
assert_equal(1, class_builder1.static_methods.size)
assert_equal(0, class_builder2.static_methods.size)
assert_not_nil(class_builder1.constructor)
assert_nil(class_builder2.constructor)

assert_equal(0, class_builder1.fields.size)
# fields do not get declared until compile phase right now :(
#assert_equal(1, class_builder2.fields.size)
#assert_equal("int", class_builder2.fields["a"].type.to_s)
end
end
1 change: 1 addition & 0 deletions test/duby_index
@@ -0,0 +1 @@
compiler/duby/test_compiler
28 changes: 28 additions & 0 deletions test/org/jruby/test/DubyTestSuite.java
@@ -0,0 +1,28 @@
/*
* TestUnitTestSuite.java
* JUnit based test
*
* Created on January 15, 2007, 4:06 PM
*/

package org.jruby.test;


import junit.framework.Test;
import junit.framework.TestSuite;


/**
*
* @author headius
*/
public class DubyTestSuite extends TestSuite {
public static final String TEST_INDEX = "duby_index";

/**
* suite method automatically generated by JUnit module
*/
public static Test suite() throws Exception {
return new TestUnitTestSuite(TEST_INDEX);
}
}

0 comments on commit 2c83092

Please sign in to comment.