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.
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
@@ -5,18 +5,40 @@ module Duby
5
5
  class << self
6
6
  attr_accessor :verbose
7
7
  end
8
-
8
+
9
9
  # The top of the AST class hierarchy, this represents an abstract AST node.
10
10
  # It provides accessors for _children_, an array of all child nodes,
11
11
  # _parent_, a reference to this node's parent (nil if none), and _newline_,
12
12
  # whether this node represents a new line.
13
13
  class Node
14
+ include Java::DubyLangCompiler.Node
15
+ include Enumerable
16
+
14
17
  attr_accessor :children
15
18
  attr_accessor :parent
16
19
  attr_accessor :position
17
20
  attr_accessor :newline
18
21
  attr_accessor :inferred_type
19
22
 
23
+ def self.child(name)
24
+ @children ||= []
25
+ index = @children.size
26
+ class_eval <<-EOF
27
+ def #{name}
28
+ @children[#{index}]
29
+ end
30
+
31
+ def #{name}=(node)
32
+ @children[#{index}] = _set_parent(node)
33
+ end
34
+ EOF
35
+ @children << name
36
+ end
37
+
38
+ def self.child_name(i)
39
+ @children[i] if @children
40
+ end
41
+
20
42
  def initialize(parent, position, children = [])
21
43
  @parent = parent
22
44
  @newline = false
@@ -45,16 +67,28 @@ module Duby
45
67
  def inspect(indent = 0)
46
68
  indent_str = ' ' * indent
47
69
  str = indent_str + to_s
48
- children.each do |child|
70
+ children.each_with_index do |child, i|
71
+ extra_indent = 0
49
72
  if child
73
+ name = self.class.child_name(i)
74
+ if Duby::AST.verbose && name
75
+ str << "\n#{indent_str} #{name}:"
76
+ extra_indent = 1
77
+ end
50
78
  if ::Array === child
51
79
  child.each {|ary_child|
52
- str << "\n#{ary_child.inspect(indent + 1)}"
80
+ if Duby::AST.verbose && Node === ary_child && ary_child.parent != self
81
+ str << "\n#{indent_str} (wrong parent)"
82
+ end
83
+ str << "\n#{ary_child.inspect(indent + extra_indent + 1)}"
53
84
  }
54
85
  elsif ::Hash === child
55
86
  str << "\n#{indent_str} #{child.inspect}"
56
87
  else
57
- str << "\n#{child.inspect(indent + 1)}"
88
+ if Duby::AST.verbose && Node === child && child.parent != self
89
+ str << "\n#{indent_str} (wrong parent)"
90
+ end
91
+ str << "\n#{child.inspect(indent + extra_indent + 1)}"
58
92
  end
59
93
  end
60
94
  end
@@ -71,7 +105,21 @@ module Duby
71
105
 
72
106
  def each(&b) children.each(&b) end
73
107
 
74
- def resolved!
108
+ def <<(node)
109
+ @children << _set_parent(node)
110
+ self
111
+ end
112
+
113
+ def insert(index, node)
114
+ node.parent = self
115
+ @children.insert(index, node)
116
+ end
117
+
118
+ def empty?
119
+ @children.empty?
120
+ end
121
+
122
+ def resolved!(typer=nil)
75
123
  log "#{to_s} resolved!"
76
124
  @resolved = true
77
125
  end
@@ -81,7 +129,7 @@ module Duby
81
129
  def resolve_if(typer)
82
130
  unless resolved?
83
131
  @inferred_type = yield
84
- @inferred_type ? resolved! : typer.defer(self)
132
+ @inferred_type ? resolved!(typer) : typer.defer(self)
85
133
  end
86
134
  @inferred_type
87
135
  end
@@ -89,8 +137,33 @@ module Duby
89
137
  def self.===(other)
90
138
  super || (other.kind_of?(NodeProxy) && (self === other.__getobj__))
91
139
  end
140
+
141
+ def _set_parent(node)
142
+ case node
143
+ when Node
144
+ node.parent = self
145
+ when ::Array
146
+ node.each {|x| x.parent = self if x}
147
+ end
148
+ node
149
+ end
150
+
151
+ def initialize_copy(other)
152
+ @parent = nil
153
+ @children = []
154
+ other.children.each do |child|
155
+ case child
156
+ when ::Array
157
+ self << child.map {|x| x.dup}
158
+ when nil
159
+ self << nil
160
+ else
161
+ self << child.dup
162
+ end
163
+ end
164
+ end
92
165
  end
93
-
166
+
94
167
  class ErrorNode < Node
95
168
  def initialize(parent, error)
96
169
  super(parent, error.position)
@@ -98,7 +171,7 @@ module Duby
98
171
  @inferred_type = TypeReference::ErrorType
99
172
  @resolved = true
100
173
  end
101
-
174
+
102
175
  def infer(typer)
103
176
  end
104
177
  end
@@ -134,10 +207,20 @@ module Duby
134
207
  @scope ||= begin
135
208
  scope = parent
136
209
  raise "No parent for #{self.class.name} at #{line_number}" if scope.nil?
137
- scope = scope.parent until scope.class.include?(Scope)
210
+ until scope.class.include?(Scope)
211
+ scope = scope.parent
212
+ end
138
213
  scope
139
214
  end
140
215
  end
216
+
217
+ def containing_scope
218
+ scope = self.scope.static_scope
219
+ while scope.parent && scope.parent.include?(name)
220
+ scope = scope.parent
221
+ end
222
+ scope
223
+ end
141
224
  end
142
225
 
143
226
  module ClassScoped
@@ -159,7 +242,109 @@ module Duby
159
242
  end
160
243
  end
161
244
 
162
- module Scope; end
245
+ class StaticScope
246
+ attr_reader :parent
247
+ attr_writer :self_type
248
+
249
+ def initialize(parent=nil)
250
+ @vars = {}
251
+ @parent = parent
252
+ @children = {}
253
+ end
254
+
255
+ def <<(name)
256
+ @vars[name] = true
257
+ end
258
+
259
+ def include?(name, include_parent=true)
260
+ @vars.include?(name) ||
261
+ (include_parent && parent && parent.include?(name))
262
+ end
263
+
264
+ def captured?(name)
265
+ if !include?(name, false)
266
+ return false
267
+ elsif parent && parent.include?(name)
268
+ return true
269
+ else
270
+ return children.any? {|child| child.include?(name, false)}
271
+ end
272
+ end
273
+
274
+ def children
275
+ @children.keys
276
+ end
277
+
278
+ def add_child(scope)
279
+ @children[scope] = true
280
+ end
281
+
282
+ def remove_child(scope)
283
+ @children.delete(scope)
284
+ end
285
+
286
+ def parent=(parent)
287
+ @parent.remove_child(self) if @parent
288
+ parent.add_child(self)
289
+ @parent = parent
290
+ end
291
+
292
+ def self_type
293
+ if @self_type.nil? && parent
294
+ @self_type = parent.self_type
295
+ end
296
+ @self_type
297
+ end
298
+
299
+ def binding_type(defining_class=nil, duby=nil)
300
+ @binding_type ||= begin
301
+ if parent
302
+ parent.binding_type(defining_class, duby)
303
+ else
304
+ name = "#{defining_class.name}$#{duby.tmp}"
305
+ factory = Duby::AST.type_factory
306
+ if factory
307
+ factory.declare_type(name)
308
+ else
309
+ Duby::AST::TypeReference.new(name, false, false)
310
+ end
311
+ end
312
+ end
313
+ end
314
+
315
+ def binding_type=(type)
316
+ if parent
317
+ parent.binding_type = type
318
+ else
319
+ @binding_type = type
320
+ end
321
+ end
322
+
323
+ def has_binding?
324
+ @binding_type != nil || (parent && parent.has_binding?)
325
+ end
326
+ end
327
+
328
+ module Scope
329
+ attr_writer :static_scope
330
+ def static_scope
331
+ @static_scope ||= StaticScope.new
332
+ end
333
+ end
334
+
335
+ module Binding
336
+ def binding_type(duby=nil)
337
+ static_scope.binding_type(defining_class, duby)
338
+ end
339
+
340
+ def binding_type=(type)
341
+ static_scope.binding_type = type
342
+ end
343
+
344
+ def has_binding?
345
+ static_scope.has_binding?
346
+ end
347
+ end
163
348
 
164
349
  class Colon2 < Node; end
165
350
 
@@ -186,10 +371,14 @@ module Duby
186
371
  class VoidType < Node; end
187
372
 
188
373
  class Annotation < Node
374
+ attr_reader :values
375
+ attr_accessor :runtime
376
+ alias runtime? runtime
377
+
189
378
  def initialize(parent, position, klass)
190
379
  super(parent, position)
191
380
  @class = klass
192
- @values = []
381
+ @values = {}
193
382
  end
194
383
 
195
384
  def name
@@ -201,7 +390,11 @@ module Duby
201
390
  end
202
391
 
203
392
  def []=(name, value)
204
- # TODO support annotation arguments
393
+ @values[name] = value
394
+ end
395
+
396
+ def [](name)
397
+ @values[name]
205
398
  end
206
399
  end
207
400
 
@@ -211,7 +404,7 @@ module Duby
211
404
  alias array? array
212
405
  attr_accessor :meta
213
406
  alias meta? meta
214
-
407
+
215
408
  def initialize(name, array = false, meta = false, position=nil)
216
409
  super(nil, position)
217
410
  @name = name
@@ -239,7 +432,7 @@ module Duby
239
432
  # default behavior now is to disallow any polymorphic types
240
433
  self == other
241
434
  end
242
-
435
+
243
436
  def compatible?(other)
244
437
  # default behavior is only exact match right now
245
438
  self == other ||
@@ -250,7 +443,7 @@ module Duby
250
443
  def iterable?
251
444
  array?
252
445
  end
253
-
446
+
254
447
  def component_type
255
448
  AST.type(name) if array?
256
449
  end
@@ -276,14 +469,18 @@ module Duby
276
469
  name == :error
277
470
  end
278
471
 
472
+ def null?
473
+ name == :null
474
+ end
475
+
279
476
  def unreachable?
280
477
  name == :unreachable
281
478
  end
282
-
479
+
283
480
  def block?
284
481
  name == :block
285
482
  end
286
-
483
+
287
484
  def primitive?
288
485
  true
289
486
  end
@@ -305,15 +502,15 @@ module Duby
305
502
  @interfaces = interfaces
306
503
  end
307
504
  end
308
-
505
+
309
506
  def self.type_factory
310
507
  Thread.current[:ast_type_factory]
311
508
  end
312
-
509
+
313
510
  def self.type_factory=(factory)
314
511
  Thread.current[:ast_type_factory] = factory
315
512
  end
316
-
513
+
317
514
  # Shortcut method to construct type references
318
515
  def self.type(typesym, array = false, meta = false)
319
516
  factory = type_factory
@@ -323,7 +520,7 @@ module Duby
323
520
  TypeReference.new(typesym, array, meta)
324
521
  end
325
522
  end
326
-
523
+
327
524
  def self.no_type
328
525
  factory = type_factory
329
526
  if factory
@@ -332,7 +529,7 @@ module Duby
332
529
  TypeReference::NoType
333
530
  end
334
531
  end
335
-
532
+
336
533
  def self.error_type
337
534
  TypeReference::ErrorType
338
535
  end
@@ -340,7 +537,7 @@ module Duby
340
537
  def self.unreachable_type
341
538
  TypeReference::UnreachableType
342
539
  end
343
-
540
+
344
541
  def self.block_type
345
542
  TypeReference::BlockType
346
543
  end
@@ -351,7 +548,7 @@ module Duby
351
548
  factory.fixnum(parent, position, literal)
352
549
  else
353
550
  Fixnum.new(parent, position, literal)
354
- end
551
+ end
355
552
  end
356
553
 
357
554
  def self.float(parent, position, literal)
@@ -360,15 +557,15 @@ module Duby
360
557
  factory.float(parent, position, literal)
361
558
  else
362
559
  Float.new(parent, position, literal)
363
- end
560
+ end
364
561
  end
365
-
562
+
366
563
  def self.defmacro(name, &block)
367
564
  @macros ||= {}
368
565
  raise "Conflicting macros for #{name}" if @macros[name]
369
566
  @macros[name] = block
370
567
  end
371
-
568
+
372
569
  def self.macro(name)
373
570
  @macros[name]
374
571
  end
@@ -6,13 +6,25 @@ module Duby::AST
6
6
  node.parent = parent
7
7
  __setobj__(node)
8
8
  end
9
+
10
+ def dup
11
+ new = super
12
+ new.__setobj__(__getobj__.dup)
13
+ new.proxy = new
14
+ new
15
+ end
9
16
  end
10
17
 
11
18
  class FunctionalCall < Node
19
+ include Java::DubyLangCompiler.Call
12
20
  include Named
13
- attr_accessor :parameters, :block, :cast, :inlined, :proxy
21
+ include Scoped
22
+ attr_accessor :cast, :inlined, :proxy
14
23
  alias cast? cast
15
24
 
25
+ child :parameters
26
+ child :block
27
+
16
28
  def self.new(*args, &block)
17
29
  real_node = super
18
30
  real_node.proxy = NodeProxy.new(real_node)
@@ -20,30 +32,47 @@ module Duby::AST
20
32
 
21
33
  def initialize(parent, line_number, name, &kids)
22
34
  super(parent, line_number, &kids)
23
- @parameters, @block = children
24
35
  @name = name
25
36
  @cast = false
26
37
  end
27
-
38
+
39
+ def arguments
40
+ @arguments ||= begin
41
+ args = java.util.ArrayList.new(parameters.size)
42
+ parameters.each do |param|
43
+ args.add(param)
44
+ end
45
+ args
46
+ end
47
+ end
48
+
49
+ def target
50
+ nil
51
+ end
52
+
28
53
  def infer(typer)
29
- @self_type ||= typer.self_type
54
+ @self_type ||= scope.defining_class
30
55
 
31
56
  unless @inferred_type
32
57
  receiver_type = @self_type
33
58
  should_defer = false
34
-
59
+
35
60
  parameter_types = parameters.map do |param|
36
61
  typer.infer(param) || should_defer = true
37
62
  end
38
-
39
- parameter_types << Duby::AST.block_type if @block
40
-
63
+
64
+ parameter_types << Duby::AST.block_type if block
65
+
41
66
  unless should_defer
42
- if parameters.size == 1 && typer.known_types[name]
67
+ if parameters.size == 1 && typer.known_type(name)
43
68
  # cast operation
44
69
  resolved!
45
70
  self.cast = true
46
- @inferred_type = typer.known_types[name]
71
+ @inferred_type = typer.known_type(name)
72
+ elsif parameters.size == 0 && scope.static_scope.include?(name)
73
+ @inlined = Local.new(parent, position, name)
74
+ proxy.__inline__(@inlined)
75
+ return proxy.infer(typer)
47
76
  else
48
77
  @inferred_type = typer.method_type(receiver_type, name,
49
78
  parameter_types)
@@ -54,17 +83,30 @@ module Duby::AST
54
83
  end
55
84
  end
56
85
  end
57
-
58
- @inferred_type ? resolved! : typer.defer(proxy)
86
+
87
+ if @inferred_type
88
+ if block
89
+ method = receiver_type.get_method(name, parameter_types)
90
+ block.prepare(typer, method)
91
+ end
92
+ resolved!
93
+ else
94
+ typer.defer(proxy)
95
+ end
59
96
  end
60
-
97
+
61
98
  @inferred_type
62
99
  end
63
100
  end
64
-
101
+
65
102
  class Call < Node
103
+ include Java::DubyLangCompiler.Call
66
104
  include Named
67
- attr_accessor :target, :parameters, :block, :inlined, :proxy
105
+ attr_accessor :inlined, :proxy
106
+
107
+ child :target
108
+ child :parameters
109
+ child :block
68
110
 
69
111
  def self.new(*args, &block)
70
112
  real_node = super
@@ -72,11 +114,20 @@ module Duby::AST
72
114
  end
73
115
 
74
116
  def initialize(parent, line_number, name, &kids)
75
- super(parent, line_number, children, &kids)
76
- @target, @parameters, @block = children
117
+ super(parent, line_number, &kids)
77
118
  @name = name
78
119
  end
79
120
 
121
+ def arguments
122
+ @arguments ||= begin
123
+ args = java.util.ArrayList.new(parameters.size)
124
+ parameters.each do |param|
125
+ args.add(param)
126
+ end
127
+ args
128
+ end
129
+ end
130
+
80
131
  def infer(typer)
81
132
  unless @inferred_type
82
133
  receiver_type = typer.infer(target)
@@ -85,7 +136,7 @@ module Duby::AST
85
136
  typer.infer(param) || should_defer = true
86
137
  end
87
138
 
88
- parameter_types << Duby::AST.block_type if @block
139
+ parameter_types << Duby::AST.block_type if block
89
140
 
90
141
  unless should_defer
91
142
  @inferred_type = typer.method_type(receiver_type, name,
@@ -96,22 +147,31 @@ module Duby::AST
96
147
  return proxy.infer(typer)
97
148
  end
98
149
  end
99
-
100
- @inferred_type ? resolved! : typer.defer(proxy)
150
+
151
+ if @inferred_type
152
+ if block && !receiver_type.error?
153
+ method = receiver_type.get_method(name, parameter_types)
154
+ block.prepare(typer, method)
155
+ end
156
+ resolved!
157
+ else
158
+ typer.defer(proxy)
159
+ end
101
160
  end
102
-
161
+
103
162
  @inferred_type
104
163
  end
105
164
  end
106
165
 
107
166
  class Super < Node
108
167
  include Named
109
- attr_accessor :parameters, :method, :cast
168
+ attr_accessor :method, :cast
110
169
  alias :cast? :cast
111
170
 
171
+ child :parameters
172
+
112
173
  def initialize(parent, line_number)
113
174
  super(parent, line_number)
114
- @parameters = children[0]
115
175
  @call_parent = parent
116
176
  @call_parent = (@call_parent = @call_parent.parent) until MethodDefinition === @call_parent
117
177
  @cast = false
@@ -123,9 +183,9 @@ module Duby::AST
123
183
 
124
184
  def infer(typer)
125
185
  @self_type ||= typer.self_type.superclass
126
-
186
+
127
187
  unless @inferred_type
128
- receiver_type = @call_parent.defining_class
188
+ receiver_type = @call_parent.defining_class.superclass
129
189
  should_defer = receiver_type.nil?
130
190
  parameter_types = parameters.map do |param|
131
191
  typer.infer(param) || should_defer = true