duby 0.0.2-java → 0.0.3-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. data/History.txt +7 -0
  2. data/README.txt +18 -7
  3. data/Rakefile +72 -0
  4. data/examples/ant/example-build.xml +7 -0
  5. data/examples/appengine/Rakefile +8 -67
  6. data/examples/appengine/Readme +4 -3
  7. data/examples/appengine/lib/duby/appengine_tasks.rb +173 -0
  8. data/examples/appengine/lib/duby/plugin/datastore.rb +92 -31
  9. data/examples/appengine/lib/duby_task.rb +61 -0
  10. data/examples/appengine/src/com/ribrdb/DubyApp.duby +32 -6
  11. data/examples/appengine/src/com/ribrdb/list.dhtml +2 -2
  12. data/examples/appengine/{config.ru → src/config.ru} +0 -0
  13. data/examples/bintrees.duby +66 -0
  14. data/examples/dynamic.duby +17 -0
  15. data/examples/fib.duby +3 -11
  16. data/examples/fields.duby +3 -3
  17. data/examples/fractal.duby +1 -3
  18. data/examples/sort_closure.duby +7 -0
  19. data/examples/swing.duby +11 -11
  20. data/javalib/duby-bootstrap.jar +0 -0
  21. data/javalib/dynalang-invoke-0.1.jar +0 -0
  22. data/lib/duby.rb +168 -35
  23. data/lib/duby/ast.rb +224 -27
  24. data/lib/duby/ast/call.rb +85 -25
  25. data/lib/duby/ast/class.rb +112 -28
  26. data/lib/duby/ast/flow.rb +65 -44
  27. data/lib/duby/ast/intrinsics.rb +223 -21
  28. data/lib/duby/ast/literal.rb +67 -16
  29. data/lib/duby/ast/local.rb +36 -40
  30. data/lib/duby/ast/method.rb +83 -67
  31. data/lib/duby/ast/structure.rb +105 -23
  32. data/lib/duby/compiler.rb +83 -28
  33. data/lib/duby/env.rb +33 -0
  34. data/lib/duby/jvm/base.rb +210 -0
  35. data/lib/duby/jvm/compiler.rb +293 -219
  36. data/lib/duby/jvm/method_lookup.rb +77 -67
  37. data/lib/duby/jvm/source_compiler.rb +250 -157
  38. data/lib/duby/jvm/source_generator/builder.rb +53 -49
  39. data/lib/duby/jvm/source_generator/loops.rb +9 -9
  40. data/lib/duby/jvm/source_generator/precompile.rb +35 -25
  41. data/lib/duby/jvm/typer.rb +19 -10
  42. data/lib/duby/jvm/types.rb +127 -68
  43. data/lib/duby/jvm/types/basic_types.rb +26 -13
  44. data/lib/duby/jvm/types/enumerable.rb +6 -4
  45. data/lib/duby/jvm/types/factory.rb +49 -13
  46. data/lib/duby/jvm/types/floats.rb +16 -0
  47. data/lib/duby/jvm/types/integers.rb +63 -2
  48. data/lib/duby/jvm/types/intrinsics.rb +43 -21
  49. data/lib/duby/jvm/types/methods.rb +326 -86
  50. data/lib/duby/jvm/types/number.rb +3 -0
  51. data/lib/duby/nbcompiler.rb +1 -1
  52. data/lib/duby/plugin/edb.rb +1 -1
  53. data/lib/duby/plugin/java.rb +10 -1
  54. data/lib/duby/transform.rb +134 -46
  55. data/lib/duby/typer.rb +75 -50
  56. data/test/test_ast.rb +106 -106
  57. data/test/test_compilation.rb +46 -32
  58. data/test/test_env.rb +42 -0
  59. data/test/test_java_typer.rb +35 -51
  60. data/test/test_javac_compiler.rb +4 -1
  61. data/test/test_jvm_compiler.rb +564 -133
  62. data/test/test_typer.rb +68 -92
  63. metadata +37 -21
  64. data/examples/README +0 -16
  65. data/lib/duby/c/compiler.rb +0 -134
  66. data/lib/duby/old/compiler_old.rb +0 -845
  67. data/lib/duby/old/declaration.rb +0 -72
  68. data/lib/duby/old/mapper.rb +0 -72
  69. data/lib/duby/old/signature.rb +0 -52
  70. data/lib/duby/old/typer_old.rb +0 -163
  71. data/lib/duby/plugin/math.rb +0 -84
  72. data/test/test_math_plugin.rb +0 -87
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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