From 1732d4ec94c62847c84bc21fd153e5b319d61772 Mon Sep 17 00:00:00 2001 From: paltherr Date: Fri, 8 Aug 2003 16:06:30 +0000 Subject: - Changed interpreter to handle preloaded symbols --- sources/scala/tools/scalai/Compiler.java | 2 +- sources/scala/tools/scalai/Environment.java | 15 ++++++---- sources/scala/tools/scalai/ExpressionCompiler.java | 9 ------ sources/scala/tools/scalai/JavaMirror.java | 35 +++++++++++++++++++--- 4 files changed, 42 insertions(+), 19 deletions(-) (limited to 'sources') 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); } -- cgit v1.2.3