duby 0.0.2-java → 0.0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/README.txt +18 -7
- data/Rakefile +72 -0
- data/examples/ant/example-build.xml +7 -0
- data/examples/appengine/Rakefile +8 -67
- data/examples/appengine/Readme +4 -3
- data/examples/appengine/lib/duby/appengine_tasks.rb +173 -0
- data/examples/appengine/lib/duby/plugin/datastore.rb +92 -31
- data/examples/appengine/lib/duby_task.rb +61 -0
- data/examples/appengine/src/com/ribrdb/DubyApp.duby +32 -6
- data/examples/appengine/src/com/ribrdb/list.dhtml +2 -2
- data/examples/appengine/{config.ru → src/config.ru} +0 -0
- data/examples/bintrees.duby +66 -0
- data/examples/dynamic.duby +17 -0
- data/examples/fib.duby +3 -11
- data/examples/fields.duby +3 -3
- data/examples/fractal.duby +1 -3
- data/examples/sort_closure.duby +7 -0
- data/examples/swing.duby +11 -11
- data/javalib/duby-bootstrap.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/lib/duby.rb +168 -35
- data/lib/duby/ast.rb +224 -27
- data/lib/duby/ast/call.rb +85 -25
- data/lib/duby/ast/class.rb +112 -28
- data/lib/duby/ast/flow.rb +65 -44
- data/lib/duby/ast/intrinsics.rb +223 -21
- data/lib/duby/ast/literal.rb +67 -16
- data/lib/duby/ast/local.rb +36 -40
- data/lib/duby/ast/method.rb +83 -67
- data/lib/duby/ast/structure.rb +105 -23
- data/lib/duby/compiler.rb +83 -28
- data/lib/duby/env.rb +33 -0
- data/lib/duby/jvm/base.rb +210 -0
- data/lib/duby/jvm/compiler.rb +293 -219
- data/lib/duby/jvm/method_lookup.rb +77 -67
- data/lib/duby/jvm/source_compiler.rb +250 -157
- data/lib/duby/jvm/source_generator/builder.rb +53 -49
- data/lib/duby/jvm/source_generator/loops.rb +9 -9
- data/lib/duby/jvm/source_generator/precompile.rb +35 -25
- data/lib/duby/jvm/typer.rb +19 -10
- data/lib/duby/jvm/types.rb +127 -68
- data/lib/duby/jvm/types/basic_types.rb +26 -13
- data/lib/duby/jvm/types/enumerable.rb +6 -4
- data/lib/duby/jvm/types/factory.rb +49 -13
- data/lib/duby/jvm/types/floats.rb +16 -0
- data/lib/duby/jvm/types/integers.rb +63 -2
- data/lib/duby/jvm/types/intrinsics.rb +43 -21
- data/lib/duby/jvm/types/methods.rb +326 -86
- data/lib/duby/jvm/types/number.rb +3 -0
- data/lib/duby/nbcompiler.rb +1 -1
- data/lib/duby/plugin/edb.rb +1 -1
- data/lib/duby/plugin/java.rb +10 -1
- data/lib/duby/transform.rb +134 -46
- data/lib/duby/typer.rb +75 -50
- data/test/test_ast.rb +106 -106
- data/test/test_compilation.rb +46 -32
- data/test/test_env.rb +42 -0
- data/test/test_java_typer.rb +35 -51
- data/test/test_javac_compiler.rb +4 -1
- data/test/test_jvm_compiler.rb +564 -133
- data/test/test_typer.rb +68 -92
- metadata +37 -21
- data/examples/README +0 -16
- data/lib/duby/c/compiler.rb +0 -134
- data/lib/duby/old/compiler_old.rb +0 -845
- data/lib/duby/old/declaration.rb +0 -72
- data/lib/duby/old/mapper.rb +0 -72
- data/lib/duby/old/signature.rb +0 -52
- data/lib/duby/old/typer_old.rb +0 -163
- data/lib/duby/plugin/math.rb +0 -84
- data/test/test_math_plugin.rb +0 -87
data/lib/duby/old/declaration.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'compiler/builder'
|
2
|
-
require 'jruby'
|
3
|
-
|
4
|
-
module Compiler
|
5
|
-
module PrimitiveRuby
|
6
|
-
# reload
|
7
|
-
module Java::OrgJrubyAst
|
8
|
-
class CallNode
|
9
|
-
def declared_type(builder)
|
10
|
-
if name == "[]"
|
11
|
-
# array type, top should be a constant; find the rest
|
12
|
-
array = true
|
13
|
-
elements = []
|
14
|
-
else
|
15
|
-
elements = [name]
|
16
|
-
end
|
17
|
-
|
18
|
-
receiver = receiver_node
|
19
|
-
|
20
|
-
loop do
|
21
|
-
case receiver
|
22
|
-
when ConstNode
|
23
|
-
elements << receiver_node.name
|
24
|
-
break
|
25
|
-
when CallNode
|
26
|
-
elements.unshift(receiver.name)
|
27
|
-
receiver = receiver.receiver_node
|
28
|
-
when SymbolNode
|
29
|
-
elements.unshift(receiver.name)
|
30
|
-
break
|
31
|
-
when VCallNode
|
32
|
-
elements.unshift(receiver.name)
|
33
|
-
break
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# join and load
|
38
|
-
class_name = elements.join(".")
|
39
|
-
type = builder.type(class_name)
|
40
|
-
|
41
|
-
if array
|
42
|
-
type.array_class
|
43
|
-
else
|
44
|
-
type
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class Colon2Node
|
50
|
-
def declared_type(builder)
|
51
|
-
left_node.declared_type(builder).declared_field(name).static_value
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class HashNode
|
56
|
-
def declare_types(builder)
|
57
|
-
@declared = true
|
58
|
-
list = list_node.child_nodes.to_a
|
59
|
-
list.each_index do |index|
|
60
|
-
builder.local(list[index].name, list[index + 1].declared_type(builder)) if index % 2 == 0
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class SymbolNode
|
66
|
-
def declared_type(builder)
|
67
|
-
@type ||= builder.type(name.intern)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/lib/duby/old/mapper.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'compiler/builder'
|
2
|
-
require 'jruby'
|
3
|
-
|
4
|
-
module Compiler
|
5
|
-
module PrimitiveRuby
|
6
|
-
# reload
|
7
|
-
module Java::OrgJrubyAst
|
8
|
-
class CallNode
|
9
|
-
def mapped_name(builder)
|
10
|
-
# TODO move to a utility somewhere for smart name mappings
|
11
|
-
# TODO or at least make it a table...
|
12
|
-
mapped_name = name
|
13
|
-
case receiver_node.type(builder)
|
14
|
-
when JString
|
15
|
-
case name
|
16
|
-
when "+"
|
17
|
-
mapped_name = "concat"
|
18
|
-
# This doesn't work yet, because format is a static method on String
|
19
|
-
# when "%"
|
20
|
-
# mapped_name = "format"
|
21
|
-
end
|
22
|
-
else
|
23
|
-
case name
|
24
|
-
when "new"
|
25
|
-
mapped_name = "<init>"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
mapped_name
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class DefnNode
|
34
|
-
def mapped_name(builder)
|
35
|
-
case name
|
36
|
-
when "initialize"
|
37
|
-
"<init>"
|
38
|
-
else
|
39
|
-
name
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class FCallNode
|
45
|
-
def mapped_name(builder)
|
46
|
-
if name == "puts"
|
47
|
-
"println"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
class InstVarNode
|
53
|
-
def mapped_name(builder)
|
54
|
-
name[1..-1]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class InstAsgnNode
|
59
|
-
def mapped_name(builder)
|
60
|
-
name[1..-1]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class VCallNode
|
65
|
-
def mapped_name(builder)
|
66
|
-
# TODO map names for the local type?
|
67
|
-
name
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/lib/duby/old/signature.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'compiler/builder'
|
2
|
-
require 'jruby'
|
3
|
-
|
4
|
-
module Compiler
|
5
|
-
module PrimitiveRuby
|
6
|
-
# reload
|
7
|
-
module Java::OrgJrubyAst
|
8
|
-
class CallNode
|
9
|
-
def signature(builder)
|
10
|
-
arg_types = []
|
11
|
-
args_node.child_nodes.each do |node|
|
12
|
-
arg_types << node.type(builder)
|
13
|
-
end if args_node
|
14
|
-
|
15
|
-
recv_java_class = receiver_node.type(builder)
|
16
|
-
declared_method = recv_java_class.declared_method_smart(mapped_name(builder), *arg_types)
|
17
|
-
return_type = declared_method.return_type
|
18
|
-
|
19
|
-
if (return_type)
|
20
|
-
return_class = builder.type(return_type.to_s)
|
21
|
-
else
|
22
|
-
return_type = Void
|
23
|
-
end
|
24
|
-
|
25
|
-
return [
|
26
|
-
return_class,
|
27
|
-
*declared_method.parameter_types.map {|type| builder.type(type.to_s)}
|
28
|
-
]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class HashNode
|
33
|
-
def signature(builder)
|
34
|
-
@declared = true
|
35
|
-
arg_types = []
|
36
|
-
return_type = Void
|
37
|
-
list = list_node.child_nodes.to_a
|
38
|
-
list.each_index do |index|
|
39
|
-
if index % 2 == 0
|
40
|
-
if SymbolNode === list[index] && list[index].name == 'return'
|
41
|
-
return_type = list[index + 1].declared_type(builder)
|
42
|
-
else
|
43
|
-
arg_types << list[index + 1].declared_type(builder)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
return [return_type, *arg_types]
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/duby/old/typer_old.rb
DELETED
@@ -1,163 +0,0 @@
|
|
1
|
-
require 'compiler/builder'
|
2
|
-
require 'jruby'
|
3
|
-
|
4
|
-
module Compiler
|
5
|
-
module PrimitiveRuby
|
6
|
-
# reload
|
7
|
-
module Java::OrgJrubyAst
|
8
|
-
class BeginNode
|
9
|
-
def type(builder)
|
10
|
-
body_node.type(builder)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class BlockNode
|
15
|
-
# Type of a block is the type of its final element
|
16
|
-
def type(builder)
|
17
|
-
if child_nodes.size == 0
|
18
|
-
JObject
|
19
|
-
else
|
20
|
-
@type ||= child_nodes.get(child_nodes.size - 1).type(builder)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class CallNode
|
26
|
-
def type(builder)
|
27
|
-
@return_type ||= begin
|
28
|
-
recv_type = receiver_node.type(builder)
|
29
|
-
|
30
|
-
# if we already have an exact class, use it
|
31
|
-
if recv_type.array?
|
32
|
-
if name == "length"
|
33
|
-
Jint
|
34
|
-
else
|
35
|
-
recv_type = recv_type.component_type
|
36
|
-
end
|
37
|
-
elsif JavaClass === recv_type
|
38
|
-
recv_type
|
39
|
-
else
|
40
|
-
# otherwise, find the target method and get its return type
|
41
|
-
recv_java_class = recv_type
|
42
|
-
arg_types = []
|
43
|
-
args_node.child_nodes.each do |node|
|
44
|
-
arg_types << node.type(builder)
|
45
|
-
end if args_node
|
46
|
-
declared_method = recv_java_class.declared_method_smart(mapped_name(builder), *arg_types)
|
47
|
-
return_type = declared_method.return_type
|
48
|
-
|
49
|
-
builder.type(return_type.to_s)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class ConstNode
|
56
|
-
def type(builder)
|
57
|
-
@type ||= builder.type(name)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
class FCallNode
|
62
|
-
def special_signature(recv_type, builder)
|
63
|
-
arg_types = []
|
64
|
-
args_node.child_nodes.each do |node|
|
65
|
-
arg_types << node.type(builder)
|
66
|
-
end if args_node
|
67
|
-
recv_java_class = recv_type
|
68
|
-
declared_method = recv_java_class.declared_method_smart(mapped_name(builder), *arg_types)
|
69
|
-
return_type = declared_method.return_type
|
70
|
-
if (return_type)
|
71
|
-
return_class = return_type
|
72
|
-
else
|
73
|
-
return_class = Void
|
74
|
-
end
|
75
|
-
|
76
|
-
return [
|
77
|
-
return_class,
|
78
|
-
*declared_method.parameter_types
|
79
|
-
]
|
80
|
-
end
|
81
|
-
|
82
|
-
def type(builder)
|
83
|
-
@type ||= begin
|
84
|
-
arg_types = []
|
85
|
-
args_node.child_nodes.each do |node|
|
86
|
-
arg_types << node.type(builder)
|
87
|
-
end if args_node
|
88
|
-
if builder.static
|
89
|
-
signature = builder.static_signature(name, arg_types)
|
90
|
-
else
|
91
|
-
signature = builder.instance_signature(name, arg_types)
|
92
|
-
end
|
93
|
-
raise CompileError.new(position, "Signature not found for call #{name}") unless signature
|
94
|
-
|
95
|
-
signature[0]
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
class FixnumNode
|
101
|
-
def type(builder)
|
102
|
-
Jint
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
class FloatNode
|
107
|
-
def type(builder)
|
108
|
-
Jfloat
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
class InstVarNode
|
113
|
-
def type(builder)
|
114
|
-
@type ||= builder.field_type(mapped_name(builder))
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class InstAsgnNode
|
119
|
-
def type(builder)
|
120
|
-
builder.field(mapped_name(builder), value_node.type(builder))
|
121
|
-
@type ||= builder.field_type(mapped_name(builder))
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
class LocalAsgnNode
|
126
|
-
def type(builder)
|
127
|
-
@type ||= builder.local_type(name)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
class LocalVarNode
|
132
|
-
def type(builder)
|
133
|
-
@type ||= builder.local_type(name)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
class ModuleNode
|
138
|
-
end
|
139
|
-
|
140
|
-
class NewlineNode
|
141
|
-
def type(builder)
|
142
|
-
@type ||= next_node.type(builder)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
class StrNode
|
147
|
-
def type(builder)
|
148
|
-
JString
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
class VCallNode
|
153
|
-
def type(builder)
|
154
|
-
@type ||= if builder.static
|
155
|
-
builder.static_signature(name, [])[0]
|
156
|
-
else
|
157
|
-
builder.instance_signature(name, [])[0]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
data/lib/duby/plugin/math.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'duby/typer'
|
2
|
-
|
3
|
-
module Duby
|
4
|
-
module Typer
|
5
|
-
class MathTyper < BaseTyper
|
6
|
-
def name
|
7
|
-
"Math"
|
8
|
-
end
|
9
|
-
|
10
|
-
def method_type(typer, target_type, name, parameter_types)
|
11
|
-
return nil unless parameter_types.size == 1
|
12
|
-
|
13
|
-
result = case name
|
14
|
-
when '-', '+', '*', '/', '%'
|
15
|
-
case target_type
|
16
|
-
when typer.fixnum_type
|
17
|
-
case parameter_types[0]
|
18
|
-
when typer.fixnum_type
|
19
|
-
typer.fixnum_type
|
20
|
-
when typer.float_type
|
21
|
-
typer.float_type
|
22
|
-
else
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
when typer.float_type
|
26
|
-
case parameter_types[0]
|
27
|
-
when typer.float_type
|
28
|
-
typer.float_type
|
29
|
-
when typer.fixnum_type
|
30
|
-
typer.float_type
|
31
|
-
else
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
else
|
35
|
-
nil
|
36
|
-
end
|
37
|
-
when '<<', '>>', '>>>', '&', '|', '^'
|
38
|
-
case target_type
|
39
|
-
when typer.fixnum_type
|
40
|
-
case parameter_types[0]
|
41
|
-
when typer.fixnum_type
|
42
|
-
typer.fixnum_type
|
43
|
-
else
|
44
|
-
nil
|
45
|
-
end
|
46
|
-
else
|
47
|
-
nil
|
48
|
-
end
|
49
|
-
when '<', '>', '<=', '>=', '=='
|
50
|
-
case target_type
|
51
|
-
when typer.fixnum_type
|
52
|
-
case parameter_types[0]
|
53
|
-
when typer.fixnum_type
|
54
|
-
typer.boolean_type
|
55
|
-
else
|
56
|
-
nil
|
57
|
-
end
|
58
|
-
when typer.float_type
|
59
|
-
case parameter_types[0]
|
60
|
-
when typer.float_type
|
61
|
-
typer.boolean_type
|
62
|
-
else
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
else
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
else
|
69
|
-
nil
|
70
|
-
end
|
71
|
-
|
72
|
-
if result
|
73
|
-
log "Method type for \"#{name}\" #{parameter_types} on #{target_type} = #{result}"
|
74
|
-
else
|
75
|
-
log "Method type for \"#{name}\" #{parameter_types} on #{target_type} not found"
|
76
|
-
end
|
77
|
-
|
78
|
-
result
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
typer_plugins << Typer::MathTyper.new
|
84
|
-
end
|
data/test/test_math_plugin.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'duby'
|
3
|
-
require 'duby/plugin/math'
|
4
|
-
|
5
|
-
class TestMathPlugin < Test::Unit::TestCase
|
6
|
-
include Duby
|
7
|
-
|
8
|
-
def setup
|
9
|
-
@typer = Typer::Simple.new :bar
|
10
|
-
end
|
11
|
-
|
12
|
-
def assert_resolves_to(type, script)
|
13
|
-
ast = AST.parse("1 + 1")
|
14
|
-
ast.infer(@typer)
|
15
|
-
assert_nothing_raised {@typer.resolve(true)}
|
16
|
-
assert_equal(@typer.fixnum_type, ast.inferred_type)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_plus
|
20
|
-
assert_resolves_to(@typer.fixnum_type, '1 + 1')
|
21
|
-
assert_resolves_to(@typer.float_type, '1.0 + 1.0')
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_minus
|
25
|
-
assert_resolves_to(@typer.fixnum_type, '1 - 1')
|
26
|
-
assert_resolves_to(@typer.float_type, '1.0 - 1.0')
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_times
|
30
|
-
assert_resolves_to(@typer.fixnum_type, '1 * 1')
|
31
|
-
assert_resolves_to(@typer.float_type, '1.0 * 1.0')
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_divide
|
35
|
-
assert_resolves_to(@typer.fixnum_type, '1 / 1')
|
36
|
-
assert_resolves_to(@typer.float_type, '1.0 / 1.0')
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_remainder
|
40
|
-
assert_resolves_to(@typer.fixnum_type, '1 % 1')
|
41
|
-
assert_resolves_to(@typer.float_type, '1.0 % 1.0')
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_shift_left
|
45
|
-
assert_resolves_to(@typer.fixnum_type, '1 << 1')
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_shift_right
|
49
|
-
assert_resolves_to(@typer.fixnum_type, '1 >> 1')
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_ushift_right
|
53
|
-
assert_resolves_to(@typer.fixnum_type, '1 >>> 1')
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_bitwise_and
|
57
|
-
assert_resolves_to(@typer.fixnum_type, '1 & 1')
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_bitwise_or
|
61
|
-
assert_resolves_to(@typer.fixnum_type, '1 | 1')
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_bitwise_xor
|
65
|
-
assert_resolves_to(@typer.fixnum_type, '1 ^ 1')
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_less_than
|
69
|
-
assert_resolves_to(@typer.boolean_type, '1 < 1')
|
70
|
-
assert_resolves_to(@typer.boolean_type, '1.0 < 1.0')
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_greater_than
|
74
|
-
assert_resolves_to(@typer.boolean_type, '1 > 1')
|
75
|
-
assert_resolves_to(@typer.boolean_type, '1.0 > 1.0')
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_less_than_or_equal
|
79
|
-
assert_resolves_to(@typer.boolean_type, '1 <= 1')
|
80
|
-
assert_resolves_to(@typer.boolean_type, '1.0 <= 1.0')
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_greater_than_or_equal
|
84
|
-
assert_resolves_to(@typer.boolean_type, '1 >= 1')
|
85
|
-
assert_resolves_to(@typer.boolean_type, '1.0 >= 1.0')
|
86
|
-
end
|
87
|
-
end
|