diff --git a/lib/duby/ast/literal.rb b/lib/duby/ast/literal.rb
index 4c8e9ac..b5764fe 100644
--- a/lib/duby/ast/literal.rb
+++ b/lib/duby/ast/literal.rb
@@ -3,6 +3,10 @@ module Duby::AST
def initialize(parent, line_number, &block)
super(parent, line_number, &block)
end
+
+ def infer(typer)
+ @inferred_type = typer.array_type
+ end
end
class Fixnum < Node
diff --git a/lib/duby/compiler.rb b/lib/duby/compiler.rb
index 54a2b2f..e3d35b2 100644
--- a/lib/duby/compiler.rb
+++ b/lib/duby/compiler.rb
@@ -37,6 +37,12 @@ module Duby
end
end
end
+
+ class Array
+ def compile(compiler, expression)
+ compiler.array(self, expression)
+ end
+ end
class Body
def compile(compiler, expression)
diff --git a/lib/duby/jvm/compiler.rb b/lib/duby/jvm/compiler.rb
index d7a528c..9758bab 100644
--- a/lib/duby/jvm/compiler.rb
+++ b/lib/duby/jvm/compiler.rb
@@ -556,6 +556,32 @@ module Duby
def boolean(value)
value ? @method.iconst_1 : @method.iconst_0
end
+
+ def array(node, expression)
+ if expression
+ @method.new java::util::ArrayList
+ @method.dup
+ @method.ldc_int node.children ? node.children.size : 0
+ @method.swap
+ @method.invokespecial java::util::ArrayList, "<init>", [@method.void, @method.int]
+ @method.invokestatic java::util::Collections, "unmodifiableList", [java::util::List, java::util::List]
+
+ # elements, as expressions
+ # TODO: ensure they're all reference types!
+ node.children.each do |node|
+ @method.dup
+ node.compile(self, true)
+ @method.invokeinterface java::util::List, "add", [@method.boolean, @method.object]
+ @method.pop
+ end
+ else
+ # elements, as non-expressions
+ # TODO: ensure they're all reference types!
+ node.children.each do |node|
+ node.compile(self, false)
+ end
+ end
+ end
def null
@method.aconst_null
diff --git a/lib/duby/jvm/typer.rb b/lib/duby/jvm/typer.rb
index c65e69b..85b8b1c 100644
--- a/lib/duby/jvm/typer.rb
+++ b/lib/duby/jvm/typer.rb
@@ -42,6 +42,16 @@ module Duby
def no_type
Void
end
+
+ def array_type
+ # TODO: allow other types for pre-1.2 profiles
+ type_reference("java.util.List")
+ end
+
+ def hash_type
+ # TODO: allow other types for pre-1.2 profiles
+ type_reference("java.util.Map")
+ end
def learn_method_type(target_type, name, parameter_types, type, exceptions)
static = target_type.meta?
diff --git a/lib/duby/typer.rb b/lib/duby/typer.rb
index 2d66b4a..8f1cf90 100644
--- a/lib/duby/typer.rb
+++ b/lib/duby/typer.rb
@@ -79,6 +79,16 @@ module Duby
AST::TypeReference::NoType
end
+ # to be overridden
+ def array_type
+ AST::TypeReference::NullType
+ end
+
+ # to be overridden
+ def hash_type
+ AST::TypeReference::NullType
+ end
+
def define_type(name, superclass, interfaces)
log "New type defined: '#{name}' < '#{superclass}'"
known_types[name] = type_definition(name, superclass, interfaces)