rsense-core 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/README.md +35 -0
- data/Rakefile +84 -0
- data/TypeAnnotation.tokens +41 -0
- data/build.xml +84 -0
- data/build_lib/antlr-3.2.jar +0 -0
- data/lib/jars/ant-1.7.0.jar +0 -0
- data/lib/jars/ant-launcher-1.7.0.jar +0 -0
- data/lib/jars/antlr-runtime-3.2.jar +0 -0
- data/lib/jars/bsf-2.3.0.jar +0 -0
- data/lib/rsense-core.rb +28 -0
- data/lib/rsense.jar +0 -0
- data/lib/rsense/core.rb +5 -0
- data/lib/rsense/core/version.rb +5 -0
- data/lib/rsense/parser.rb +6 -0
- data/lib/rsense/ruby.rb +19 -0
- data/lib/rsense/typing.rb +13 -0
- data/lib/rsense/typing/annotation.rb +20 -0
- data/lib/rsense/typing/runtime.rb +23 -0
- data/lib/rsense/typing/vertex.rb +15 -0
- data/lib/rsense/util.rb +9 -0
- data/rsense-core.gemspec +30 -0
- data/src/org/cx4a/rsense/CodeAssist.java +744 -0
- data/src/org/cx4a/rsense/CodeAssistError.java +31 -0
- data/src/org/cx4a/rsense/CodeAssistResult.java +42 -0
- data/src/org/cx4a/rsense/CodeCompletionResult.java +65 -0
- data/src/org/cx4a/rsense/FindDefinitionResult.java +24 -0
- data/src/org/cx4a/rsense/LoadResult.java +19 -0
- data/src/org/cx4a/rsense/Main.java +916 -0
- data/src/org/cx4a/rsense/Options.java +353 -0
- data/src/org/cx4a/rsense/Project.java +103 -0
- data/src/org/cx4a/rsense/TypeInferenceResult.java +25 -0
- data/src/org/cx4a/rsense/WhereResult.java +19 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotation.g +221 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationLexer.java +1759 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationParser.java +2025 -0
- data/src/org/cx4a/rsense/ruby/Block.java +10 -0
- data/src/org/cx4a/rsense/ruby/Context.java +75 -0
- data/src/org/cx4a/rsense/ruby/DynamicMethod.java +10 -0
- data/src/org/cx4a/rsense/ruby/DynamicScope.java +51 -0
- data/src/org/cx4a/rsense/ruby/Frame.java +95 -0
- data/src/org/cx4a/rsense/ruby/IRubyObject.java +17 -0
- data/src/org/cx4a/rsense/ruby/LocalScope.java +43 -0
- data/src/org/cx4a/rsense/ruby/MetaClass.java +50 -0
- data/src/org/cx4a/rsense/ruby/Ruby.java +242 -0
- data/src/org/cx4a/rsense/ruby/RubyClass.java +146 -0
- data/src/org/cx4a/rsense/ruby/RubyModule.java +255 -0
- data/src/org/cx4a/rsense/ruby/RubyObject.java +94 -0
- data/src/org/cx4a/rsense/ruby/Scope.java +7 -0
- data/src/org/cx4a/rsense/ruby/SpecialObject.java +15 -0
- data/src/org/cx4a/rsense/ruby/Visibility.java +17 -0
- data/src/org/cx4a/rsense/typing/Graph.java +1690 -0
- data/src/org/cx4a/rsense/typing/Propagation.java +73 -0
- data/src/org/cx4a/rsense/typing/Template.java +84 -0
- data/src/org/cx4a/rsense/typing/TemplateAttribute.java +158 -0
- data/src/org/cx4a/rsense/typing/TypeSet.java +48 -0
- data/src/org/cx4a/rsense/typing/annotation/ClassType.java +57 -0
- data/src/org/cx4a/rsense/typing/annotation/MethodType.java +79 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAnnotation.java +4 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAny.java +7 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeApplication.java +37 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeConstraint.java +29 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeExpression.java +11 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeIdentity.java +59 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeOptional.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypePragma.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeSplat.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeTuple.java +35 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeUnion.java +23 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeVariable.java +44 -0
- data/src/org/cx4a/rsense/typing/runtime/AliasMethod.java +94 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationHelper.java +69 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationResolver.java +523 -0
- data/src/org/cx4a/rsense/typing/runtime/Array.java +84 -0
- data/src/org/cx4a/rsense/typing/runtime/ClassTag.java +27 -0
- data/src/org/cx4a/rsense/typing/runtime/DefaultMethod.java +115 -0
- data/src/org/cx4a/rsense/typing/runtime/Hash.java +131 -0
- data/src/org/cx4a/rsense/typing/runtime/LoopTag.java +21 -0
- data/src/org/cx4a/rsense/typing/runtime/Method.java +32 -0
- data/src/org/cx4a/rsense/typing/runtime/MonomorphicObject.java +77 -0
- data/src/org/cx4a/rsense/typing/runtime/ObjectAllocator.java +40 -0
- data/src/org/cx4a/rsense/typing/runtime/PolymorphicObject.java +90 -0
- data/src/org/cx4a/rsense/typing/runtime/Proc.java +100 -0
- data/src/org/cx4a/rsense/typing/runtime/RuntimeHelper.java +1339 -0
- data/src/org/cx4a/rsense/typing/runtime/SpecialMethod.java +119 -0
- data/src/org/cx4a/rsense/typing/runtime/TypeVarMap.java +112 -0
- data/src/org/cx4a/rsense/typing/runtime/VertexHolder.java +48 -0
- data/src/org/cx4a/rsense/typing/vertex/CallVertex.java +122 -0
- data/src/org/cx4a/rsense/typing/vertex/MultipleAsgnVertex.java +23 -0
- data/src/org/cx4a/rsense/typing/vertex/PassThroughVertex.java +20 -0
- data/src/org/cx4a/rsense/typing/vertex/SValueVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/SplatVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/ToAryVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/TypeVarVertex.java +22 -0
- data/src/org/cx4a/rsense/typing/vertex/Vertex.java +221 -0
- data/src/org/cx4a/rsense/typing/vertex/YieldVertex.java +70 -0
- data/src/org/cx4a/rsense/util/HereDocReader.java +48 -0
- data/src/org/cx4a/rsense/util/Logger.java +111 -0
- data/src/org/cx4a/rsense/util/NodeUtil.java +198 -0
- data/src/org/cx4a/rsense/util/SourceLocation.java +70 -0
- data/src/org/cx4a/rsense/util/StringUtil.java +63 -0
- data/src/resources/org/cx4a/rsense/rsense.properties +1 -0
- data/stubs/1.8/_builtin.rb +3006 -0
- data/stubs/1.8/bigdecimal.rb +131 -0
- data/stubs/1.8/cgi.rb +257 -0
- data/stubs/1.8/date.rb +147 -0
- data/stubs/1.8/optparse.rb +113 -0
- data/stubs/1.8/rational.rb +47 -0
- data/stubs/1.8/set.rb +94 -0
- data/stubs/1.8/socket.rb +461 -0
- data/stubs/1.8/stringio.rb +129 -0
- data/test/data/a file.rb +1 -0
- data/test/data/benchmark.rb +12 -0
- data/test/data/crlf.rb +5 -0
- data/test/data/test.rb +19 -0
- data/test/script/all.rsense +2 -0
- data/test/script/array_dynamic.rsense +25 -0
- data/test/script/block_nested.rsense +7 -0
- data/test/script/builtin.rsense +785 -0
- data/test/script/class_method_partial_update.rsense +52 -0
- data/test/script/class_partial_update.rsense +17 -0
- data/test/script/find-definition.rsense +72 -0
- data/test/script/method_arg_onearg.rsense +6 -0
- data/test/script/method_arg_optional.rsense +7 -0
- data/test/script/method_partial_update.rsense +14 -0
- data/test/script/method_yield_arrayarg.rsense +8 -0
- data/test/script/method_yield_arrayarg_expand.rsense +8 -0
- data/test/script/method_yield_arrayarg_splat.rsense +17 -0
- data/test/script/misc.rsense +2 -0
- data/test/script/proc_higher_order.rsense +22 -0
- data/test/script/regression.rsense +95 -0
- data/test/script/stdlib.rsense +66 -0
- data/test/script/where.rsense +41 -0
- metadata +315 -0
@@ -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
|
+
}
|