diff options
author | mihaylov <mihaylov@epfl.ch> | 2004-12-13 15:00:53 +0000 |
---|---|---|
committer | mihaylov <mihaylov@epfl.ch> | 2004-12-13 15:00:53 +0000 |
commit | 99847828c7cfe7da54722c0f8dcc52edc641419e (patch) | |
tree | 8d8c6f9c57320cfbaebe701093566597818034b6 /sources/scalac/backend/msil | |
parent | 8332a1e9d802472fe763cce3a3bf6967e74a0249 (diff) | |
download | scala-99847828c7cfe7da54722c0f8dcc52edc641419e.tar.gz scala-99847828c7cfe7da54722c0f8dcc52edc641419e.tar.bz2 scala-99847828c7cfe7da54722c0f8dcc52edc641419e.zip |
[MSIL] Prevent the loading of synthetic Scala c...
[MSIL] Prevent the loading of synthetic Scala classes by marking them
with a special attribute.
Diffstat (limited to 'sources/scalac/backend/msil')
-rw-r--r-- | sources/scalac/backend/msil/GenMSIL.java | 44 | ||||
-rw-r--r-- | sources/scalac/backend/msil/TypeCreator.java | 7 |
2 files changed, 33 insertions, 18 deletions
diff --git a/sources/scalac/backend/msil/GenMSIL.java b/sources/scalac/backend/msil/GenMSIL.java index 0d6250e4c5..36c1b6432a 100644 --- a/sources/scalac/backend/msil/GenMSIL.java +++ b/sources/scalac/backend/msil/GenMSIL.java @@ -21,6 +21,7 @@ import scalac.ast.Tree; import scalac.ast.TreeList; import scalac.atree.AConstant; import Tree.*; +import scalac.symtab.AttrInfo; import scalac.symtab.Symbol; import scalac.symtab.TypeTags; import scalac.symtab.Modifiers; @@ -38,6 +39,7 @@ import ch.epfl.lamp.compiler.msil.emit.*; import Item.*; +import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.Iterator; @@ -170,38 +172,47 @@ public final class GenMSIL { /** The method that is currently being compiled. */ private MethodBase currentMethod; + + private static final byte[] NO_SYMTAB = new byte[] {1, 0, 0, 0}; /* * Emit the symbol table for the class given class as an MSIL attribute. */ private void emitSymtab(Symbol clazz) { + ConstructorInfo symtabConstr = tc.SYMTAB_DEFAULT_CONSTR; + byte[] symtab = null; Pickle pickle = (Pickle)global.symdata.get(clazz); - if (pickle != null) { - byte[] symtab = new byte[pickle.size() + 8]; + if (pickle == null) { + symtab = NO_SYMTAB; + } else { + symtabConstr = tc.SYMTAB_CONSTR; + symtab = new byte[pickle.size() + 8]; symtab[0] = 1; for (int size = pickle.size(), i = 2; i < 6; i++) { symtab[i] = (byte)(size & 0xff); size >>= 8; } System.arraycopy(pickle.bytes, 0, symtab, 6, pickle.size()); - TypeBuilder type = (TypeBuilder) tc.getType(clazz); - if (clazz.isModuleClass()) { - TypeBuilder t = tc.getStaticType(clazz); - if (t != null) { - type = t; - if (global.args.debuginfo.value) - type.setPosition(Position.line(clazz.pos), getSourceFilename()); - } - } - type.SetCustomAttribute(tc.SCALA_SYMTAB_ATTR_CONSTR, symtab); - } + } + TypeBuilder type = (TypeBuilder) tc.getType(clazz); + if (clazz.isModuleClass()) { + TypeBuilder t = tc.getStaticType(clazz); + if (t != null) { + type.SetCustomAttribute(tc.SYMTAB_DEFAULT_CONSTR, NO_SYMTAB); + type = t; + if (global.args.debuginfo.value) + type.setPosition(Position.line(clazz.pos), getSourceFilename()); + } + } + type.SetCustomAttribute(symtabConstr, symtab); } /* * Generate the code for a class definition */ private void genClass(Symbol clazz, Tree[] body) { - //Object o = global.mapSymbolAttr.get(clazz); - //System.out.println("[" + o + "]" + Debug.show(clazz)); +// AttrInfo attrs = global.getAttributes(clazz); +// if (attrs != null) +// System.out.println("" + attrs + Debug.show(clazz)); Symbol outerClass = currentClass; currentClass = clazz; if (clazz.isModuleClass()) { @@ -268,6 +279,9 @@ public final class GenMSIL { * Generate code for constructors and methods. */ private void genDef(Symbol sym, ValDef[] parameters, Tree rhs, MSILType toType) { +// AttrInfo attrs = global.getAttributes(sym); +// if (attrs != null) +// System.out.println("" + attrs + Debug.show(sym)); MethodBase method = tc.getMethod(sym); params.clear(); diff --git a/sources/scalac/backend/msil/TypeCreator.java b/sources/scalac/backend/msil/TypeCreator.java index 1b8fae8277..af106a1fa1 100644 --- a/sources/scalac/backend/msil/TypeCreator.java +++ b/sources/scalac/backend/msil/TypeCreator.java @@ -115,7 +115,8 @@ final class TypeCreator { public Symbol SYM_COMPARE_TO_IGNORE_CASE; public MethodInfo COMPARE_TO_IGNORE_CASE; - public ConstructorInfo SCALA_SYMTAB_ATTR_CONSTR; + public ConstructorInfo SYMTAB_CONSTR; + public ConstructorInfo SYMTAB_DEFAULT_CONSTR; private scalac.symtab.Type MAIN_METHOD_TYPE; @@ -194,7 +195,6 @@ final class TypeCreator { final Symbol JOBJECT = defs.OBJECT_CLASS; //defs.getClass("java.lang.Object"); final Symbol JSTRING = defs.STRING_CLASS; - // initialize type mappings map(defs.ANY_CLASS, OBJECT); map(defs.ANYREF_CLASS, OBJECT); @@ -289,7 +289,8 @@ final class TypeCreator { STRING.GetMethod("Compare", new Type[]{STRING, STRING, BOOLEAN}); initialized = true; - SCALA_SYMTAB_ATTR_CONSTR = ti.SCALA_SYMTAB_ATTR.GetConstructors()[0]; + SYMTAB_CONSTR = ti.SYMTAB_CONSTR; + SYMTAB_DEFAULT_CONSTR = ti.SYMTAB_DEFAULT_CONSTR; scalac.symtab.Type argument = defs.array_TYPE(defs.STRING_TYPE()); scalac.symtab.Type result = defs.void_TYPE(); |