rsense-core 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +1 -0
  5. data/README.md +35 -0
  6. data/Rakefile +84 -0
  7. data/TypeAnnotation.tokens +41 -0
  8. data/build.xml +84 -0
  9. data/build_lib/antlr-3.2.jar +0 -0
  10. data/lib/jars/ant-1.7.0.jar +0 -0
  11. data/lib/jars/ant-launcher-1.7.0.jar +0 -0
  12. data/lib/jars/antlr-runtime-3.2.jar +0 -0
  13. data/lib/jars/bsf-2.3.0.jar +0 -0
  14. data/lib/rsense-core.rb +28 -0
  15. data/lib/rsense.jar +0 -0
  16. data/lib/rsense/core.rb +5 -0
  17. data/lib/rsense/core/version.rb +5 -0
  18. data/lib/rsense/parser.rb +6 -0
  19. data/lib/rsense/ruby.rb +19 -0
  20. data/lib/rsense/typing.rb +13 -0
  21. data/lib/rsense/typing/annotation.rb +20 -0
  22. data/lib/rsense/typing/runtime.rb +23 -0
  23. data/lib/rsense/typing/vertex.rb +15 -0
  24. data/lib/rsense/util.rb +9 -0
  25. data/rsense-core.gemspec +30 -0
  26. data/src/org/cx4a/rsense/CodeAssist.java +744 -0
  27. data/src/org/cx4a/rsense/CodeAssistError.java +31 -0
  28. data/src/org/cx4a/rsense/CodeAssistResult.java +42 -0
  29. data/src/org/cx4a/rsense/CodeCompletionResult.java +65 -0
  30. data/src/org/cx4a/rsense/FindDefinitionResult.java +24 -0
  31. data/src/org/cx4a/rsense/LoadResult.java +19 -0
  32. data/src/org/cx4a/rsense/Main.java +916 -0
  33. data/src/org/cx4a/rsense/Options.java +353 -0
  34. data/src/org/cx4a/rsense/Project.java +103 -0
  35. data/src/org/cx4a/rsense/TypeInferenceResult.java +25 -0
  36. data/src/org/cx4a/rsense/WhereResult.java +19 -0
  37. data/src/org/cx4a/rsense/parser/TypeAnnotation.g +221 -0
  38. data/src/org/cx4a/rsense/parser/TypeAnnotationLexer.java +1759 -0
  39. data/src/org/cx4a/rsense/parser/TypeAnnotationParser.java +2025 -0
  40. data/src/org/cx4a/rsense/ruby/Block.java +10 -0
  41. data/src/org/cx4a/rsense/ruby/Context.java +75 -0
  42. data/src/org/cx4a/rsense/ruby/DynamicMethod.java +10 -0
  43. data/src/org/cx4a/rsense/ruby/DynamicScope.java +51 -0
  44. data/src/org/cx4a/rsense/ruby/Frame.java +95 -0
  45. data/src/org/cx4a/rsense/ruby/IRubyObject.java +17 -0
  46. data/src/org/cx4a/rsense/ruby/LocalScope.java +43 -0
  47. data/src/org/cx4a/rsense/ruby/MetaClass.java +50 -0
  48. data/src/org/cx4a/rsense/ruby/Ruby.java +242 -0
  49. data/src/org/cx4a/rsense/ruby/RubyClass.java +146 -0
  50. data/src/org/cx4a/rsense/ruby/RubyModule.java +255 -0
  51. data/src/org/cx4a/rsense/ruby/RubyObject.java +94 -0
  52. data/src/org/cx4a/rsense/ruby/Scope.java +7 -0
  53. data/src/org/cx4a/rsense/ruby/SpecialObject.java +15 -0
  54. data/src/org/cx4a/rsense/ruby/Visibility.java +17 -0
  55. data/src/org/cx4a/rsense/typing/Graph.java +1690 -0
  56. data/src/org/cx4a/rsense/typing/Propagation.java +73 -0
  57. data/src/org/cx4a/rsense/typing/Template.java +84 -0
  58. data/src/org/cx4a/rsense/typing/TemplateAttribute.java +158 -0
  59. data/src/org/cx4a/rsense/typing/TypeSet.java +48 -0
  60. data/src/org/cx4a/rsense/typing/annotation/ClassType.java +57 -0
  61. data/src/org/cx4a/rsense/typing/annotation/MethodType.java +79 -0
  62. data/src/org/cx4a/rsense/typing/annotation/TypeAnnotation.java +4 -0
  63. data/src/org/cx4a/rsense/typing/annotation/TypeAny.java +7 -0
  64. data/src/org/cx4a/rsense/typing/annotation/TypeApplication.java +37 -0
  65. data/src/org/cx4a/rsense/typing/annotation/TypeConstraint.java +29 -0
  66. data/src/org/cx4a/rsense/typing/annotation/TypeExpression.java +11 -0
  67. data/src/org/cx4a/rsense/typing/annotation/TypeIdentity.java +59 -0
  68. data/src/org/cx4a/rsense/typing/annotation/TypeOptional.java +22 -0
  69. data/src/org/cx4a/rsense/typing/annotation/TypePragma.java +22 -0
  70. data/src/org/cx4a/rsense/typing/annotation/TypeSplat.java +22 -0
  71. data/src/org/cx4a/rsense/typing/annotation/TypeTuple.java +35 -0
  72. data/src/org/cx4a/rsense/typing/annotation/TypeUnion.java +23 -0
  73. data/src/org/cx4a/rsense/typing/annotation/TypeVariable.java +44 -0
  74. data/src/org/cx4a/rsense/typing/runtime/AliasMethod.java +94 -0
  75. data/src/org/cx4a/rsense/typing/runtime/AnnotationHelper.java +69 -0
  76. data/src/org/cx4a/rsense/typing/runtime/AnnotationResolver.java +523 -0
  77. data/src/org/cx4a/rsense/typing/runtime/Array.java +84 -0
  78. data/src/org/cx4a/rsense/typing/runtime/ClassTag.java +27 -0
  79. data/src/org/cx4a/rsense/typing/runtime/DefaultMethod.java +115 -0
  80. data/src/org/cx4a/rsense/typing/runtime/Hash.java +131 -0
  81. data/src/org/cx4a/rsense/typing/runtime/LoopTag.java +21 -0
  82. data/src/org/cx4a/rsense/typing/runtime/Method.java +32 -0
  83. data/src/org/cx4a/rsense/typing/runtime/MonomorphicObject.java +77 -0
  84. data/src/org/cx4a/rsense/typing/runtime/ObjectAllocator.java +40 -0
  85. data/src/org/cx4a/rsense/typing/runtime/PolymorphicObject.java +90 -0
  86. data/src/org/cx4a/rsense/typing/runtime/Proc.java +100 -0
  87. data/src/org/cx4a/rsense/typing/runtime/RuntimeHelper.java +1339 -0
  88. data/src/org/cx4a/rsense/typing/runtime/SpecialMethod.java +119 -0
  89. data/src/org/cx4a/rsense/typing/runtime/TypeVarMap.java +112 -0
  90. data/src/org/cx4a/rsense/typing/runtime/VertexHolder.java +48 -0
  91. data/src/org/cx4a/rsense/typing/vertex/CallVertex.java +122 -0
  92. data/src/org/cx4a/rsense/typing/vertex/MultipleAsgnVertex.java +23 -0
  93. data/src/org/cx4a/rsense/typing/vertex/PassThroughVertex.java +20 -0
  94. data/src/org/cx4a/rsense/typing/vertex/SValueVertex.java +24 -0
  95. data/src/org/cx4a/rsense/typing/vertex/SplatVertex.java +24 -0
  96. data/src/org/cx4a/rsense/typing/vertex/ToAryVertex.java +24 -0
  97. data/src/org/cx4a/rsense/typing/vertex/TypeVarVertex.java +22 -0
  98. data/src/org/cx4a/rsense/typing/vertex/Vertex.java +221 -0
  99. data/src/org/cx4a/rsense/typing/vertex/YieldVertex.java +70 -0
  100. data/src/org/cx4a/rsense/util/HereDocReader.java +48 -0
  101. data/src/org/cx4a/rsense/util/Logger.java +111 -0
  102. data/src/org/cx4a/rsense/util/NodeUtil.java +198 -0
  103. data/src/org/cx4a/rsense/util/SourceLocation.java +70 -0
  104. data/src/org/cx4a/rsense/util/StringUtil.java +63 -0
  105. data/src/resources/org/cx4a/rsense/rsense.properties +1 -0
  106. data/stubs/1.8/_builtin.rb +3006 -0
  107. data/stubs/1.8/bigdecimal.rb +131 -0
  108. data/stubs/1.8/cgi.rb +257 -0
  109. data/stubs/1.8/date.rb +147 -0
  110. data/stubs/1.8/optparse.rb +113 -0
  111. data/stubs/1.8/rational.rb +47 -0
  112. data/stubs/1.8/set.rb +94 -0
  113. data/stubs/1.8/socket.rb +461 -0
  114. data/stubs/1.8/stringio.rb +129 -0
  115. data/test/data/a file.rb +1 -0
  116. data/test/data/benchmark.rb +12 -0
  117. data/test/data/crlf.rb +5 -0
  118. data/test/data/test.rb +19 -0
  119. data/test/script/all.rsense +2 -0
  120. data/test/script/array_dynamic.rsense +25 -0
  121. data/test/script/block_nested.rsense +7 -0
  122. data/test/script/builtin.rsense +785 -0
  123. data/test/script/class_method_partial_update.rsense +52 -0
  124. data/test/script/class_partial_update.rsense +17 -0
  125. data/test/script/find-definition.rsense +72 -0
  126. data/test/script/method_arg_onearg.rsense +6 -0
  127. data/test/script/method_arg_optional.rsense +7 -0
  128. data/test/script/method_partial_update.rsense +14 -0
  129. data/test/script/method_yield_arrayarg.rsense +8 -0
  130. data/test/script/method_yield_arrayarg_expand.rsense +8 -0
  131. data/test/script/method_yield_arrayarg_splat.rsense +17 -0
  132. data/test/script/misc.rsense +2 -0
  133. data/test/script/proc_higher_order.rsense +22 -0
  134. data/test/script/regression.rsense +95 -0
  135. data/test/script/stdlib.rsense +66 -0
  136. data/test/script/where.rsense +41 -0
  137. metadata +315 -0
@@ -0,0 +1,10 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ import org.jrubyparser.ast.Node;
4
+
5
+ public interface Block {
6
+ public Node getVarNode();
7
+ public Node getBodyNode();
8
+ public Frame getFrame();
9
+ public Scope getScope();
10
+ }
@@ -0,0 +1,75 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ import java.util.Stack;
4
+
5
+ public class Context {
6
+ private Ruby runtime;
7
+ private Stack<Scope> scopes;
8
+ private Frame frame;
9
+
10
+ public Context(Ruby runtime) {
11
+ this.runtime = runtime;
12
+ this.scopes = new Stack<Scope>();
13
+ }
14
+
15
+ public void pushScope(Scope scope) {
16
+ scopes.push(scope);
17
+ }
18
+
19
+ public void popScope() {
20
+ scopes.pop();
21
+ }
22
+
23
+ public void setFrame(Frame frame) {
24
+ this.frame = frame;
25
+ }
26
+
27
+ public Frame pushFrame(RubyModule cbase, String name, IRubyObject self, Block block, Visibility visibility) {
28
+ this.frame = new Frame(cbase, name, self, block, visibility, this.frame);
29
+ return this.frame;
30
+ }
31
+
32
+ public Frame popFrame() {
33
+ Frame frame = this.frame;
34
+ this.frame = frame.getPrevious();
35
+ return frame;
36
+ }
37
+
38
+ public void pushMain() {
39
+ pushScope(new LocalScope(runtime.getObject()));
40
+ pushFrame(runtime.getObject(), "main", runtime.getTopSelf(), null, Visibility.PRIVATE);
41
+ }
42
+
43
+ public void popMain() {
44
+ popFrame();
45
+ popScope();
46
+ }
47
+
48
+ public Scope getCurrentScope() {
49
+ return scopes.peek();
50
+ }
51
+
52
+ public IRubyObject getConstant(String name) {
53
+ return getCurrentScope().getModule().getConstant(name);
54
+ }
55
+
56
+ public Frame getCurrentFrame() {
57
+ return frame;
58
+ }
59
+
60
+ public IRubyObject getFrameSelf() {
61
+ return getCurrentFrame().getSelf();
62
+ }
63
+
64
+ public RubyModule getFrameModule() {
65
+ return getCurrentFrame().getModule();
66
+ }
67
+
68
+ public Block getFrameBlock() {
69
+ return getCurrentFrame().getBlock();
70
+ }
71
+
72
+ public Visibility getFrameVisibility() {
73
+ return getCurrentFrame().getVisibility();
74
+ }
75
+ }
@@ -0,0 +1,10 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ import org.cx4a.rsense.util.SourceLocation;
4
+
5
+ public interface DynamicMethod {
6
+ public RubyModule getModule();
7
+ public Visibility getVisibility();
8
+ public void setVisibility(Visibility visibility);
9
+ public SourceLocation getLocation();
10
+ }
@@ -0,0 +1,51 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ public class DynamicScope extends LocalScope {
4
+ private Scope scope;
5
+ private int snapshot;
6
+
7
+ public DynamicScope(RubyModule cref, Scope scope) {
8
+ super(cref);
9
+ this.scope = scope;
10
+ this.snapshot = scope.hashCode();
11
+ }
12
+
13
+ @Override
14
+ public IRubyObject getValue(String name) {
15
+ IRubyObject value = super.getValue(name);
16
+ return value != null ? value : scope.getValue(name);
17
+ }
18
+
19
+ @Override
20
+ public void setValue(String name, IRubyObject value) {
21
+ if (scope.getValue(name) != null) {
22
+ scope.setValue(name, value);
23
+ } else {
24
+ super.setValue(name, value);
25
+ }
26
+ }
27
+
28
+ @Override
29
+ public int hashCode() {
30
+ return snapshot;
31
+ }
32
+
33
+ @Override
34
+ public boolean equals(Object other) {
35
+ if (this == other) {
36
+ return true;
37
+ }
38
+
39
+ if (!(other instanceof DynamicScope)) {
40
+ return false;
41
+ }
42
+
43
+ DynamicScope o = (DynamicScope) other;
44
+ return snapshot == o.snapshot;
45
+ }
46
+
47
+ @Override
48
+ public String toString() {
49
+ return "<DynScope: " + scope.toString() + ">";
50
+ }
51
+ }
@@ -0,0 +1,95 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ public class Frame {
4
+ private RubyModule cbase;
5
+ private String name;
6
+ private IRubyObject self;
7
+ private Block block;
8
+ private Visibility visibility;
9
+ private Frame prev;
10
+ private Object tag;
11
+
12
+ public Frame(RubyModule cbase, String name, IRubyObject self, Block block, Visibility visibility, Frame prev) {
13
+ this.cbase = cbase;
14
+ this.name = name;
15
+ this.self = self;
16
+ this.block = block;
17
+ this.visibility = visibility;
18
+ this.prev = prev;
19
+ }
20
+
21
+ public RubyModule getModule() {
22
+ return cbase;
23
+ }
24
+
25
+ public void setModule(RubyModule cbase) {
26
+ this.cbase = cbase;
27
+ }
28
+
29
+ public String getName() {
30
+ return name;
31
+ }
32
+
33
+ public IRubyObject getSelf() {
34
+ return self;
35
+ }
36
+
37
+ public Block getBlock() {
38
+ return block;
39
+ }
40
+
41
+ public Visibility getVisibility() {
42
+ return visibility;
43
+ }
44
+
45
+ public void setVisibility(Visibility visibility) {
46
+ this.visibility = visibility;
47
+ }
48
+
49
+ public Frame getPrevious() {
50
+ return prev;
51
+ }
52
+
53
+ public Object getTag() {
54
+ return tag;
55
+ }
56
+
57
+ public void setTag(Object tag) {
58
+ this.tag = tag;
59
+ }
60
+
61
+ @Override
62
+ public String toString() {
63
+ String s = "[" + name + " " + cbase + "]";
64
+ if (prev != null) {
65
+ s += " < " + prev.toString();
66
+ }
67
+ return s;
68
+ }
69
+
70
+ @Override
71
+ public int hashCode() {
72
+ int code = 0;
73
+ code ^= name.hashCode();
74
+ code ^= cbase.hashCode();
75
+ code ^= self.hashCode();
76
+ return code;
77
+ }
78
+
79
+ @Override
80
+ public boolean equals(Object other) {
81
+ if (this == other) {
82
+ return true;
83
+ }
84
+
85
+ if (!(other instanceof Frame)) {
86
+ return false;
87
+ }
88
+
89
+ Frame o = (Frame) other;
90
+
91
+ return name.equals(o.name)
92
+ && cbase.equals(o.cbase)
93
+ && self.equals(o.self);
94
+ }
95
+ }
@@ -0,0 +1,17 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ public interface IRubyObject {
4
+ public Ruby getRuntime();
5
+ public RubyClass getMetaClass();
6
+ public void setMetaClass(RubyClass metaClass);
7
+ public RubyClass getSingletonClass();
8
+ public RubyClass makeMetaClass(RubyClass superClass);
9
+ public IRubyObject getInstVar(String name);
10
+ public void setInstVar(String name, IRubyObject value);
11
+ public boolean isNil();
12
+ public boolean isInstanceOf(RubyModule klass);
13
+ public boolean isKindOf(RubyModule klass);
14
+ public Object getTag();
15
+ public void setTag(Object tag);
16
+ public int hashCode(int depth);
17
+ }
@@ -0,0 +1,43 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ import java.util.Map;
4
+ import java.util.HashMap;
5
+
6
+ public class LocalScope implements Scope {
7
+ private RubyModule cref;
8
+ private Map<String, IRubyObject> localVars;
9
+
10
+ public LocalScope(RubyModule cref) {
11
+ this.cref = cref;
12
+ this.localVars = new HashMap<String, IRubyObject>();
13
+ }
14
+
15
+ public RubyModule getModule() {
16
+ return cref;
17
+ }
18
+
19
+ public IRubyObject getValue(String name) {
20
+ return localVars.get(name);
21
+ }
22
+
23
+ public void setValue(String name, IRubyObject value) {
24
+ localVars.put(name, value);
25
+ }
26
+
27
+ @Override
28
+ public int hashCode() {
29
+ int code = 0;
30
+ code = cref.hashCode();
31
+ for (Map.Entry<String, IRubyObject> entry : localVars.entrySet()) {
32
+ code ^= entry.getKey().hashCode();
33
+ code <<= 4;
34
+ code ^= entry.getValue().hashCode();
35
+ }
36
+ return code;
37
+ }
38
+
39
+ @Override
40
+ public String toString() {
41
+ return "<LocalScope: " + cref.toString() + " " + localVars.toString() + ">";
42
+ }
43
+ }
@@ -0,0 +1,50 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ public class MetaClass extends RubyClass {
4
+ private IRubyObject attached;
5
+
6
+ public MetaClass(Ruby runtime, RubyClass superClass) {
7
+ super(runtime, superClass);
8
+ }
9
+
10
+ @Override
11
+ public boolean isSingleton() {
12
+ return true;
13
+ }
14
+
15
+ @Override
16
+ public RubyClass getRealClass() {
17
+ return superClass.getRealClass();
18
+ }
19
+
20
+ @Override
21
+ public RubyClass makeMetaClass(RubyClass superClass) {
22
+ RubyClass klass = super.makeMetaClass(superClass);
23
+ klass.setSuperClass(getSuperClass().getRealClass().getMetaClass());
24
+ return klass;
25
+ }
26
+
27
+ public IRubyObject getAttached() {
28
+ return attached;
29
+ }
30
+
31
+ public void setAttached(IRubyObject attached) {
32
+ this.attached = attached;
33
+ }
34
+
35
+ @Override
36
+ public String getMethodPath(String name) {
37
+ String path = attached.toString();
38
+ if (name != null)
39
+ path += "." + name;
40
+ return path;
41
+ }
42
+
43
+ @Override
44
+ public String toString() {
45
+ if (attached instanceof RubyModule)
46
+ return "<" + attached.toString() + ">";
47
+ else
48
+ return super.toString();
49
+ }
50
+ }
@@ -0,0 +1,242 @@
1
+ package org.cx4a.rsense.ruby;
2
+
3
+ import java.util.Map;
4
+ import java.util.HashMap;
5
+
6
+ public class Ruby {
7
+ public static interface ObjectAllocator {
8
+ public IRubyObject allocate(Ruby runtime, RubyClass klass);
9
+ }
10
+
11
+ public static class DefaultObjectAllocator implements ObjectAllocator {
12
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
13
+ return new RubyObject(runtime, klass);
14
+ }
15
+ }
16
+
17
+ private Context context;
18
+ private ObjectAllocator allocator;
19
+ private RubyModule kernelModule;
20
+ private RubyClass objectClass, moduleClass, classClass,
21
+ numericClass, integerClass, fixnumClass, bignumClass,
22
+ floatClass, stringClass, symbolClass,
23
+ booleanClass, trueClass, falseClass, nilClass,
24
+ arrayClass, hashClass, rangeClass,
25
+ regexpClass, matchDataClass,
26
+ exceptionClass, fatalClass,
27
+ procClass;
28
+ private IRubyObject nilObject, trueObject, falseObject;
29
+ private IRubyObject topSelf;
30
+ private Map<String, IRubyObject> globalVars;
31
+
32
+ public Ruby() {
33
+ allocator = new DefaultObjectAllocator();
34
+
35
+ objectClass = RubyClass.newBootClass(this, "Object", null);
36
+ moduleClass = RubyClass.newBootClass(this, "Module", objectClass);
37
+ classClass = RubyClass.newBootClass(this, "Class", moduleClass);
38
+
39
+ objectClass.setMetaClass(classClass);
40
+ moduleClass.setMetaClass(classClass);
41
+ classClass.setMetaClass(classClass);
42
+
43
+ RubyClass metaClass;
44
+ metaClass = objectClass.makeMetaClass(classClass);
45
+ metaClass = moduleClass.makeMetaClass(metaClass);
46
+ metaClass = classClass.makeMetaClass(metaClass);
47
+
48
+ kernelModule = RubyModule.newModule(this, "Kernel", null);
49
+ objectClass.includeModule(kernelModule);
50
+ numericClass = RubyClass.newClass(this, "Numeric", objectClass);
51
+ integerClass = RubyClass.newClass(this, "Integer", numericClass);
52
+ fixnumClass = RubyClass.newClass(this, "Fixnum", integerClass);
53
+ bignumClass = RubyClass.newClass(this, "Bignum", integerClass);
54
+ floatClass = RubyClass.newClass(this, "Float", numericClass);
55
+ stringClass = RubyClass.newClass(this, "String", objectClass);
56
+ symbolClass = RubyClass.newClass(this, "Symbol", objectClass);
57
+ nilClass = RubyClass.newClass(this, "NilClass", objectClass);
58
+ booleanClass = RubyClass.newClass(this, "Boolean", objectClass);
59
+ trueClass = RubyClass.newClass(this, "TrueClass", booleanClass);
60
+ falseClass = RubyClass.newClass(this, "FalseClass", booleanClass);
61
+ arrayClass = RubyClass.newClass(this, "Array", objectClass);
62
+ hashClass = RubyClass.newClass(this, "Hash", objectClass);
63
+ rangeClass = RubyClass.newClass(this, "Range", objectClass);
64
+ regexpClass = RubyClass.newClass(this, "Regexp", objectClass);
65
+ matchDataClass = RubyClass.newClass(this, "MatchData", objectClass);
66
+ exceptionClass = RubyClass.newClass(this, "Exception", objectClass);
67
+ procClass = RubyClass.newClass(this, "Proc", objectClass);
68
+ fatalClass = RubyClass.newClass(this, "fatal", exceptionClass);
69
+
70
+ objectClass.setConstant("Kernel", kernelModule);
71
+ objectClass.setConstant("Object", objectClass);
72
+ objectClass.setConstant("Module", moduleClass);
73
+ objectClass.setConstant("Class", classClass);
74
+ objectClass.setConstant("Numeric", numericClass);
75
+ objectClass.setConstant("Integer", integerClass);
76
+ objectClass.setConstant("Fixnum", fixnumClass);
77
+ objectClass.setConstant("Bignum", bignumClass);
78
+ objectClass.setConstant("Float", floatClass);
79
+ objectClass.setConstant("String", stringClass);
80
+ objectClass.setConstant("Symbol", symbolClass);
81
+ objectClass.setConstant("NilClass", nilClass);
82
+ objectClass.setConstant("Boolean", booleanClass);
83
+ objectClass.setConstant("TrueClass", trueClass);
84
+ objectClass.setConstant("FalseClass", falseClass);
85
+ objectClass.setConstant("Array", arrayClass);
86
+ objectClass.setConstant("Hash", hashClass);
87
+ objectClass.setConstant("Range", rangeClass);
88
+ objectClass.setConstant("Regexp", regexpClass);
89
+ objectClass.setConstant("MatchData", matchDataClass);
90
+ objectClass.setConstant("Exception", exceptionClass);
91
+ objectClass.setConstant("Proc", procClass);
92
+ objectClass.setConstant("fatal", fatalClass);
93
+
94
+ nilObject = new SpecialObject(this, nilClass, "nil");
95
+ trueObject = new SpecialObject(this, trueClass, "true");
96
+ falseObject = new SpecialObject(this, falseClass, "false");
97
+
98
+ topSelf = new RubyObject(this, objectClass);
99
+
100
+ globalVars = new HashMap<String, IRubyObject>();
101
+ context = new Context(this);
102
+ }
103
+
104
+ public Context getContext() {
105
+ return context;
106
+ }
107
+
108
+ public void setObjectAllocator(ObjectAllocator allocator) {
109
+ this.allocator = allocator;
110
+ }
111
+
112
+ public IRubyObject getGlobalVar(String name) {
113
+ return globalVars.get(name);
114
+ }
115
+
116
+ public void setGlobalVar(String name, IRubyObject value) {
117
+ globalVars.put(name, value);
118
+ }
119
+
120
+ public IRubyObject newInstance(RubyClass klass) {
121
+ return allocator.allocate(this, klass);
122
+ }
123
+
124
+ public boolean isInstanceOf(IRubyObject object, RubyModule klass) {
125
+ return object.getMetaClass() == klass;
126
+ }
127
+
128
+ public boolean isKindOf(IRubyObject object, RubyModule klass) {
129
+ // FIXME speedup
130
+ RubyClass oclass = object.getMetaClass();
131
+ while (oclass != null) {
132
+ if (oclass == klass) {
133
+ return true;
134
+ }
135
+ oclass = oclass.getSuperClass();
136
+ }
137
+ if (object.getMetaClass().getIncludes(true).contains(klass)) {
138
+ return true;
139
+ }
140
+ return false;
141
+ }
142
+
143
+ public RubyModule getKernel() {
144
+ return kernelModule;
145
+ }
146
+
147
+ public RubyClass getObject() {
148
+ return objectClass;
149
+ }
150
+
151
+ public RubyClass getModule() {
152
+ return moduleClass;
153
+ }
154
+
155
+ public RubyClass getClassClass() {
156
+ return classClass;
157
+ }
158
+
159
+ public RubyClass getNumeric() {
160
+ return numericClass;
161
+ }
162
+
163
+ public RubyClass getInteger() {
164
+ return integerClass;
165
+ }
166
+
167
+ public RubyClass getFixnum() {
168
+ return fixnumClass;
169
+ }
170
+
171
+ public RubyClass getBignum() {
172
+ return bignumClass;
173
+ }
174
+
175
+ public RubyClass getFloat() {
176
+ return floatClass;
177
+ }
178
+
179
+ public RubyClass getString() {
180
+ return stringClass;
181
+ }
182
+
183
+ public RubyClass getSymbol() {
184
+ return symbolClass;
185
+ }
186
+
187
+ public RubyClass getArray() {
188
+ return arrayClass;
189
+ }
190
+
191
+ public RubyClass getHash() {
192
+ return hashClass;
193
+ }
194
+
195
+ public RubyClass getRange() {
196
+ return rangeClass;
197
+ }
198
+
199
+ public RubyClass getRegexp() {
200
+ return regexpClass;
201
+ }
202
+
203
+ public RubyClass getMatchData() {
204
+ return matchDataClass;
205
+ }
206
+
207
+ public RubyClass getNilClass() {
208
+ return nilClass;
209
+ }
210
+
211
+ public RubyClass getBoolean() {
212
+ return booleanClass;
213
+ }
214
+
215
+ public RubyClass getTrueClass() {
216
+ return trueClass;
217
+ }
218
+
219
+ public RubyClass getFalseClass() {
220
+ return falseClass;
221
+ }
222
+
223
+ public RubyClass getProc() {
224
+ return procClass;
225
+ }
226
+
227
+ public IRubyObject getNil() {
228
+ return nilObject;
229
+ }
230
+
231
+ public IRubyObject getTrue() {
232
+ return trueObject;
233
+ }
234
+
235
+ public IRubyObject getFalse() {
236
+ return falseObject;
237
+ }
238
+
239
+ public IRubyObject getTopSelf() {
240
+ return topSelf;
241
+ }
242
+ }