summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-08-08 16:06:30 +0000
committerpaltherr <paltherr@epfl.ch>2003-08-08 16:06:30 +0000
commit1732d4ec94c62847c84bc21fd153e5b319d61772 (patch)
tree81c39b3b6b18d7eb4dccb29001a4b7e96ae3e81d /sources
parenta89d27dea06ea8e7e96b8b0f457e9f574c8886f3 (diff)
downloadscala-1732d4ec94c62847c84bc21fd153e5b319d61772.tar.gz
scala-1732d4ec94c62847c84bc21fd153e5b319d61772.tar.bz2
scala-1732d4ec94c62847c84bc21fd153e5b319d61772.zip
- Changed interpreter to handle preloaded symbols
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/tools/scalai/Compiler.java2
-rw-r--r--sources/scala/tools/scalai/Environment.java15
-rw-r--r--sources/scala/tools/scalai/ExpressionCompiler.java9
-rw-r--r--sources/scala/tools/scalai/JavaMirror.java35
4 files changed, 42 insertions, 19 deletions
diff --git a/sources/scala/tools/scalai/Compiler.java b/sources/scala/tools/scalai/Compiler.java
index 768b335734..9590877a5f 100644
--- a/sources/scala/tools/scalai/Compiler.java
+++ b/sources/scala/tools/scalai/Compiler.java
@@ -316,7 +316,7 @@ public class Compiler {
private void getTypes(Set supertypes, List interfaces, Symbol type) {
if (supertypes.contains(type)) return; else supertypes.add(type);
- if (!type.isJava()) {
+ if (!type.isPreloaded()) {
Type[] basetypes = type.parents();
for (int i = 0; i < basetypes.length; i++) {
getTypes(supertypes, interfaces, basetypes[i].symbol());
diff --git a/sources/scala/tools/scalai/Environment.java b/sources/scala/tools/scalai/Environment.java
index a5ae958990..bc16c12a08 100644
--- a/sources/scala/tools/scalai/Environment.java
+++ b/sources/scala/tools/scalai/Environment.java
@@ -98,7 +98,7 @@ public class Environment {
assert symbol.isType() : Debug.show(symbol);
Object value = templates.get(symbol);
if (value != null) return (Template)value;
- if (symbol.isJava()) {
+ if (symbol.isPreloaded()) {
Template template = Template.JavaClass(mirror.getClass(symbol));
return insertTemplate(symbol, template);
} else {
@@ -110,7 +110,7 @@ public class Environment {
assert symbol.isTerm() : Debug.show(symbol);
Object value = functions.get(symbol);
if (value != null) return (Function)value;
- if (symbol.isJava()) {
+ if (symbol.isPreloaded()) {
Function function = (symbol.name == Names.CONSTRUCTOR) ?
Function.JavaConstructor(mirror.getConstructor(symbol)) :
Function.JavaMethod(mirror.getMethod(symbol));
@@ -124,7 +124,12 @@ public class Environment {
assert symbol.isTerm() : Debug.show(symbol);
Object value = variables.get(symbol);
if (value != null) return (Variable)value;
- if (symbol.isJava()) {
+ if (symbol.isJava() && symbol.isModule()) {
+ // !!! This should never happen. This value will never be used.
+ Class clasz = mirror.getClass(symbol.moduleClass());
+ Variable variable = Variable.Global(clasz);
+ return insertVariable(symbol, variable);
+ } else if (symbol.isPreloaded()) {
Variable variable = Variable.JavaField(mirror.getField(symbol));
return insertVariable(symbol, variable);
} else {
@@ -152,7 +157,7 @@ public class Environment {
private void loadOwner(String what, Symbol symbol) {
assert Debug.log("search ", what, ": ", symbol);
assert symbol.owner().isType() : Debug.show(symbol);
- assert!symbol.owner().isJava() : symbol;
+ assert!symbol.owner().isPreloaded() : Debug.show(symbol);
loadTemplate(symbol.owner());
}
@@ -193,7 +198,7 @@ public class Environment {
private void loadMethodOverride(Type[] bases, Symbol symbol) {
if (!symbol.isMethod()) return;
Override override = Override.empty().insert(symbol);
- if (symbol.isJava()) override.insert(mirror.getMethod(symbol));
+ if (symbol.isPreloaded()) override.insert(mirror.getMethod(symbol));
for (int i = 0; i < bases.length; i++) {
Symbol overridden = symbol.overriddenSymbol(bases[i]);
if (overridden == Symbol.NONE) continue;
diff --git a/sources/scala/tools/scalai/ExpressionCompiler.java b/sources/scala/tools/scalai/ExpressionCompiler.java
index e1fc523bc4..5fcc4d925a 100644
--- a/sources/scala/tools/scalai/ExpressionCompiler.java
+++ b/sources/scala/tools/scalai/ExpressionCompiler.java
@@ -273,15 +273,6 @@ public class ExpressionCompiler {
// !!! return something ? raise exception ?
if (!symbol.isValue()) return Code.Null;
- // !!! we should remove this test and only test if is JAVA
- if (symbol.isModule()) {
- // !!! why don't we use type() ?
- Symbol type = symbol.info().symbol(); // !!! simplify ?
- switch (context.lookupTemplate(type)) {
- case JavaClass(Class clasz): return Code.Literal(clasz);
- }
- }
-
return Code.Load(object(target), context.lookupVariable(symbol));
}
diff --git a/sources/scala/tools/scalai/JavaMirror.java b/sources/scala/tools/scalai/JavaMirror.java
index 87889bad73..7e65eb10d7 100644
--- a/sources/scala/tools/scalai/JavaMirror.java
+++ b/sources/scala/tools/scalai/JavaMirror.java
@@ -15,6 +15,7 @@ import java.lang.reflect.Constructor;
import java.util.Map;
import java.util.HashMap;
+import scalac.symtab.Kinds;
import scalac.symtab.TypeTags;
import scalac.symtab.Type;
import scalac.symtab.Symbol;
@@ -143,13 +144,29 @@ public class JavaMirror {
}
private Class getClass0(Symbol symbol) {
+ String name = getClassName(symbol, false);
try {
- return Class.forName(symbol.fullName().toString(), false, loader);
+ return Class.forName(name, false, loader);
} catch (ClassNotFoundException exception) {
- throw Debug.abort("no such class", symbol);
+ throw Debug.abort("no such class", Debug.show(symbol," - ",name));
}
}
+ private String getClassName(Symbol symbol, boolean asPrefix) {
+ assert symbol.kind == Kinds.CLASS : Debug.show(symbol);
+ String name = getPrefix(symbol.owner()) + symbol.name;
+ if (!asPrefix && !symbol.isJava() && symbol.isModuleClass())
+ name = name + '$';
+ return name;
+ }
+
+ private String getPrefix(Symbol symbol) {
+ assert symbol.kind == Kinds.CLASS : Debug.show(symbol);
+ if (symbol.isRoot()) return "";
+ String prefix = getClassName(symbol, true);
+ return prefix + (symbol.isClass() ? '$' : '.');
+ }
+
//########################################################################
// Public Methods - fields
@@ -163,9 +180,19 @@ public class JavaMirror {
}
private Field getField0(Symbol symbol) {
- Class owner = getClass(symbol.owner());
+ if (symbol.isModule()) {
+ assert !symbol.isJava() : Debug.show(symbol);
+ Class owner = getClass0(symbol.moduleClass());
+ return getField0(symbol, owner, "MODULE$");
+ } else {
+ Class owner = getClass(symbol.owner());
+ return getField0(symbol, owner, symbol.name.toString());
+ }
+ }
+
+ private Field getField0(Symbol symbol, Class owner, String name) {
try {
- return owner.getField(symbol.name.toString());
+ return owner.getField(name);
} catch (NoSuchFieldException exception) {
throw Debug.abort("no such field", symbol);
}