diff options
author | Martin Odersky <odersky@gmail.com> | 2003-08-06 16:41:30 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-08-06 16:41:30 +0000 |
commit | e1d1b2d9b8797b2af95c247f840ccb11b1857dc7 (patch) | |
tree | 64b90516b728f57d4fb6263d5711b4704f0009b3 /sources/scalac/symtab/classfile | |
parent | 57fdd4109972ddadc83d5dbb23e50993a6359145 (diff) | |
download | scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.tar.gz scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.tar.bz2 scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab/classfile')
-rw-r--r-- | sources/scalac/symtab/classfile/AttributeParser.java | 19 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassParser.java | 3 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassfileParser.java | 9 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/PackageParser.java | 41 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/Pickle.java | 40 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/UnPickle.java | 3 |
6 files changed, 46 insertions, 69 deletions
diff --git a/sources/scalac/symtab/classfile/AttributeParser.java b/sources/scalac/symtab/classfile/AttributeParser.java index 4df2529b2d..a4cfc6fec6 100644 --- a/sources/scalac/symtab/classfile/AttributeParser.java +++ b/sources/scalac/symtab/classfile/AttributeParser.java @@ -81,18 +81,8 @@ public class AttributeParser implements ClassfileConstants { switch (attr) { // class attributes case SCALA_ATTR: - in.skip(attrLen); - /* not yet - Name sourcefile = (Name)pool.readPool(in.nextChar()); - new UnPickle( - (JavaClassSymbol) sym, in.nextBytes(attrLen - 2), sourcefile); - */ - return; - - case SOURCEFILE_ATTR: - // ((ClassDef)def).sourcefile = (Name)reader.readPool(in.nextChar()); - in.skip(attrLen); - return; + new UnPickle(sym, in.nextBytes(attrLen), Name.fromString(in.path)); + return; case INNERCLASSES_ATTR: /* int n = in.nextChar(); @@ -154,8 +144,11 @@ public class AttributeParser implements ClassfileConstants { new MetaParser(meta, tvars, sym, type).parse(), Symbol.FIRST_ID); return; + + default: + in.skip(attrLen); + return; } - throw new RuntimeException("unknown classfile attribute"); } Scope tvars = new Scope(); diff --git a/sources/scalac/symtab/classfile/ClassParser.java b/sources/scalac/symtab/classfile/ClassParser.java index 19eb931f3b..0dc29c87bb 100644 --- a/sources/scalac/symtab/classfile/ClassParser.java +++ b/sources/scalac/symtab/classfile/ClassParser.java @@ -28,6 +28,7 @@ public class ClassParser extends Type.LazyType { /** complete class symbol c by loading the class */ public void complete(Symbol c) { + c.owner().initialize(); //System.out.println("loading " + c);//DEBUG try { long msec = System.currentTimeMillis(); @@ -59,7 +60,7 @@ public class ClassParser extends Type.LazyType { return new AliasParser(alias); } - class StaticsParser extends Type.LazyType { + public class StaticsParser extends Type.LazyType { Symbol clazz; StaticsParser(Symbol clazz) { diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index 098be96b06..da5300cb42 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -97,11 +97,12 @@ public class ClassfileParser implements ClassfileConstants { c.setInfo(classType, Symbol.FIRST_ID); // set type of statics Symbol staticsClass = c.module().moduleClass(); - Type staticsInfo = Type.compoundType(Type.EMPTY_ARRAY, statics, staticsClass); - staticsClass.setInfo(staticsInfo, Symbol.FIRST_ID); - c.module().setInfo(Type.TypeRef(staticsClass.owner().thisType(), + if (staticsClass.isModuleClass()) { + Type staticsInfo = Type.compoundType(Type.EMPTY_ARRAY, statics, staticsClass); + staticsClass.setInfo(staticsInfo, Symbol.FIRST_ID); + c.module().setInfo(Type.TypeRef(staticsClass.owner().thisType(), staticsClass, Type.EMPTY_ARRAY)); - + } basetpes[0] = supertpe; for (int i = 1; i < basetpes.length; i++) basetpes[i] = readClassType(in.nextChar()); diff --git a/sources/scalac/symtab/classfile/PackageParser.java b/sources/scalac/symtab/classfile/PackageParser.java index 9fdbe797ed..1b29c7a0ef 100644 --- a/sources/scalac/symtab/classfile/PackageParser.java +++ b/sources/scalac/symtab/classfile/PackageParser.java @@ -8,10 +8,12 @@ package scalac.symtab.classfile; +import ch.epfl.lamp.util.*; import scalac.*; import scalac.symtab.*; import scalac.util.*; import java.io.*; +import java.util.HashMap; public class PackageParser extends Type.LazyType { @@ -39,18 +41,19 @@ public class PackageParser extends Type.LazyType { Scope members = new Scope(); String dirname = null; Name name = p.fullName(); + HashMap/*<Symbol, AbstractFile>*/ symFile = new HashMap(); if (name.length() == 0) { // includeMembers(AbstractFile.open(null, "."), p, members, false); } else { dirname = SourceRepresentation.externalizeFileName(name); - assert !dirname.startsWith("com") : p;//debug if (!dirname.endsWith("/")) dirname += "/"; } String[] base = global.classPath.components(); for (int i = 0; i < base.length; i++) { includeMembers( - AbstractFile.open(base[i], dirname), p, members, dirname != null); + AbstractFile.open(base[i], dirname), + p, members, dirname != null, symFile); } p.setInfo(Type.compoundType(Type.EMPTY_ARRAY, members, p)); if (dirname == null) @@ -59,11 +62,24 @@ public class PackageParser extends Type.LazyType { (System.currentTimeMillis() - msec) + "ms"); } + private boolean isMostRecent(AbstractFile f, Symbol previous, HashMap symFile) { + if (previous == Symbol.NONE || previous.isPackage()) return true; + if (previous.pos != Position.NOPOS) return false; + AbstractFile pf = (AbstractFile) symFile.get(previous); + if (!global.separate) { + if (f.getName().endsWith(".scala") && + pf.getName().endsWith(".class")) return true; + if (f.getName().endsWith(".class") && + pf.getName().endsWith(".scala")) return false; + } + return f.lastModified() > pf.lastModified(); + } + /** read directory of a classpath directory and include members * in package/module scope */ protected void includeMembers(AbstractFile dir, Symbol p, Scope locals, - boolean inclClasses) { + boolean inclClasses, HashMap symFile) { if (dir == null) return; String[] filenames = null; @@ -72,14 +88,17 @@ public class PackageParser extends Type.LazyType { return; for (int j = 0; j < filenames.length; j++) { String fname = filenames[j]; + AbstractFile f = dir.open(fname); if (inclClasses && fname.endsWith(".class")) { Name n = Name.fromString(fname.substring(0, fname.length() - 6)) .toTypeName(); - if (locals.lookup(n) == Symbol.NONE) { + if (isMostRecent(f, locals.lookup(n), symFile)) { ClassSymbol clazz = new ClassSymbol(n, p, classCompletion); // todo: needed? clazz.allConstructors().setInfo( classCompletion.staticsParser(clazz)); + clazz.module().setInfo( + classCompletion.staticsParser(clazz)); // enter class locals.enter(clazz); // enter module, except for scala.Object class @@ -93,14 +112,18 @@ public class PackageParser extends Type.LazyType { } locals.enter(clazz.module()); } + symFile.put(clazz, f); } } else if (fname.endsWith("/") && !fname.equals("META-INF/")) { Name n = Name.fromString(fname.substring(0, fname.length() - 1)); if (locals.lookup(n) == Symbol.NONE) { TermSymbol module = TermSymbol.newJavaPackageModule(n, p, this); locals.enter(module); + //todo: moduleClass needs to be entered? locals.enter(module.moduleClass()); - } + } + +/* } else if (inclClasses && fname.endsWith(".symbl")) { //todo: compare dates between symbl and scala. Name n = Name.fromString(fname.substring(0, fname.length() - 6)) @@ -117,14 +140,11 @@ public class PackageParser extends Type.LazyType { locals.enter(clazz); locals.enter(clazz.module()); } +*/ } else if (inclClasses && fname.endsWith(".scala")) { Name n = Name.fromString(fname.substring(0, fname.length() - 6)) .toTypeName(); - Symbol sym = locals.lookup(n); - if (sym == Symbol.NONE || - sym.isPackage() || - sym.rawInfoAt(Symbol.FIRST_ID) instanceof ClassParser && - !(sym.rawInfoAt(Symbol.FIRST_ID) instanceof SymblParser)) { + if (isMostRecent(f, locals.lookup(n), symFile)) { SourceCompleter completer = new SourceCompleter(global); ClassSymbol clazz = new ClassSymbol(n, p, completer); //todo: needed? @@ -133,6 +153,7 @@ public class PackageParser extends Type.LazyType { // enter class locals.enter(clazz); locals.enter(clazz.module()); + symFile.put(clazz, f); } } } diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java index fe41289f8f..bae101668d 100644 --- a/sources/scalac/symtab/classfile/Pickle.java +++ b/sources/scalac/symtab/classfile/Pickle.java @@ -72,46 +72,6 @@ public class Pickle implements Kinds, Modifiers, EntryTags { return bp; } - /** Create output file with given extension for given class. - */ - public File outputFile(Name fullname, String extension) { - if (Global.instance.outpath != null) { - return new File( - Global.instance.outpath, - SourceRepresentation.externalizeFileName(fullname) + extension); - } else { - String s = fullname.toString(); - int i = s.length(); - while (i > 0 && s.charAt(i - 1) != '.') i--; - return new File(s.substring(i) + extension); - } - } - - private void createPath(File f) { - try { - f.createNewFile(); - } catch (IOException ex) { - f.getParentFile().mkdirs(); - try { - f.createNewFile(); - } catch (IOException ex1) { - } - } - } - - public void writeFile(Name fullname) { - File outfile = outputFile(fullname, ".symbl"); - try { - createPath(outfile); - FileOutputStream out = new FileOutputStream(outfile); - out.write(bytes, 0, bp); - out.close(); - Global.instance.operation("wrote " + outfile); - } catch (IOException ex) { - System.err.println("error writing " + outfile); - } - } - /* ************************************************** * Phase 1: Build entry table ************************************************* */ diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java index de755fd7fd..07c30a60c4 100644 --- a/sources/scalac/symtab/classfile/UnPickle.java +++ b/sources/scalac/symtab/classfile/UnPickle.java @@ -35,7 +35,6 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { Global global; UnPickle(Symbol root, byte[] data, Name sourceName) { - assert !root.isInitialized(); global = Global.instance; if (root.isConstructor()) { this.classroot = root.primaryConstructorClass(); @@ -70,6 +69,8 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { if (global.debug) global.log("unpickled " + root + ":" + root.rawInfo());//debug if (!root.isInitialized()) throw new BadSignature(this, "it does not define " + root); + if (moduleroot.isModule() && !moduleroot.moduleClass().isInitialized()) + moduleroot.setInfo(Type.NoType); } Type setOwner(Type tp, Symbol owner) { |