mirah 0.0.4-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/History.txt +15 -0
  2. data/README.txt +51 -0
  3. data/Rakefile +86 -0
  4. data/bin/duby +10 -0
  5. data/bin/dubyc +10 -0
  6. data/bin/dubyp +10 -0
  7. data/bin/jrubyp +36 -0
  8. data/bin/mirah +9 -0
  9. data/bin/mirah.cmd +1 -0
  10. data/bin/mirahc +9 -0
  11. data/bin/mirahc.cmd +1 -0
  12. data/bin/mirahp +9 -0
  13. data/bin/mirahp.cmd +1 -0
  14. data/examples/ant/example-build.xml +7 -0
  15. data/examples/appengine/Rakefile +19 -0
  16. data/examples/appengine/Readme +29 -0
  17. data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
  18. data/examples/appengine/src/org/mirah/list.dhtml +15 -0
  19. data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
  20. data/examples/bintrees.mirah +66 -0
  21. data/examples/construction.mirah +8 -0
  22. data/examples/dynamic.mirah +17 -0
  23. data/examples/edb.mirah +3 -0
  24. data/examples/fib.mirah +16 -0
  25. data/examples/fields.mirah +22 -0
  26. data/examples/fractal.mirah +55 -0
  27. data/examples/java_thing.mirah +13 -0
  28. data/examples/plugins/appengine/Rakefile +55 -0
  29. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
  30. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
  31. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
  32. data/examples/simple_class.mirah +12 -0
  33. data/examples/sort_closure.mirah +7 -0
  34. data/examples/swing.mirah +20 -0
  35. data/examples/tak.mirah +15 -0
  36. data/examples/test.edb +9 -0
  37. data/examples/wiki/Rakefile +18 -0
  38. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
  39. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
  40. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
  41. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
  42. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
  43. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
  44. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  45. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  46. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  47. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  48. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  49. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  50. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  51. data/examples/wiki/war/app.yaml +21 -0
  52. data/examples/wiki/war/public/favicon.ico +0 -0
  53. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  54. data/examples/wiki/war/public/images/back.gif +0 -0
  55. data/examples/wiki/war/public/images/dir.gif +0 -0
  56. data/examples/wiki/war/public/images/file.gif +0 -0
  57. data/examples/wiki/war/public/javascripts/prettify.js +61 -0
  58. data/examples/wiki/war/public/robots.txt +0 -0
  59. data/examples/wiki/war/public/stylesheets/main.css +156 -0
  60. data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
  61. data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
  62. data/examples/wiki/war/public/stylesheets/source.css +21 -0
  63. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  64. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  65. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  66. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  67. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  68. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  69. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  70. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  71. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  72. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  73. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  74. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  75. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  76. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  77. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  78. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  79. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  80. data/examples/wiki/war/public/wmd/showdown.js +421 -0
  81. data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
  82. data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
  83. data/examples/wiki/war/public/wmd/wmd.js +73 -0
  84. data/javalib/JRubyParser.jar +0 -0
  85. data/javalib/dynalang-invoke-0.1.jar +0 -0
  86. data/javalib/mirah-bootstrap.jar +0 -0
  87. data/javalib/mirah-parser.jar +0 -0
  88. data/lib/duby.rb +2 -0
  89. data/lib/mirah.rb +338 -0
  90. data/lib/mirah/appengine_tasks.rb +146 -0
  91. data/lib/mirah/ast.rb +615 -0
  92. data/lib/mirah/ast/call.rb +307 -0
  93. data/lib/mirah/ast/class.rb +311 -0
  94. data/lib/mirah/ast/flow.rb +364 -0
  95. data/lib/mirah/ast/intrinsics.rb +470 -0
  96. data/lib/mirah/ast/literal.rb +154 -0
  97. data/lib/mirah/ast/local.rb +89 -0
  98. data/lib/mirah/ast/method.rb +360 -0
  99. data/lib/mirah/ast/scope.rb +208 -0
  100. data/lib/mirah/ast/structure.rb +226 -0
  101. data/lib/mirah/ast/type.rb +130 -0
  102. data/lib/mirah/compiler.rb +341 -0
  103. data/lib/mirah/env.rb +33 -0
  104. data/lib/mirah/jvm/base.rb +258 -0
  105. data/lib/mirah/jvm/compiler.rb +885 -0
  106. data/lib/mirah/jvm/method_lookup.rb +203 -0
  107. data/lib/mirah/jvm/source_compiler.rb +737 -0
  108. data/lib/mirah/jvm/source_generator/builder.rb +444 -0
  109. data/lib/mirah/jvm/source_generator/loops.rb +110 -0
  110. data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
  111. data/lib/mirah/jvm/source_generator/typer.rb +11 -0
  112. data/lib/mirah/jvm/typer.rb +151 -0
  113. data/lib/mirah/jvm/types.rb +416 -0
  114. data/lib/mirah/jvm/types/basic_types.rb +33 -0
  115. data/lib/mirah/jvm/types/boolean.rb +17 -0
  116. data/lib/mirah/jvm/types/enumerable.rb +65 -0
  117. data/lib/mirah/jvm/types/extensions.rb +86 -0
  118. data/lib/mirah/jvm/types/factory.rb +186 -0
  119. data/lib/mirah/jvm/types/floats.rb +86 -0
  120. data/lib/mirah/jvm/types/integers.rb +171 -0
  121. data/lib/mirah/jvm/types/intrinsics.rb +376 -0
  122. data/lib/mirah/jvm/types/literals.rb +74 -0
  123. data/lib/mirah/jvm/types/methods.rb +614 -0
  124. data/lib/mirah/jvm/types/number.rb +143 -0
  125. data/lib/mirah/nbcompiler.rb +29 -0
  126. data/lib/mirah/plugin/edb.rb +29 -0
  127. data/lib/mirah/plugin/gwt.rb +173 -0
  128. data/lib/mirah/plugin/java.rb +55 -0
  129. data/lib/mirah/transform.rb +266 -0
  130. data/lib/mirah/transform2.rb +728 -0
  131. data/lib/mirah/typer.rb +407 -0
  132. data/lib/mirah_task.rb +107 -0
  133. data/test/test_ast.rb +359 -0
  134. data/test/test_compilation.rb +112 -0
  135. data/test/test_env.rb +42 -0
  136. data/test/test_gwt.rb +58 -0
  137. data/test/test_java_typer.rb +183 -0
  138. data/test/test_javac_compiler.rb +63 -0
  139. data/test/test_jvm_compiler.rb +2607 -0
  140. data/test/test_typer.rb +221 -0
  141. metadata +235 -0
@@ -0,0 +1,15 @@
1
+ === 0.0.3 / 2010-06-09
2
+
3
+ * Even more language features!
4
+ * invokedynamic support (sort of)
5
+ * Using mirror types to avoid class initialization
6
+ * Other stuff
7
+
8
+ === 0.0.2 / 2010-02-15
9
+
10
+ * More language features added
11
+
12
+ === 0.0.1 / 2009-10-27
13
+
14
+ * First gem release
15
+ * Most things necessary for simple apps, scripts, servlets are working
@@ -0,0 +1,51 @@
1
+ = mirah
2
+
3
+ * http://groups.google.com/group/mirah
4
+ * http://kenai.com/projects/duby
5
+
6
+ == DESCRIPTION:
7
+
8
+ Mirah is a customizable programming language featuring static types,
9
+ local type inference and a heavily Ruby-inspired syntax. Mirah
10
+ currently includes a typer/compiler backend for the JVM which can
11
+ output either JVM bytecode or Java source files.
12
+
13
+ == FEATURES/PROBLEMS:
14
+
15
+ * Ruby syntax
16
+ * Compiles to .class or .java
17
+ * Fast as Java
18
+
19
+ == SYNOPSIS:
20
+
21
+ mirah <script.mirah>
22
+ mirah -e "inline script"
23
+ mirahc <script.mirah>
24
+ mirahc -e "inline script" # produces DashE.class
25
+ mirahc -java <script.mirah>
26
+ mirahc -java -e "inline script" # produces DashE.java
27
+
28
+ == REQUIREMENTS:
29
+
30
+ * JRuby 1.5.0 or higher.
31
+ * BiteScript 0.0.5 or higher
32
+
33
+ == INSTALL:
34
+
35
+ If your "gem" command is the one from JRuby:
36
+
37
+ * gem install mirah
38
+
39
+ Otherwise:
40
+
41
+ * jruby -S gem install mirah
42
+
43
+ Only JRuby is supported at this time.
44
+
45
+ == For Java tools:
46
+
47
+ To build the Mirah jars from source you should have a checkout of both jruby and
48
+ bitescript in Mirah's parent directory. Run "ant jar-complete" in jruby, then in
49
+ the mirah directory "../jruby/bin/jruby -S rake jar" to build the Mirah jar. Use
50
+ "jar:complete" instead to produce a free-standing jar file with JRuby and the
51
+ JRubyParser libraries included.
@@ -0,0 +1,86 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'java'
4
+ $: << './lib'
5
+ require 'mirah'
6
+ require 'jruby/compiler'
7
+ require 'ant'
8
+
9
+ task :default => :test
10
+
11
+ Rake::TestTask.new :test do |t|
12
+ t.libs << "lib"
13
+ # This is hacky, I know
14
+ t.libs.concat Dir["../bitescript*/lib"]
15
+ t.test_files = FileList["test/**/*.rb"]
16
+ java.lang.System.set_property("jruby.duby.enabled", "true")
17
+ end
18
+
19
+ task :init do
20
+ mkdir_p 'dist'
21
+ mkdir_p 'build'
22
+ end
23
+
24
+ task :clean do
25
+ ant.delete :quiet => true, :dir => 'build'
26
+ ant.delete :quiet => true, :dir => 'dist'
27
+ end
28
+
29
+ task :compile => :init do
30
+ # build the Ruby sources
31
+ puts "Compiling Ruby sources"
32
+ JRuby::Compiler.compile_argv([
33
+ '-t', 'build',
34
+ '--javac',
35
+ 'src/org/mirah/mirah_command.rb'
36
+ ])
37
+
38
+ # build the Mirah sources
39
+ puts "Compiling Mirah sources"
40
+ Dir.chdir 'src' do
41
+ classpath = Duby::Env.encode_paths([
42
+ 'javalib/jruby-complete.jar',
43
+ 'javalib/JRubyParser.jar',
44
+ 'build',
45
+ '/usr/share/ant/lib/ant.jar'
46
+ ])
47
+ Duby.compile(
48
+ '-c', classpath,
49
+ '-d', '../build',
50
+ 'org/mirah',
51
+ 'duby/lang',
52
+ 'mirah'
53
+ )
54
+ end
55
+ end
56
+
57
+ task :jar => :compile do
58
+ ant.jar :jarfile => 'dist/mirah.jar' do
59
+ fileset :dir => 'lib'
60
+ fileset :dir => 'build'
61
+ fileset :dir => '.', :includes => 'bin/*'
62
+ fileset :dir => '../bitescript/lib'
63
+ manifest do
64
+ attribute :name => 'Main-Class', :value => 'org.mirah.MirahCommand'
65
+ end
66
+ end
67
+ end
68
+
69
+ namespace :jar do
70
+ task :complete => :jar do
71
+ ant.jar :jarfile => 'dist/mirah-complete.jar' do
72
+ zipfileset :src => 'dist/mirah.jar'
73
+ zipfileset :src => 'javalib/jruby-complete.jar'
74
+ zipfileset :src => 'javalib/mirah-parser.jar'
75
+ manifest do
76
+ attribute :name => 'Main-Class', :value => 'org.mirah.MirahCommand'
77
+ end
78
+ end
79
+ end
80
+
81
+ task :bootstrap => :compile do
82
+ ant.jar :jarfile => 'javalib/mirah-bootstrap.jar' do
83
+ fileset :dir => 'build'
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ puts 'WARNING: Duby is now Mirah. Please use the `mirah` command.'
10
+ Duby.run(*ARGV)
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ puts 'WARNING: Duby is now Mirah. Please use the `mirahc` command.'
10
+ Duby.compile(*ARGV)
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ puts 'WARNING: Duby is now Mirah. Please use the `mirahp` command.'
10
+ puts Duby.parse(*ARGV).inspect
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env jruby
2
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
3
+ require 'mirah'
4
+
5
+ module Java::OrgJrubyparserAst
6
+ class Node
7
+ def pp(indent = 0)
8
+ return if self.invisible?
9
+ name = ""
10
+ name = ":#{self.name}" if respond_to? :getName
11
+ name += " #{value.inspect}" if respond_to? :getValue
12
+ name += " (#{depth})" if respond_to? :getDepth
13
+ print "#{' '*indent}(#{node_name}#{name}"
14
+ if child_nodes.size == 0
15
+ puts ')'
16
+ else
17
+ puts
18
+ indent += 2
19
+ child_nodes.each {|n| n.pp(indent)}
20
+ puts "#{' '*indent})"
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ filename = ARGV.shift
27
+ case filename
28
+ when '-e'
29
+ contents = ARGV.join(' ')
30
+ when '-', nil
31
+ contents = $stdin.read
32
+ else
33
+ contents = IO.read(filename)
34
+ end
35
+
36
+ puts Duby::AST.parse_ruby(contents, filename).pp
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ Duby.run(*ARGV)
@@ -0,0 +1 @@
1
+ @jruby "%~dpn0" %*
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ Duby.compile(*ARGV)
@@ -0,0 +1 @@
1
+ @jruby "%~dpn0" %*
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env jruby
2
+ begin
3
+ require 'mirah'
4
+ rescue LoadError
5
+ $: << File.dirname(File.dirname(__FILE__)) + '/lib'
6
+ require 'mirah'
7
+ end
8
+
9
+ puts Duby.parse(*ARGV).inspect
@@ -0,0 +1 @@
1
+ @jruby "%~dpn0" %*
@@ -0,0 +1,7 @@
1
+ <project name="test">
2
+ <taskdef name="dubyc" classname="org.mirah.ant.Compile"/>
3
+
4
+ <target name="blah">
5
+ <dubyc src="examples/fib.duby" target="build"/>
6
+ </target>
7
+ </project>
@@ -0,0 +1,19 @@
1
+ # Hack to use the latest version instead of the gems when developing Mirah
2
+ if File.exist?('../../lib/mirah.rb')
3
+ $: << File.expand_path('../../lib')
4
+ end
5
+ if File.exist?('../../../bitescript/lib/bitescript.rb')
6
+ $: << File.expand_path('../../../bitescript/lib/')
7
+ end
8
+ require 'mirah/appengine_tasks'
9
+
10
+ appengine_app :app
11
+
12
+ MIRAH_APP = "#{Duby.dest_path}/org/mirah/MirahApp.class"
13
+ LIST = "#{Duby.source_path}/org/mirah/list.dhtml"
14
+
15
+ # We want to recompile the app if the template gets modified
16
+ Rake::Task[MIRAH_APP].enhance([LIST])
17
+
18
+ task :app => MIRAH_APP
19
+ task :default => :server
@@ -0,0 +1,29 @@
1
+ Run rake to compile the application and start the development server:
2
+
3
+ $ jruby -I `pwd`/../../lib -S rake
4
+
5
+ Requirements:
6
+ - jruby -S gem install bitescript
7
+ - jruby -S gem install appengine-sdk -v=1.3.5.pre
8
+
9
+ Datastore API:
10
+ Model.get(key)
11
+ Model.delete(key)
12
+ Model.all -> Query
13
+ property foo, String # or any supported datastore type
14
+ # For numbers use Long or Double
15
+
16
+ instance.save
17
+ instance.key
18
+
19
+ instance.foo
20
+ instance.foo=
21
+
22
+ Query.count
23
+ Query.run -> Model[]
24
+ Query.first -> instance || nil
25
+ Query.sort(property_name)
26
+ Query.sort(property_name, true) # descending
27
+ Query.foo('foo').bar(3) # Only return instances where foo = 'foo' and bar = 3
28
+ Query.offset(10)
29
+ Query.limit(5)
@@ -0,0 +1,57 @@
1
+ import java.util.HashMap
2
+ import java.util.regex.Pattern
3
+
4
+ import javax.servlet.http.HttpServlet
5
+
6
+ import com.google.appengine.api.datastore.Text
7
+ import com.google.appengine.ext.duby.db.Model
8
+
9
+ class Post < Model
10
+ property 'title', String
11
+ property 'body', Text
12
+ end
13
+
14
+ class MirahApp < HttpServlet
15
+ def_edb(list, 'org/mirah/list.dhtml')
16
+
17
+ def doGet(request, response)
18
+ @posts = Post.all.run
19
+ response.getWriter.write(list)
20
+ end
21
+
22
+ def doPost(request, response)
23
+ post = Post.new
24
+ post.title = request.getParameter('title')
25
+ post.body = request.getParameter('body')
26
+ post.save
27
+ doGet(request, response)
28
+ end
29
+
30
+
31
+ def initialize
32
+ @escape_pattern = Pattern.compile("[<>&'\"]")
33
+ @escaped = HashMap.new
34
+ @escaped.put("<", "&lt;")
35
+ @escaped.put(">", "&gt;")
36
+ @escaped.put("&", "&amp;")
37
+ @escaped.put("\"", "&quot;")
38
+ @escaped.put("'", "&#39;")
39
+ end
40
+
41
+ def h(text:String)
42
+ return "" unless text
43
+ matcher = @escape_pattern.matcher(text)
44
+ buffer = StringBuffer.new
45
+ while matcher.find
46
+ replacement = String(@escaped.get(matcher.group))
47
+ matcher.appendReplacement(buffer, replacement)
48
+ end
49
+ matcher.appendTail(buffer)
50
+ return buffer.toString
51
+ end
52
+
53
+ def h(o:Object)
54
+ return "" unless o
55
+ h(o.toString)
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ <title>Posts</title>
2
+ <body>
3
+ <h1>All the Posts:</h1>
4
+ <% for post in @posts %>
5
+ <h2><%=h post.title %></h2>
6
+ <p><%=h post.body %></p>
7
+ <% end %>
8
+ <hr>
9
+ <h1>New Post:</h1>
10
+ <form method=post>
11
+ Title: <input type=text name=title><br>
12
+ Content: <textarea name=content></textarea><br>
13
+ <input type=submit>
14
+ </form>
15
+ </body>
@@ -0,0 +1,66 @@
1
+ class BinaryTrees
2
+ def self.main(args:String[])
3
+ n = 0
4
+ n = Integer.parseInt(args[0]) if args.length > 0
5
+
6
+ maxDepth = (6 > n) ? 6 : n
7
+ stretchDepth = maxDepth + 1
8
+
9
+ check = TreeNode.bottomUpTree(0, stretchDepth).itemCheck
10
+ puts "stretch tree of depth #{stretchDepth}\t check: #{check}"
11
+
12
+ longLivedTree = TreeNode.bottomUpTree 0, maxDepth
13
+
14
+ depth = 4
15
+ while depth <= maxDepth
16
+ iterations = 1 << (maxDepth - depth + 4)
17
+ check = 0
18
+
19
+ i = 1
20
+ while i <= iterations
21
+ check += TreeNode.bottomUpTree(i, depth).itemCheck
22
+ check += TreeNode.bottomUpTree(-i,depth).itemCheck
23
+ i += 1
24
+ end
25
+
26
+ puts "#{iterations * 2}\t trees of depth #{depth}\t check: #{check}"
27
+ depth += 2
28
+ end
29
+
30
+ puts "long lived tree of depth #{maxDepth}\t check: #{longLivedTree.itemCheck}"
31
+ end
32
+ end
33
+
34
+ class TreeNode
35
+ def initialize(left:TreeNode, right:TreeNode, item:int)
36
+ @item = item
37
+ @left = left
38
+ @right = right
39
+ end
40
+
41
+ def initialize(item:int)
42
+ @left = TreeNode(nil)
43
+ @right = TreeNode(nil)
44
+ @item = item
45
+ end
46
+
47
+ def self.bottomUpTree(item:int, depth:int)
48
+ if depth > 0
49
+ TreeNode.new(
50
+ TreeNode.bottomUpTree(2*item-1, depth-1),
51
+ TreeNode.bottomUpTree(2*item, depth-1),
52
+ item)
53
+ else
54
+ TreeNode.new(item)
55
+ end
56
+ end
57
+
58
+ def itemCheck
59
+ # if necessary deallocate here
60
+ if @left == nil
61
+ @item
62
+ else
63
+ @item + @left.itemCheck - @right.itemCheck
64
+ end
65
+ end
66
+ end