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
@@ -88,5 +88,8 @@ module Duby::JVM::Types
88
88
  unary_operator('+@', nil)
89
89
  end
90
90
 
91
+ def box(builder)
92
+ builder.invokestatic box_type, "valueOf", [box_type, math_type]
93
+ end
91
94
  end
92
95
  end
@@ -21,7 +21,7 @@ module Duby
21
21
  def parse(text)
22
22
  Duby::AST.type_factory = Duby::JVM::Types::TypeFactory.new
23
23
  ast = Duby::AST.parse_ruby(text)
24
- transformer = Duby::Transform::Transformer.new
24
+ transformer = Duby::Transform::Transformer.new(Duby::CompilationState.new)
25
25
  return ParseResult.new(
26
26
  transformer.transform(ast, nil), transformer.errors)
27
27
  end
@@ -9,7 +9,7 @@ Duby::AST.defmacro('def_edb') do |transformer, fcall, parent|
9
9
  compiler.pre_cmd = ["def #{name}", "_edbout = StringBuilder.new"]
10
10
  compiler.post_cmd = ["_edbout.toString", "end"]
11
11
  src = compiler.compile(IO.read(path))
12
- ast = Duby::AST.parse_ruby(src, "(edb)")
12
+ ast = Duby::AST.parse_ruby(src, path)
13
13
  transformer.transform(ast.body_node, parent)
14
14
  end
15
15
 
@@ -24,7 +24,16 @@ module Duby
24
24
  raise NoMethodError, "Method %s(%s) on %s not found" %
25
25
  [name, parameter_types.join(', '), target_type]
26
26
  end
27
- result = method.return_type if method
27
+ if method
28
+ result = method.return_type
29
+ elsif typer.last_chance && target_type.meta? &&
30
+ name == 'new' && parameter_types == []
31
+ unmeta = target_type.unmeta
32
+ if unmeta.respond_to?(:default_constructor)
33
+ result = unmeta.default_constructor
34
+ typer.last_chance = false if result
35
+ end
36
+ end
28
37
  end
29
38
 
30
39
  if result
@@ -11,14 +11,31 @@ module Duby
11
11
  @cause = cause
12
12
  end
13
13
  end
14
-
14
+
15
15
  class Transformer
16
- attr_reader :errors
17
- def initialize
16
+ begin
17
+ include Java::DubyLangCompiler.Compiler
18
+ rescue NameError
19
+ $CLASSPATH << File.dirname(__FILE__) + '/../../javalib/duby-bootstrap.jar'
20
+ include Java::DubyLangCompiler.Compiler
21
+ end
22
+
23
+ attr_reader :errors, :state
24
+ def initialize(state)
18
25
  @errors = []
19
26
  @tmp_count = 0
20
27
  @annotations = []
21
28
  @scopes = []
29
+ @extra_body = nil
30
+ @state = state
31
+ end
32
+
33
+ def destination
34
+ @state.destination
35
+ end
36
+
37
+ def verbose?
38
+ @state.verbose
22
39
  end
23
40
 
24
41
  def annotations
@@ -30,19 +47,34 @@ module Duby
30
47
  @annotations << annotation
31
48
  Duby::AST::Noop.new(annotation.parent, annotation.position)
32
49
  end
33
-
34
- def tmp
35
- "__xform_tmp_#{@tmp_count += 1}"
50
+
51
+ def tmp(format="__xform_tmp_%d")
52
+ format % [@tmp_count += 1]
36
53
  end
37
-
54
+
38
55
  def transform(node, parent)
39
56
  begin
40
57
  scope = node.getScope if node.respond_to? :getScope
41
58
  if scope
42
59
  @scopes << scope
43
60
  end
61
+ top = @extra_body.nil?
62
+ if top
63
+ @extra_body = Duby::AST::Body.new(nil, node.position)
64
+ end
44
65
  begin
45
- node.transform(self, parent)
66
+ result = node.transform(self, parent)
67
+ if top
68
+ body = result.body
69
+ if body.kind_of?(Duby::AST::Body) && @extra_body.empty?
70
+ @extra_body = body
71
+ else
72
+ result.body = @extra_body
73
+ body.parent = @extra_body
74
+ @extra_body.children.insert(0, body)
75
+ end
76
+ end
77
+ return result
46
78
  ensure
47
79
  if scope
48
80
  @scopes.pop
@@ -51,13 +83,13 @@ module Duby
51
83
  rescue Error => ex
52
84
  @errors << ex
53
85
  Duby::AST::ErrorNode.new(parent, ex)
54
- rescue Exception => ex
86
+ rescue Exception => ex
55
87
  error = Error.new(ex.message, node.position, ex)
56
88
  @errors << error
57
89
  Duby::AST::ErrorNode.new(parent, error)
58
90
  end
59
91
  end
60
-
92
+
61
93
  def captured?(node)
62
94
  depth = node.depth
63
95
  scope = @scopes[-1]
@@ -82,14 +114,28 @@ module Duby
82
114
  duby_node.parent = parent
83
115
  duby_node
84
116
  end
85
-
117
+
86
118
  def expand(fvcall, parent)
87
119
  result = yield self, fvcall, parent
88
- unless result.kind_of?(AST::Node)
120
+ unless AST::Node === result
89
121
  raise Error.new('Invalid macro result', fvcall.position)
90
122
  end
91
123
  result
92
124
  end
125
+
126
+ def append_node(node)
127
+ @extra_body << node
128
+ node
129
+ end
130
+
131
+ def define_class(position, name, &block)
132
+ append_node Duby::AST::ClassDefinition.new(nil, position, name, &block)
133
+ end
134
+
135
+ def define_closure(position, name, enclosing_type)
136
+ append_node(Duby::AST::ClosureDefinition.new(
137
+ nil, position, name, enclosing_type))
138
+ end
93
139
  end
94
140
  end
95
141
  TransformError = Transform::Error
@@ -104,10 +150,10 @@ module Duby
104
150
  java_import org.jrubyparser.parser.ParserConfiguration
105
151
  java_import org.jrubyparser.CompatVersion
106
152
  java_import java.io.StringReader
107
-
153
+
108
154
  def parse(src, filename='-', raise_errors=false, transformer=nil)
109
155
  ast = parse_ruby(src, filename)
110
- transformer ||= Transform::Transformer.new
156
+ transformer ||= Transform::Transformer.new(Duby::CompilationState.new)
111
157
  ast = transformer.transform(ast, nil)
112
158
  if raise_errors
113
159
  transformer.errors.each do |e|
@@ -117,7 +163,7 @@ module Duby
117
163
  ast
118
164
  end
119
165
  module_function :parse
120
-
166
+
121
167
  def parse_ruby(src, filename='-')
122
168
  raise ArgumentError if src.nil?
123
169
  parser = Parser.new
@@ -127,7 +173,7 @@ module Duby
127
173
  rescue => ex
128
174
  if ex.cause.respond_to? :position
129
175
  position = ex.cause.position
130
- puts "#{position.file}:#{position.start_line + 1}: #{ex.message}"
176
+ Duby.print_error(ex.cause.message, position)
131
177
  end
132
178
  raise ex
133
179
  end
@@ -141,7 +187,7 @@ module Duby
141
187
  set_args = JRubyAst::ListNode.new(position)
142
188
  set_args.add_all(args)
143
189
  set_args.add(value_node)
144
-
190
+
145
191
  first = JRubyAst::CallNode.new(position, receiver_node, name, args)
146
192
  second = JRubyAst::AttrAssignNode.new(position, receiver_node,
147
193
  "#{name}=", set_args)
@@ -157,7 +203,7 @@ module Duby
157
203
  end
158
204
  end
159
205
 
160
- # reload
206
+ # reload
161
207
  module JRubyAst
162
208
  class Node
163
209
  def transform(transformer, parent)
@@ -189,7 +235,7 @@ module Duby
189
235
 
190
236
  [:receiver_node, :args_node, :var_node, :head_node, :value_node, :iter_node, :body_node, :next_node, :condition, :then_body, :else_body].each do |mm|
191
237
  if self.respond_to?(mm)
192
- begin
238
+ begin
193
239
  s << "\n#{self.send(mm).inspect(indent+2)}" if self.send(mm)
194
240
  rescue
195
241
  s << "\n#{' '*(indent+2)}#{self.send(mm).inspect}" if self.send(mm)
@@ -208,7 +254,7 @@ module Duby
208
254
  end
209
255
  s
210
256
  end
211
-
257
+
212
258
  def signature(parent)
213
259
  nil
214
260
  end
@@ -216,7 +262,7 @@ module Duby
216
262
 
217
263
  class ListNode
218
264
  include Enumerable
219
-
265
+
220
266
  def each(&block)
221
267
  child_nodes.each(&block)
222
268
  end
@@ -232,7 +278,7 @@ module Duby
232
278
  pre
233
279
  end
234
280
  end
235
-
281
+
236
282
  def transform(transformer, parent)
237
283
  Arguments.new(parent, position) do |args_node|
238
284
  arg_list = args.child_nodes.map do |node|
@@ -311,7 +357,7 @@ module Duby
311
357
  Break.new(parent, position)
312
358
  end
313
359
  end
314
-
360
+
315
361
  class ClassNode
316
362
  def transform(transformer, parent)
317
363
  ClassDefinition.new(parent, position,
@@ -325,11 +371,30 @@ module Duby
325
371
  end
326
372
  end
327
373
 
374
+ class DStrNode
375
+ def transform(transformer, parent)
376
+ StringConcat.new(parent, position) do |p|
377
+ child_nodes.map{|n| n.transform(transformer, p)}
378
+ end
379
+ end
380
+ end
381
+
382
+ class EvStrNode
383
+ def transform(transformer, parent)
384
+ ToString.new(parent, position) do |p|
385
+ [body.transform(transformer, p)]
386
+ end
387
+ end
388
+ end
389
+
328
390
  class GlobalVarNode
329
391
  def transform(transformer, parent)
392
+ transformer.add_annotation(annotation(transformer, parent))
393
+ end
394
+
395
+ def annotation(transformer, parent)
330
396
  classname = name[1..-1]
331
397
  annotation = Annotation.new(parent, position, AST.type(classname))
332
- transformer.add_annotation(annotation)
333
398
  end
334
399
  end
335
400
 
@@ -362,7 +427,7 @@ module Duby
362
427
  actual_name = name[0..-2] + '_set'
363
428
  end
364
429
  end
365
-
430
+
366
431
  Call.new(parent, position, actual_name) do |call|
367
432
  [
368
433
  transformer.transform(receiver_node, call),
@@ -416,15 +481,15 @@ module Duby
416
481
  case value
417
482
  when HashNode
418
483
  values = value.list_node
419
- (0..(values.size / 2)).each do |i|
484
+ (0...(values.size / 2)).each do |i|
420
485
  name = values.get(2 * i).name
421
486
  value = values.get(2 * i + 1)
422
- annotation[name] = transformer.transform(value, annotation)
487
+ annotation[name] = annotation_value(value, annotation)
423
488
  end
424
489
  when nil
425
490
  # ignore an empty argument list
426
491
  else
427
- annotation['value'] = transformer.transform(value, annotation)
492
+ annotation['value'] = annotation_value(value, annotation)
428
493
  end
429
494
  annotation
430
495
  else
@@ -442,6 +507,20 @@ module Duby
442
507
  receiver = receiver.receiver_node while CallNode === receiver
443
508
  GlobalVarNode === receiver
444
509
  end
510
+
511
+ def annotation_value(value, annotation)
512
+ case value
513
+ when StrNode
514
+ java.lang.String.new(value.value)
515
+ when ArrayNode
516
+ value.child_nodes.map {|node| annotation_value(node, annotation)}
517
+ else
518
+ # TODO Support other types
519
+ ref = value.type_reference(annotation)
520
+ desc = BiteScript::Signature.class_id(ref)
521
+ BiteScript::ASM::Type.getType(desc)
522
+ end
523
+ end
445
524
  end
446
525
 
447
526
  class Colon2Node
@@ -532,7 +611,7 @@ module Duby
532
611
  end
533
612
  end
534
613
  end
535
-
614
+
536
615
  class FalseNode
537
616
  def transform(transformer, parent)
538
617
  Boolean.new(parent, position, false)
@@ -555,7 +634,7 @@ module Duby
555
634
  nil
556
635
  end
557
636
  end
558
-
637
+
559
638
  def transform(transformer, parent)
560
639
  @declaration ||= false
561
640
 
@@ -575,7 +654,7 @@ module Duby
575
654
  end
576
655
  end
577
656
  end
578
-
657
+
579
658
  def type_reference(parent)
580
659
  AST::type(name)
581
660
  end
@@ -790,10 +869,9 @@ module Duby
790
869
 
791
870
  class LocalAsgnNode
792
871
  def transform(transformer, parent)
793
- captured = transformer.captured?(self)
794
872
  case value_node
795
873
  when SymbolNode, ConstNode
796
- LocalDeclaration.new(parent, position, name, captured) {|local_decl| [value_node.type_reference(local_decl)]}
874
+ LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
797
875
  when JRubyAst::GlobalVarNode
798
876
  real_parent = parent
799
877
  real_parent = parent.parent if Body === real_parent
@@ -804,14 +882,19 @@ module Duby
804
882
  raise "Illegal global variable"
805
883
  end
806
884
  else
807
- LocalAssignment.new(parent, position, name, captured) {|local| [transformer.transform(value_node, local)]}
885
+ LocalAssignment.new(parent, position, name) {|local| [transformer.transform(value_node, local)]}
808
886
  end
809
887
  end
810
888
  end
811
889
 
812
890
  class LocalVarNode
813
891
  def transform(transformer, parent)
814
- Local.new(parent, position, name, transformer.captured?(self))
892
+ FunctionalCall.new(parent, position, name) do |call|
893
+ [
894
+ [],
895
+ nil
896
+ ]
897
+ end
815
898
  end
816
899
  end
817
900
 
@@ -850,6 +933,12 @@ module Duby
850
933
  end
851
934
  end
852
935
 
936
+ class RegexpNode
937
+ def transform(transformer, parent)
938
+ Regexp.new(parent, position, value.to_s)
939
+ end
940
+ end
941
+
853
942
  class ReturnNode
854
943
  def transform(transformer, parent)
855
944
  Return.new(parent, position) do |ret|
@@ -875,7 +964,7 @@ module Duby
875
964
  def transform(transformer, parent)
876
965
  String.new(parent, position, value)
877
966
  end
878
-
967
+
879
968
  def type_reference(parent)
880
969
  AST::type(value)
881
970
  end
@@ -886,13 +975,13 @@ module Duby
886
975
  AST::type(name)
887
976
  end
888
977
  end
889
-
978
+
890
979
  class TrueNode
891
980
  def transform(transformer, parent)
892
981
  Boolean.new(parent, position, true)
893
982
  end
894
983
  end
895
-
984
+
896
985
  class TypedArgumentNode
897
986
  def transform(transformer, parent)
898
987
  type_node.transform(transformer, parent)
@@ -921,7 +1010,7 @@ module Duby
921
1010
  end
922
1011
  end
923
1012
  end
924
-
1013
+
925
1014
  def type_reference(parent)
926
1015
  AST::type name
927
1016
  end
@@ -952,18 +1041,17 @@ module Duby
952
1041
  class DVarNode
953
1042
  def transform(transformer, parent)
954
1043
  # TODO does this need to be handled specially?
955
- Local.new(parent, position, name, transformer.captured?(self))
1044
+ Local.new(parent, position, name)
956
1045
  end
957
1046
  end
958
1047
 
959
1048
  class DAsgnNode
960
1049
  def transform(transformer, parent)
961
- captured = transformer.captured?(self)
962
1050
  case value_node
963
1051
  when SymbolNode, ConstNode
964
- LocalDeclaration.new(parent, position, name, captured) {|local_decl| [value_node.type_reference(local_decl)]}
1052
+ LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
965
1053
  else
966
- LocalAssignment.new(parent, position, name, captured) {|local| [transformer.transform(value_node, local)]}
1054
+ LocalAssignment.new(parent, position, name) {|local| [transformer.transform(value_node, local)]}
967
1055
  end
968
1056
  end
969
1057
  end
@@ -1003,7 +1091,7 @@ module Duby
1003
1091
  end
1004
1092
  end
1005
1093
  end
1006
-
1094
+
1007
1095
  class SuperNode
1008
1096
  def transform(transformer, parent)
1009
1097
  Super.new(parent, position) do
@@ -1011,13 +1099,13 @@ module Duby
1011
1099
  end
1012
1100
  end
1013
1101
  end
1014
-
1102
+
1015
1103
  class ZSuperNode
1016
1104
  def transform(transformer, parent)
1017
1105
  Super.new(parent, position)
1018
1106
  end
1019
1107
  end
1020
-
1108
+
1021
1109
  class SelfNode
1022
1110
  def transform(transformer, parent)
1023
1111
  Self.new(parent, position)