[Xamarin.Android.Tools.Bytecode] Ignore synthetic ctor params#1091
Merged
jonpryor merged 1 commit intodotnet:mainfrom Mar 30, 2023
Merged
[Xamarin.Android.Tools.Bytecode] Ignore synthetic ctor params#1091jonpryor merged 1 commit intodotnet:mainfrom
jonpryor merged 1 commit intodotnet:mainfrom
Conversation
Fixes: dotnet#1090 Attempting to parse [TensorFlow 1.13.1][0] with a Debug build of `class-parse` results in an assertion failure: % curl -o tensorflow-android-1.13.1.aar https://repo1.maven.org/maven2/org/tensorflow/tensorflow-android/1.13.1/tensorflow-android-1.13.1.aar % unzip tensorflow-android-1.13.1.aar classes.jar % dotnet bin/Debug-net7.0/class-parse.dll classes.jar Unexpected number of method parameters; expected 0, got 1 at Xamarin.Android.Tools.Bytecode.MethodInfo.UpdateParametersFromMethodParametersAttribute(ParameterInfo[] parameters) at Xamarin.Android.Tools.Bytecode.MethodInfo.GetParameters() at Xamarin.Android.Tools.Bytecode.XmlClassDeclarationBuilder.GetMethodParameters(MethodInfo method)+MoveNext() at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content) at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content) at Xamarin.Android.Tools.Bytecode.XmlClassDeclarationBuilder.GetMethod(String element, String name, MethodInfo method, String returns) at Xamarin.Android.Tools.Bytecode.XmlClassDeclarationBuilder.<GetConstructors>b__23_2(MethodInfo c) Note: this will only happen for Debug builds of `class-parse`, which we do not ship. Thus, this will only happen if you are using a local build of xamarin/Java.Interop. The assertion occurs when processing the constructor for `org/tensorflow/Session$Runner$Reference.class`, which is a non-static inner class: % unzip classes.jar 'org/tensorflow/Session$Runner$Reference.class' % dotnet bin/Debug-net7.0/class-parse.dll --dump 'org/tensorflow/Session$Runner$Reference.class' … Methods Count: 2 0: <init> (Lorg/tensorflow/Session$Runner;)V Public Code(60, Unknown[LineNumberTable](30), LocalVariableTableAttribute(LocalVariableTableEntry(Name='this', Descriptor='Lorg/tensorflow/Session$Runner$Reference;', StartPC=0, Index=0)), Xamarin.Android.Tools.Bytecode.StackMapTableAttribute) MethodParametersAttribute(MethodParameterInfo(Name='this$1', AccessFlags=Final, Synthetic)) Note the `MethodParameterInfo.AccessFlags` value for the parameter: `AccessFlags=Final, Synthetic`. This differs from the `Final, Mandated` value that is checked for by `MethodInfo.UpdateParametersFromMethodParametersAttribute()`: var OuterThis = MethodParameterAccessFlags.Final | MethodParameterAccessFlags.Mandated; // … while (startIndex < pinfo.Count && (pinfo [startIndex].AccessFlags & OuterThis) == OuterThis) { startIndex++; } Because the parameter is `Final, Synthetic` and not `Final, Mandated`, the parameter is *not* skipped, which results in the assertion message `expected 0, got 1`. @jonpryor does not know how or why `Final, Synthetic` is being used by `Session$Runner$Reference.class`, and is unable to reproduce this particular Java bytecode output with the JDK 1.8 and JDK 11 compilers. Update `MethodInfo.UpdateParametersFromMethodParametersAttribute()` to also skip `Final, Synthetic` parameters. This allows `Session$Runner$Reference.class` to be processed without assertions: % dotnet bin/Debug-net7.0/class-parse.dll classes.jar # no errors Additionally, update the assertion message so that it includes the declaring class name, method name, and method descriptor. [0]: https://mvnrepository.com/artifact/org.tensorflow/tensorflow-android/1.13.1
jpobst
approved these changes
Mar 30, 2023
jonpryor
pushed a commit
to dotnet/android
that referenced
this pull request
Mar 31, 2023
Fixes: dotnet/java-interop#1090 Changes: dotnet/java-interop@53bfb4a...0355acf * dotnet/java-interop@0355acf8: [Xamarin.Android.Tools.Bytecode] Ignore synthetic ctor params (dotnet/java-interop#1091) * dotnet/java-interop@909239d4: [generator] Add support for peerConstructorPartialMethod (dotnet/java-interop#1087) * dotnet/java-interop@8f3fe625: [generator] Fix an NRE when cloning a method with generic arguments (dotnet/java-interop#1089) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes: #1090
Attempting to parse TensorFlow 1.13.1 with a Debug build of
class-parseresults in an assertion failure:Note: this will only happen for Debug builds of
class-parse, which we do not ship. Thus, this will only happen if you are using a local build of xamarin/Java.Interop.The assertion occurs when processing the constructor for
org/tensorflow/Session$Runner$Reference.class, which is a non-static inner class:Note the
MethodParameterInfo.AccessFlagsvalue for the parameter:AccessFlags=Final, Synthetic. This differs from theFinal, Mandatedvalue that is checked for byMethodInfo.UpdateParametersFromMethodParametersAttribute():Because the parameter is
Final, Syntheticand notFinal, Mandated, the parameter is not skipped, which results in the assertion messageexpected 0, got 1.@jonpryor does not know how or why
Final, Syntheticis being used bySession$Runner$Reference.class, and is unable to reproduce this particular Java bytecode output with the JDK 1.8 and JDK 11 compilers.Update
MethodInfo.UpdateParametersFromMethodParametersAttribute()to also skipFinal, Syntheticparameters. This allowsSession$Runner$Reference.classto be processed without assertions:Additionally, update the assertion message so that it includes the declaring class name, method name, and method descriptor.