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
@@ -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 = File.basename(filename, '.duby')
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
- @known_types[short] = type_reference(long)
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
@@ -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(java_type)
23
- orig_type = java_type
24
- if !(java_type.kind_of?(Java::JavaClass) ||
25
- java_type.class_builder?)
26
- java_type = java_type.java_class
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(java_type.name, false, false)
29
- raise ArgumentError, "Bad type #{orig_type}" if name =~ /Java::/
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
- begin
70
- jvm_type.assignable_from?(other.jvm_type)
71
- rescue
72
- assignable_from?(other.superclass) ||
73
- other.interfaces.any? {|i| assignable_from?(i)}
74
- end
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
- a, b = TYPE_ORDERING.index(self), TYPE_ORDERING.index(type)
173
- a && b && b > a
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(Java::JavaLang::Void, Java::JavaLang::Void)
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.class_builder?
269
- super(name)
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
- @type ||= builder.public_interface(@name, *interfaces)
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(Java::boolean, java.lang.Boolean)
3
- Byte = IntegerType.new(Java::byte, java.lang.Byte)
4
- Char = IntegerType.new(Java::char, java.lang.Character)
5
- Short = IntegerType.new(Java::short, java.lang.Short)
6
- Int = IntegerType.new(Java::int, java.lang.Integer)
7
- Long = LongType.new(Java::long, java.lang.Long)
8
- Float = FloatType.new(Java::float, java.lang.Float)
9
- Double = DoubleType.new(Java::double, java.lang.Double)
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
- Object = Type.new(Java::JavaLang.Object)
12
- String = StringType.new(Java::JavaLang.String)
13
- Iterable = IterableType.new(Java::JavaLang.Iterable)
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