New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
scala: error while loading Vector$1, class file ... is broken #7455
Comments
Imported From: https://issues.scala-lang.org/browse/SI-7455?orig=1
|
@retronym said: Could you also try to compile against JDK 1.6? |
Rick Mugridge (rickmugridge) said: I have compiled successfully against jdk1.6. But I need to uses jdk1.7 because I'm about to use Javafx and that's not compile-consistent across 6 and 7. |
@paulp said: |
Rick Mugridge (rickmugridge) said: Information:scala: [running phase inliner on 14 compilation units] (Note: in IntelliJ, I have 3 modules that are compiled.) |
Rick Mugridge (rickmugridge) said: It's odd, though, that the compiler is OK with jdk1.6. |
@paulp said:
|
@retronym said: scala> :javap -p javax.swing.tree.DefaultMutableTreeNode
Compiled from "DefaultMutableTreeNode.java"
public class javax.swing.tree.DefaultMutableTreeNode implements java.lang.Cloneable,javax.swing.tree.MutableTreeNode,java.io.Serializable {
...
protected java.util.Vector children;
...
}
scala> (new javax.swing.tree.DefaultMutableTreeNode { def foo = children }).foo
res1: java.util.Vector[_] = null |
@paulp said: // java6
class java.util.Vector$1 extends java.lang.Object implements java.util.Enumeration
// java7
class java.util.Vector$1 extends java.lang.Object implements java.util.Enumeration<E> And here's Mr. E: scala> classOf[java.util.Vector[_]].getGenericInterfaces.head
res0: java.lang.reflect.Type = java.util.List<E>
// or for that matter
scala> classOf[java.util.Vector[String]].getGenericInterfaces.head
res1: java.lang.reflect.Type = java.util.List<E> What is this all about? Why won't it infer (or even allow) Vector[String] ? scala> val v = new java.util.Vector[String]
v: java.util.Vector[_] = []
scala> val v: java.util.Vector[String] = new java.util.Vector[String]
<console>:7: error: type mismatch;
found : java.util.Vector[?0] where type ?0
required: java.util.Vector[String]
val v: java.util.Vector[String] = new java.util.Vector[String]
^ This has a weirdly familiar feel. You get one bite at the apple, then it's over. scala> val v: java.util.Vector[String] = new java.util.Vector[String](5)
v: java.util.Vector[String] = []
scala> val v: java.util.Vector[String] = new java.util.Vector[String](5)
<console>:7: error: type mismatch;
found : Int(5)
required: java.util.Collection[_ <: String]
val v: java.util.Vector[String] = new java.util.Vector[String](5)
^ |
@retronym said:
|
@paulp said: |
@paulp said: |
@paulp said: |
@paulp said: |
Joel Galenson (jgalenson) said: When I compile the attached file with scalac, it compiles correctly and runs. However, when I run "sbt compile" I get the following error: [error] error while loading JList$1, class file '/opt/oracle-jdk-bin-1.7.0.25/jre/lib/rt.jar(javax/swing/JList$1.class)' is broken I'm using Scala 2.10.2, Java 1.7.0.25, sbt 0.12.4 (with its default configuration, which tries to compile with Scala 2.9.2, although that doesn't seem to make a difference). |
@retronym said: |
@retronym said: |
@retronym said (edited on Jul 17, 2013 12:44:03 AM UTC):
I'll dig deeper. |
Joel Galenson (jgalenson) said: Note that I haven't tried this for the test case I attached here, so it could be something unrelated (although I doubt it). |
@retronym said: pool-4-thread-1@4427, prio=5, in group 'main', status: 'RUNNING'
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:771)
at scala.tools.nsc.symtab.classfile.ClassfileParser.processClassType$1(ClassfileParser.scala:708)
at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:728)
at scala.tools.nsc.symtab.classfile.ClassfileParser.scala$tools$nsc$symtab$classfile$ClassfileParser$$sigToType(ClassfileParser.scala:816)
at scala.tools.nsc.symtab.classfile.ClassfileParser.scala$tools$nsc$symtab$classfile$ClassfileParser$$parseAttribute$1(ClassfileParser.scala:837)
at scala.tools.nsc.symtab.classfile.ClassfileParser.parseAttributes(ClassfileParser.scala:1048)
at scala.tools.nsc.symtab.classfile.ClassfileParser.parseClass(ClassfileParser.scala:527)
at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:112)
at scala.tools.nsc.symtab.SymbolLoaders$ClassfileLoader.doComplete(SymbolLoaders.scala:255)
at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoaders.scala:189)
at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.load(SymbolLoaders.scala:205)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1567)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:2078)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:2077)
at scala.reflect.internal.Types$NoArgsTypeRef.normalizeImpl(Types.scala:2111)
at scala.reflect.internal.Types$TypeRef.normalize(Types.scala:2316)
at scala.reflect.internal.tpe.TypeMaps$ContainsCollector.traverse(TypeMaps.scala:959)
at scala.reflect.internal.tpe.TypeMaps$TypeTraverser.apply(TypeMaps.scala:301)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.applyToSymbolInfo(TypeMaps.scala:219)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.loop$1(TypeMaps.scala:228)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.noChangeToSymbols(TypeMaps.scala:230)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.mapOver(TypeMaps.scala:244)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.mapOver(TypeMaps.scala:129)
at scala.reflect.internal.tpe.TypeMaps$ContainsCollector.traverse(TypeMaps.scala:962)
at scala.reflect.internal.tpe.TypeMaps$TypeCollector.collect(TypeMaps.scala:313)
at scala.reflect.internal.Types$Type.contains(Types.scala:779)
at scala.reflect.internal.Types$$anonfun$32.apply(Types.scala:3674)
at scala.reflect.internal.Types$$anonfun$32.apply(Types.scala:3674)
at scala.collection.TraversableLike$$anonfun$filterImpl$1.apply(TraversableLike.scala:259)
at scala.collection.immutable.List.foreach(List.scala:302)
at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:258)
at scala.collection.TraversableLike$class.filter(TraversableLike.scala:270)
at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
at scala.reflect.internal.Types$class.existentialAbstraction(Types.scala:3674)
at scala.reflect.internal.SymbolTable.existentialAbstraction(SymbolTable.scala:14)
at scala.reflect.internal.Types$Type.asSeenFrom(Types.scala:672)
at scala.reflect.internal.Types$Type.computeMemberType(Types.scala:706)
at scala.reflect.internal.Symbols$MethodSymbol.typeAsMemberOf(Symbols.scala:2749)
at scala.reflect.internal.Types$Type.memberType(Types.scala:697)
at scala.reflect.internal.Types$Type.scala$reflect$internal$Types$Type$$findMembersInternal$1(Types.scala:1025)
at scala.reflect.internal.Types$Type.findMembers(Types.scala:1047)
at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:636)
at scala.reflect.internal.Types$Type.members(Types.scala:589)
at xsbt.API.xsbt$API$$mkStructure(API.scala:238)
at xsbt.API$$anonfun$structure$1.apply(API.scala:232)
at xsbt.API$$anonfun$structure$1.apply(API.scala:232)
at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:188)
at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:92)
at xsbt.API.structure(API.scala:232)
at xsbt.API.xsbt$API$$structure(API.scala:229)
at xsbt.API$$anonfun$xsbt$API$$mkClassLike$2.apply(API.scala:422)
at xsbt.API$$anonfun$xsbt$API$$mkClassLike$2.apply(API.scala:422)
at xsbt.Message$$anon$1.apply(Message.scala:8)
at xsbti.SafeLazy$$anonfun$apply$1.apply(SafeLazy.scala:8)
at xsbti.SafeLazy$Impl._t$lzycompute(SafeLazy.scala:20)
at xsbti.SafeLazy$Impl._t(SafeLazy.scala:18)
at xsbti.SafeLazy$Impl.get(SafeLazy.scala:24)
at xsbt.API$$anonfun$xsbt$API$$forceStructures$1.apply(API.scala:100)
at xsbt.API$$anonfun$xsbt$API$$forceStructures$1.apply(API.scala:100)
at scala.collection.immutable.List.foreach(List.scala:302)
at xsbt.API.xsbt$API$$forceStructures(API.scala:100)
at xsbt.API$ApiPhase.processScalaUnit(API.scala:48)
at xsbt.API$ApiPhase.processUnit(API.scala:38)
at xsbt.API$ApiPhase$$anonfun$run$1.apply(API.scala:34)
at xsbt.API$ApiPhase$$anonfun$run$1.apply(API.scala:34)
at scala.collection.Iterator$class.foreach(Iterator.scala:743)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
at xsbt.API$ApiPhase.run(API.scala:34) At the stack trace above, it is enumerating the members of the type: java.util.Vector[E]#Itr
with java.util.ListIterator[E] {
final private[package util] val this$0: java.util.Vector[_]
private[package util] def <init>(x$2: Int): Vector.this.ListItr
def hasPrevious(): Boolean
def nextIndex(): Int
def previousIndex(): Int
def previous(): E
def set(x$1: E): Unit
def add(x$1: E): Unit
} private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
// Racy but within spec, since modifications are checked
// within or after synchronization in next/previous
return cursor != elementCount;
}
public E next() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
}
}
public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
synchronized (Vector.this) {
checkForComodification();
Vector.this.remove(lastRet);
expectedModCount = modCount;
}
cursor = lastRet;
lastRet = -1;
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
} Decompiled: class java.util.Vector$Itr extends java.lang.Object implements java.util.Iterator{
int cursor;
int lastRet;
int expectedModCount;
final java.util.Vector this$0;
public boolean hasNext();
public java.lang.Object next();
public void remove();
final void checkForComodification();
java.util.Vector$Itr(java.util.Vector, java.util.Vector$1);
}
javap -classpath /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/rt.jar 'java.util.Vector$1'
Compiled from "Vector.java"
class java.util.Vector$1 extends java.lang.Object implements java.util.Enumeration{
int count;
final java.util.Vector this$0;
java.util.Vector$1(java.util.Vector);
public boolean hasMoreElements();
public java.lang.Object nextElement();
} For reasons unknown to me, That's considered to be part of the API by SBT. The type ref During classfile parsing, it encounters the signature: Ljava.lang.Object;Ljava.util.Enumeration<TE;>; We expect a type parameter named 'E'. None is available. Really strange. Is the bytecode for Vector* consistent? java.util.Vector$Itr(java.util.Vector, java.util.Vector$1);
Code:
Stack=2, Locals=3, Args_size=3
0: aload_0
1: aload_1
2: invokespecial #1; //Method "<init>":(Ljava/util/Vector;)V
5: return
LineNumberTable:
line 1120: 0
}
javap -classpath /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/rt.jar -p 'java.util.Vector'
Compiled from "Vector.java"
public class java.util.Vector extends java.util.AbstractList implements java.util.List,java.util.RandomAccess,java.lang.Cloneable,java.io.Serializable{
protected java.lang.Object[] elementData;
protected int elementCount;
protected int capacityIncrement;
private static final long serialVersionUID;
public java.util.Vector(int, int);
public java.util.Vector(int);
public java.util.Vector();
public java.util.Vector(java.util.Collection);
What constructor is being called? |
@retronym said: That branch is against master. I think I'll target this for 2.10.3 as well as it seems low risk / high reward. Will submit a PR in a day or two. |
@retronym said: |
@gkossakowski said: |
Samuel Halliday (fommil) said: The example ScalaList above fails to compile with Java 7 and scala 2.9.2 using the SBT 0.12.4 / zinc 0.2.5 compilers. Is there a workaround that allows Scala classes to extend JList? I have tried to create an intermediate Java class to do the extensions, but I get the same problem. We are unable to upgrade Scala due to third party dependencies on our binary releases. |
@retronym said: |
Samuel Halliday (fommil) said: |
@retronym said: From my pull-request comment:
Given our limited resources, we typically don't backport bug fixes to maintainance releases unless they are deemed showstoppers, or if it needed by a customer with a Typesafe support contract. PIng me at jason.zaugg@typesafe.com if the latter is a possibility for you. |
Samuel Halliday (fommil) said: |
@retronym said: public JList(final Vector<?> listData) { which triggers loading of You might have more luck by wrapping, rather than inheriting from JList. |
Samuel Halliday (fommil) said: |
scala: error while loading Vector$1, class file 'C:\Program Files\Java\jdk1.7.0_21\jre\lib\rt.jar(java/util/Vector$1.class)' is broken
(class java.util.NoSuchElementException/key not found: E)
I am not using scala-swing, but I am using Swing components directly. My code compiles OK in Scala 2.9.3. I don't know how to find any useful log information. I have 80,000 LOC so it will be extremely difficult to narrow down where the problem is.
The text was updated successfully, but these errors were encountered: