Ticket #254 (closed defect: fixed)

Opened 3 years ago

Last modified 3 years ago

IllegalArgumentException in StackMapFrame.addStackItem()

Reported by: stephan Owned by: stephan
Priority: major Milestone: OTDT_1.3.0_M3
Component: compiler Version: 1.3.0M2
Keywords: Cc:

Description

When working in compliance level 1.6, reconciling the role file CompletionAdaptor.CalloutCompletionProposal cause the following exception:

java.lang.IllegalArgumentException: info cannot be null
        at org.eclipse.jdt.internal.compiler.codegen.StackMapFrame.addStackItem(StackMapFrame.java:81)
        at org.eclipse.jdt.internal.compiler.ClassFile.traverse(ClassFile.java:7677)
        at org.eclipse.jdt.internal.compiler.ClassFile.completeCodeAttribute(ClassFile.java:1718)
        at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:456)
        at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:354)
        at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:997)
        at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:1099)
        at org.eclipse.jdt.internal.compiler.ast.AbstractQualifiedAllocationExpression.generateCode(AbstractQualifiedAllocationExpression.java:199)
        at org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression.generateCode(QualifiedAllocationExpression.java:109)
        at org.eclipse.jdt.internal.compiler.ast.ReturnStatement.generateCode(ReturnStatement.java:128)
        at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:436)
        at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:354)
        at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:997)
        at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:1129)
        at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.generateCode(CompilationUnitDeclaration.java:417)
        at org.objectteams.otdt.core.compiler.control.Dependencies.establishUnitState(Dependencies.java:353)
        at org.objectteams.otdt.core.compiler.control.Dependencies.ensureState(Dependencies.java:261)
        at org.objectteams.otdt.core.compiler.control.Dependencies.ensureState(Dependencies.java:216)
        at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:980)
        at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:1034)
        at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder._OT$process$orig(CompilationUnitProblemFinder.java:213)
        at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder._OT$process$chain(CompilationUnitProblemFinder.java:65533)
        at org.objectteams.otdt.compiler.adaptor.AdaptorActivator._OT$CompilationUnitProblemFinder$activateChecker$base(AdaptorActivator.java:65533)
        at org.objectteams.otdt.compiler.adaptor.AdaptorActivator.access$5(AdaptorActivator.java:1)
        at org.objectteams.otdt.compiler.adaptor.AdaptorActivator$__OT__CompilationUnitProblemFinder.activateChecker(AdaptorActivator.java:283)
        at org.objectteams.otdt.compiler.adaptor.AdaptorActivator._OT$CompilationUnitProblemFinder$activateChecker$process(AdaptorActivator.java:277)
        at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder._OT$process$chain(CompilationUnitProblemFinder.java:306)
        at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:65533)
        at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:274)
        at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:190)
        at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:89)
        at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:728)
        at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:788)
        at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1271)
        at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:126)
        at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.access$0(JavaReconcilingStrategy.java:108)
        at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:89)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
        at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:87)
        at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.initialReconcile(JavaReconcilingStrategy.java:178)
        at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.initialReconcile(CompositeReconcilingStrategy.java:114)
        at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.initialReconcile(JavaCompositeReconcilingStrategy.java:133)
        at org.eclipse.jface.text.reconciler.MonoReconciler.initialProcess(MonoReconciler.java:105)
        at org.eclipse.jdt.internal.ui.text.JavaReconciler.initialProcess(JavaReconciler.java:398)
        at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:173)

Change History

Changed 3 years ago by stephan

Analysis:

Flow analysis assumes that one value for maxFieldCount is passed down from the toplevel type to all (nested) contained types. Local variable positions that are used to store defInit bits are offset by this maxFieldCount.

When compiling a role file CUD it can happen that the maxFieldCount for the enclosing team is not determined when analyseCode starts, but some time later before finally generating code. In that case generateCode will use local variable indices with maxFieldCount offset, whereas defInit bits have been recorded without this offest.

This causes the pc-ranges for those locals to be computed wrongly, such that StackMapFrameCodeStream will not find the locals for some load instructions.

Changed 3 years ago by stephan

  • status changed from new to closed
  • resolution set to fixed

Reproduced and fixed in r21589.

Before analyseCode can start processing a role file it must

  • ensure outermost team has maxFieldCount updated (trigger resolving)
  • fetch the value for maxFieldCount from the team rather than the CUD toplevel type (role file!)
Note: See TracTickets for help on using tickets.