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/nbcompiler.rb
CHANGED
@@ -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
|
data/lib/duby/plugin/edb.rb
CHANGED
@@ -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,
|
12
|
+
ast = Duby::AST.parse_ruby(src, path)
|
13
13
|
transformer.transform(ast.body_node, parent)
|
14
14
|
end
|
15
15
|
|
data/lib/duby/plugin/java.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/duby/transform.rb
CHANGED
@@ -11,14 +11,31 @@ module Duby
|
|
11
11
|
@cause = cause
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
class Transformer
|
16
|
-
|
17
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
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] =
|
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'] =
|
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
|
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
|
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
|
-
|
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
|
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
|
1052
|
+
LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
|
965
1053
|
else
|
966
|
-
LocalAssignment.new(parent, position, name
|
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)
|