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.
- 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/jvm/typer.rb
CHANGED
@@ -6,7 +6,7 @@ module Duby
|
|
6
6
|
module Typer
|
7
7
|
class JVM < Simple
|
8
8
|
include Duby::JVM::Types
|
9
|
-
|
9
|
+
|
10
10
|
attr_reader :transformer
|
11
11
|
|
12
12
|
def initialize(filename, transformer)
|
@@ -16,24 +16,25 @@ module Duby
|
|
16
16
|
raise "TypeFactory not installed"
|
17
17
|
end
|
18
18
|
@known_types = @factory.known_types
|
19
|
-
classname =
|
19
|
+
classname = Duby::Compiler::JVM.classname_from_filename(filename)
|
20
20
|
main_class = @factory.declare_type(classname)
|
21
21
|
@known_types['self'] = main_class.meta
|
22
|
+
@known_types['dynamic'] = DynamicType.new
|
22
23
|
@errors = []
|
23
24
|
end
|
24
|
-
|
25
|
+
|
25
26
|
def type_reference(name, array=false, meta=false)
|
26
27
|
@factory.type(name, array, meta)
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
def alias_types(short, long)
|
30
|
-
@
|
31
|
+
@factory.alias(short, long)
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
def name
|
34
35
|
"JVM"
|
35
36
|
end
|
36
|
-
|
37
|
+
|
37
38
|
def type_definition(name, superclass, interfaces)
|
38
39
|
@known_types[name]
|
39
40
|
end
|
@@ -41,7 +42,7 @@ module Duby
|
|
41
42
|
def null_type
|
42
43
|
Null
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
def no_type
|
46
47
|
Void
|
47
48
|
end
|
@@ -55,7 +56,15 @@ module Duby
|
|
55
56
|
# TODO: allow other types for pre-1.2 profiles
|
56
57
|
type_reference("java.util.Map")
|
57
58
|
end
|
58
|
-
|
59
|
+
|
60
|
+
def regexp_type
|
61
|
+
type_reference("java.util.regex.Pattern")
|
62
|
+
end
|
63
|
+
|
64
|
+
def known_type(name)
|
65
|
+
@factory.known_type(name)
|
66
|
+
end
|
67
|
+
|
59
68
|
def learn_method_type(target_type, name, parameter_types, type, exceptions)
|
60
69
|
static = target_type.meta?
|
61
70
|
unless target_type.unmeta.kind_of?(TypeDefinition)
|
@@ -68,7 +77,7 @@ module Duby
|
|
68
77
|
end
|
69
78
|
super
|
70
79
|
end
|
71
|
-
|
80
|
+
|
72
81
|
def infer_signature(method_def)
|
73
82
|
signature = method_def.signature
|
74
83
|
sig_args = signature.dup
|
data/lib/duby/jvm/types.rb
CHANGED
@@ -3,31 +3,27 @@ require 'duby/ast'
|
|
3
3
|
require 'duby/jvm/method_lookup'
|
4
4
|
require 'duby/jvm/compiler'
|
5
5
|
|
6
|
-
class Object
|
7
|
-
def class_builder?
|
8
|
-
self.class.name =~ /::ClassBuilder$/
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
6
|
module Duby
|
13
7
|
module JVM
|
14
8
|
module Types
|
15
9
|
class Type < AST::TypeReference
|
16
10
|
include Duby::JVM::MethodLookup
|
17
11
|
|
12
|
+
attr_writer :inner_class
|
13
|
+
|
18
14
|
def log(message)
|
19
15
|
puts "* [JVM::Types] #{message}" if Duby::Compiler::JVM.verbose
|
20
16
|
end
|
21
17
|
|
22
|
-
def initialize(
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
def initialize(mirror_or_name)
|
19
|
+
if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
|
20
|
+
@type = mirror_or_name
|
21
|
+
name = mirror_or_name.type.class_name
|
22
|
+
else
|
23
|
+
name = mirror_or_name.to_s
|
27
24
|
end
|
28
|
-
super(
|
29
|
-
raise ArgumentError, "Bad type #{
|
30
|
-
@type = java_type
|
25
|
+
super(name, false, false)
|
26
|
+
raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
|
31
27
|
end
|
32
28
|
|
33
29
|
def jvm_type
|
@@ -53,25 +49,36 @@ module Duby
|
|
53
49
|
def interface?
|
54
50
|
@type.interface?
|
55
51
|
end
|
56
|
-
|
52
|
+
|
53
|
+
def dynamic?
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def inner_class?
|
58
|
+
@inner_class
|
59
|
+
end
|
60
|
+
|
57
61
|
def is_parent(other)
|
58
62
|
assignable_from?(other)
|
59
63
|
end
|
60
|
-
|
64
|
+
|
61
65
|
def compatible?(other)
|
62
66
|
assignable_from?(other)
|
63
67
|
end
|
64
|
-
|
68
|
+
|
65
69
|
def assignable_from?(other)
|
70
|
+
return false if other.nil?
|
66
71
|
return true if !primitive? && other == Null
|
67
72
|
return true if other == self
|
68
73
|
return true if other.error? || other.unreachable?
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
|
75
|
+
# TODO should we allow more here?
|
76
|
+
return interface? if other.block?
|
77
|
+
|
78
|
+
return true if jvm_type && (jvm_type == other.jvm_type)
|
79
|
+
|
80
|
+
assignable_from?(other.superclass) ||
|
81
|
+
other.interfaces.any? {|i| assignable_from?(i)}
|
75
82
|
end
|
76
83
|
|
77
84
|
def iterable?
|
@@ -79,7 +86,7 @@ module Duby
|
|
79
86
|
'java.util.Iterator',
|
80
87
|
'java.util.Enumeration'].any? {|n| AST.type(n).assignable_from(self)}
|
81
88
|
end
|
82
|
-
|
89
|
+
|
83
90
|
def component_type
|
84
91
|
AST.type('java.lang.Object') if iterable?
|
85
92
|
end
|
@@ -87,7 +94,7 @@ module Duby
|
|
87
94
|
def meta
|
88
95
|
@meta ||= MetaType.new(self)
|
89
96
|
end
|
90
|
-
|
97
|
+
|
91
98
|
def unmeta
|
92
99
|
self
|
93
100
|
end
|
@@ -97,13 +104,13 @@ module Duby
|
|
97
104
|
end
|
98
105
|
|
99
106
|
def array_type
|
100
|
-
@array_type ||= ArrayType.new(self)
|
107
|
+
@array_type ||= Duby::JVM::Types::ArrayType.new(self)
|
101
108
|
end
|
102
109
|
|
103
110
|
def prefix
|
104
111
|
'a'
|
105
112
|
end
|
106
|
-
|
113
|
+
|
107
114
|
# is this a 64 bit type?
|
108
115
|
def wide?
|
109
116
|
false
|
@@ -121,13 +128,14 @@ module Duby
|
|
121
128
|
raise "Incomplete type #{self}" unless jvm_type
|
122
129
|
AST.type(jvm_type.superclass) if jvm_type.superclass
|
123
130
|
end
|
124
|
-
|
131
|
+
|
125
132
|
def interfaces
|
133
|
+
raise "Incomplete type #{self} (#{self.class})" unless jvm_type
|
126
134
|
@interfaces ||= jvm_type.interfaces.map do |interface|
|
127
135
|
AST.type(interface)
|
128
136
|
end
|
129
137
|
end
|
130
|
-
|
138
|
+
|
131
139
|
def astore(builder)
|
132
140
|
if primitive?
|
133
141
|
builder.send "#{name[0,1]}astore"
|
@@ -135,7 +143,7 @@ module Duby
|
|
135
143
|
builder.aastore
|
136
144
|
end
|
137
145
|
end
|
138
|
-
|
146
|
+
|
139
147
|
def aload(builder)
|
140
148
|
if primitive?
|
141
149
|
builder.send "#{name[0,1]}aload"
|
@@ -162,18 +170,22 @@ module Duby
|
|
162
170
|
def newarray(method)
|
163
171
|
method.send "new#{name}array"
|
164
172
|
end
|
165
|
-
|
173
|
+
|
166
174
|
def interfaces
|
167
175
|
[]
|
168
176
|
end
|
169
|
-
|
177
|
+
|
170
178
|
def convertible_to?(type)
|
171
179
|
return true if type == self
|
172
|
-
|
173
|
-
|
180
|
+
widening_conversions = WIDENING_CONVERSIONS[self]
|
181
|
+
widening_conversions && widening_conversions.include?(type)
|
182
|
+
end
|
183
|
+
|
184
|
+
def superclass
|
185
|
+
nil
|
174
186
|
end
|
175
187
|
end
|
176
|
-
|
188
|
+
|
177
189
|
class MetaType < Type
|
178
190
|
attr_reader :unmeta
|
179
191
|
|
@@ -193,25 +205,33 @@ module Duby
|
|
193
205
|
def meta
|
194
206
|
self
|
195
207
|
end
|
196
|
-
|
208
|
+
|
197
209
|
def superclass
|
198
210
|
@unmeta.superclass.meta if @unmeta.superclass
|
199
211
|
end
|
200
|
-
|
212
|
+
|
201
213
|
def interfaces
|
202
214
|
[]
|
203
215
|
end
|
204
|
-
|
216
|
+
|
205
217
|
def jvm_type
|
206
218
|
unmeta.jvm_type
|
207
219
|
end
|
220
|
+
|
221
|
+
def inner_class?
|
222
|
+
basic_type.inner_class?
|
223
|
+
end
|
208
224
|
end
|
209
|
-
|
225
|
+
|
210
226
|
class NullType < Type
|
211
227
|
def initialize
|
212
|
-
super(java.lang.Object)
|
228
|
+
super('java.lang.Object')
|
213
229
|
end
|
214
|
-
|
230
|
+
|
231
|
+
def to_s
|
232
|
+
"Type(null)"
|
233
|
+
end
|
234
|
+
|
215
235
|
def compatible?(other)
|
216
236
|
!other.primitive?
|
217
237
|
end
|
@@ -219,14 +239,13 @@ module Duby
|
|
219
239
|
|
220
240
|
class VoidType < PrimitiveType
|
221
241
|
def initialize
|
222
|
-
super(
|
223
|
-
@name = "void"
|
242
|
+
super('void', Java::JavaLang::Void)
|
224
243
|
end
|
225
244
|
|
226
245
|
def void?
|
227
246
|
true
|
228
247
|
end
|
229
|
-
|
248
|
+
|
230
249
|
def return(builder)
|
231
250
|
builder.returnvoid
|
232
251
|
end
|
@@ -237,44 +256,79 @@ module Duby
|
|
237
256
|
|
238
257
|
def initialize(component_type)
|
239
258
|
@component_type = component_type
|
259
|
+
if @component_type.jvm_type
|
260
|
+
#@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
|
261
|
+
else
|
262
|
+
# FIXME: THIS IS WRONG, but I don't know how to fix it
|
263
|
+
#@type = @component_type
|
264
|
+
end
|
240
265
|
@name = component_type.name
|
241
266
|
end
|
242
267
|
|
243
|
-
def jvm_type
|
244
|
-
@component_type.jvm_type
|
245
|
-
end
|
246
|
-
|
247
268
|
def array?
|
248
269
|
true
|
249
270
|
end
|
250
|
-
|
271
|
+
|
251
272
|
def iterable?
|
252
273
|
true
|
253
274
|
end
|
254
|
-
|
275
|
+
|
276
|
+
def inner_class?
|
277
|
+
basic_type.inner_class?
|
278
|
+
end
|
279
|
+
|
255
280
|
def basic_type
|
256
281
|
component_type.basic_type
|
257
282
|
end
|
258
|
-
|
283
|
+
|
259
284
|
def superclass
|
260
285
|
Object
|
261
286
|
end
|
287
|
+
|
288
|
+
def interfaces
|
289
|
+
[]
|
290
|
+
end
|
262
291
|
end
|
263
|
-
|
292
|
+
|
293
|
+
class DynamicType < Type
|
294
|
+
ObjectType = Type.new('java.lang.Object')
|
295
|
+
|
296
|
+
def initialize
|
297
|
+
# For naming, bytecode purposes, we are an Object
|
298
|
+
@name = "java.lang.Object"
|
299
|
+
end
|
300
|
+
|
301
|
+
def basic_type
|
302
|
+
self
|
303
|
+
end
|
304
|
+
|
305
|
+
def is_parent(other)
|
306
|
+
ObjectType.assignable_from?(other)
|
307
|
+
end
|
308
|
+
|
309
|
+
def assignable_from?(other)
|
310
|
+
ObjectType.assignable_from?(other)
|
311
|
+
end
|
312
|
+
|
313
|
+
def jvm_type
|
314
|
+
java.lang.Object
|
315
|
+
end
|
316
|
+
|
317
|
+
def dynamic?
|
318
|
+
true
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
264
322
|
class TypeDefinition < Type
|
265
323
|
attr_accessor :node
|
266
|
-
|
324
|
+
|
267
325
|
def initialize(name, node)
|
268
|
-
if name.
|
269
|
-
|
270
|
-
else
|
271
|
-
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
272
|
-
@name = name
|
273
|
-
end
|
326
|
+
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
327
|
+
@name = name
|
274
328
|
@node = node
|
275
329
|
raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
|
276
330
|
end
|
277
|
-
|
331
|
+
|
278
332
|
def name
|
279
333
|
if @type
|
280
334
|
@type.name
|
@@ -282,11 +336,11 @@ module Duby
|
|
282
336
|
@name
|
283
337
|
end
|
284
338
|
end
|
285
|
-
|
339
|
+
|
286
340
|
def superclass
|
287
341
|
(node && node.superclass) || Object
|
288
342
|
end
|
289
|
-
|
343
|
+
|
290
344
|
def interfaces
|
291
345
|
if node
|
292
346
|
node.interfaces
|
@@ -294,27 +348,32 @@ module Duby
|
|
294
348
|
[]
|
295
349
|
end
|
296
350
|
end
|
297
|
-
|
351
|
+
|
298
352
|
def define(builder)
|
299
353
|
class_name = @name.tr('.', '/')
|
300
354
|
@type ||= builder.public_class(class_name, superclass, *interfaces)
|
301
355
|
end
|
302
|
-
|
356
|
+
|
303
357
|
def meta
|
304
358
|
@meta ||= TypeDefMeta.new(self)
|
305
359
|
end
|
306
360
|
end
|
307
|
-
|
361
|
+
|
308
362
|
class InterfaceDefinition < TypeDefinition
|
309
363
|
def initialize(name, node)
|
310
364
|
super(name, node)
|
311
365
|
end
|
312
|
-
|
366
|
+
|
313
367
|
def define(builder)
|
314
|
-
|
368
|
+
class_name = @name.tr('.', '/')
|
369
|
+
@type ||= builder.public_interface(class_name, *interfaces)
|
370
|
+
end
|
371
|
+
|
372
|
+
def interface?
|
373
|
+
true
|
315
374
|
end
|
316
375
|
end
|
317
|
-
|
376
|
+
|
318
377
|
class TypeDefMeta < MetaType
|
319
378
|
end
|
320
379
|
end
|
@@ -1,19 +1,32 @@
|
|
1
1
|
module Duby::JVM::Types
|
2
|
-
Boolean = BooleanType.new(
|
3
|
-
Byte = IntegerType.new(
|
4
|
-
Char = IntegerType.new(
|
5
|
-
Short = IntegerType.new(
|
6
|
-
Int = IntegerType.new(
|
7
|
-
Long = LongType.new(
|
8
|
-
Float = FloatType.new(
|
9
|
-
Double = DoubleType.new(
|
2
|
+
Boolean = BooleanType.new('boolean', java.lang.Boolean)
|
3
|
+
Byte = IntegerType.new('byte', java.lang.Byte)
|
4
|
+
Char = IntegerType.new('char', java.lang.Character)
|
5
|
+
Short = IntegerType.new('short', java.lang.Short)
|
6
|
+
Int = IntegerType.new('int', java.lang.Integer)
|
7
|
+
Long = LongType.new('long', java.lang.Long)
|
8
|
+
Float = FloatType.new('float', java.lang.Float)
|
9
|
+
Double = DoubleType.new('double', java.lang.Double)
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
# TODO these shouldn't be constants. They should be loaded from
|
12
|
+
# the compilation class path.
|
13
|
+
Object = Type.new(BiteScript::ASM::ClassMirror.load('java.lang.Object'))
|
14
|
+
String = StringType.new(
|
15
|
+
BiteScript::ASM::ClassMirror.load('java.lang.String'))
|
16
|
+
Iterable = IterableType.new(
|
17
|
+
BiteScript::ASM::ClassMirror.load('java.lang.Iterable'))
|
14
18
|
|
15
19
|
Void = VoidType.new
|
16
20
|
Null = NullType.new
|
17
|
-
|
21
|
+
|
22
|
+
WIDENING_CONVERSIONS = {
|
23
|
+
Byte => [Byte, Short, Int, Long, Float, Double],
|
24
|
+
Short => [Short, Int, Long, Float, Double],
|
25
|
+
Char => [Char, Int, Long, Float, Double],
|
26
|
+
Int => [Int, Long, Float, Double],
|
27
|
+
Long => [Long, Float, Double],
|
28
|
+
Float => [Float, Double],
|
29
|
+
Double => [Double]
|
30
|
+
}
|
18
31
|
TYPE_ORDERING = [Byte, Short, Int, Long, Float, Double]
|
19
|
-
end
|
32
|
+
end
|