diff options
author | cnsun <cnsun@google.com> | 2017-06-09 23:15:35 +0200 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2017-06-12 11:22:19 +0200 |
commit | 221c2b686ebaec4f80355f2966d7e4f6f859a0e1 (patch) | |
tree | bd1f6542caa870fc379f52a8560161bd099dc839 /src/tools/android/java/com/google/devtools/build/android/desugar | |
parent | 68028317c1d3d831a24f90e2b25d1410ce045c54 (diff) |
Extract FieldInfo as a top-level class. In the following CL, I will use this
class in DefaultMethodClassFixer to fix the bug b/38255926
RELNOTES: n/a
PiperOrigin-RevId: 158561127
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/desugar')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/FieldInfo.java | 29 | ||||
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/HeaderClassLoader.java | 29 |
2 files changed, 45 insertions, 13 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/FieldInfo.java b/src/tools/android/java/com/google/devtools/build/android/desugar/FieldInfo.java new file mode 100644 index 0000000000..c281039f61 --- /dev/null +++ b/src/tools/android/java/com/google/devtools/build/android/desugar/FieldInfo.java @@ -0,0 +1,29 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.android.desugar; + +import com.google.auto.value.AutoValue; + +/** A value class to store the fields information. */ +@AutoValue +public abstract class FieldInfo { + + static FieldInfo create(String owner, String name, String desc) { + return new AutoValue_FieldInfo(owner, name, desc); + } + + public abstract String owner(); + public abstract String name(); + public abstract String desc(); +} diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/HeaderClassLoader.java b/src/tools/android/java/com/google/devtools/build/android/desugar/HeaderClassLoader.java index 1c7a92f8ce..5be41cfcf6 100644 --- a/src/tools/android/java/com/google/devtools/build/android/desugar/HeaderClassLoader.java +++ b/src/tools/android/java/com/google/devtools/build/android/desugar/HeaderClassLoader.java @@ -83,16 +83,29 @@ class HeaderClassLoader extends ClassLoader { private static class NonPrimitiveFieldCollector extends ClassVisitor { final ImmutableList.Builder<FieldInfo> declaredNonPrimitiveFields = ImmutableList.builder(); + private String internalName; public NonPrimitiveFieldCollector() { super(Opcodes.ASM5); } @Override + public void visit( + int version, + int access, + String name, + String signature, + String superName, + String[] interfaces) { + super.visit(version, access, name, signature, superName, interfaces); + this.internalName = name; + } + + @Override public FieldVisitor visitField( int access, String name, String desc, String signature, Object value) { if (isNonPrimitiveType(desc)) { - declaredNonPrimitiveFields.add(new FieldInfo(name, desc)); + declaredNonPrimitiveFields.add(FieldInfo.create(internalName, name, desc)); } return null; } @@ -103,15 +116,6 @@ class HeaderClassLoader extends ClassLoader { } } - private static final class FieldInfo { - final String name; - final String desc; - - private FieldInfo(String name, String desc) { - this.name = name; - this.desc = desc; - } - } /** * Class visitor that stubs in missing code attributes, and erases the body of the static @@ -169,14 +173,12 @@ class HeaderClassLoader extends ClassLoader { private static class InterfaceInitializerEraser extends MethodVisitor { private final MethodVisitor dest; - private final String internalName; private final ImmutableList<FieldInfo> interfaceFields; public InterfaceInitializerEraser( MethodVisitor mv, String internalName, ImmutableList<FieldInfo> interfaceFields) { super(Opcodes.ASM5); dest = mv; - this.internalName = internalName; this.interfaceFields = interfaceFields; } @@ -189,7 +191,8 @@ class HeaderClassLoader extends ClassLoader { public void visitEnd() { for (FieldInfo fieldInfo : interfaceFields) { dest.visitInsn(Opcodes.ACONST_NULL); - dest.visitFieldInsn(Opcodes.PUTSTATIC, internalName, fieldInfo.name, fieldInfo.desc); + dest.visitFieldInsn( + Opcodes.PUTSTATIC, fieldInfo.owner(), fieldInfo.name(), fieldInfo.desc()); } dest.visitInsn(Opcodes.RETURN); dest.visitMaxs(0, 0); |