diff options
Diffstat (limited to 'test/121-modifiers/src-java')
-rw-r--r-- | test/121-modifiers/src-java/A.java | 23 | ||||
-rw-r--r-- | test/121-modifiers/src-java/Asm.java | 125 | ||||
-rw-r--r-- | test/121-modifiers/src-java/Inf.java | 21 | ||||
-rw-r--r-- | test/121-modifiers/src-java/NonInf.java | 72 |
4 files changed, 241 insertions, 0 deletions
diff --git a/test/121-modifiers/src-java/A.java b/test/121-modifiers/src-java/A.java new file mode 100644 index 0000000000..d97f6b3f89 --- /dev/null +++ b/test/121-modifiers/src-java/A.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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. + */ + +// These classes are to check the additional flags for inner classes. +class A { + private static class B { + } + protected static interface C { + } +} diff --git a/test/121-modifiers/src-java/Asm.java b/test/121-modifiers/src-java/Asm.java new file mode 100644 index 0000000000..f120622120 --- /dev/null +++ b/test/121-modifiers/src-java/Asm.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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. + */ + +import org.objectweb.asm.*; +import org.objectweb.asm.tree.*; +import java.io.*; +import java.util.*; + +public class Asm { + /* + + Overall class access flags: + + 0x0001 | // public + 0x0010 | // final + 0x0020 | // super + 0x0200 | // interface + 0x0400 | // abstract + 0x1000 | // synthetic + 0x2000 | // annotation + 0x4000 ; // enum + + */ + + public final static int INTERFACE_DEFINED_BITS = + 0x0001 | // public, may be set. + 0x0010 | // final, must not be set. + 0x0020 | // super, must not be set. + 0x0200 | // interface, must be set. + 0x0400 | // abstract, must be set. + 0x1000 | // synthetic, may be set. + 0x2000 | // annotation, may be set (annotation implies interface) + 0x4000 ; // enum, must not be set. + + public final static int CLASS_DEFINED_BITS = + 0x0001 | // public, may be set. + 0x0010 | // final, may be set. + 0x0020 | // super, may be set. + 0x0200 | // interface, must not be set. + 0x0400 | // abstract, may be set. + 0x1000 | // synthetic, may be set. + 0x2000 | // annotation, must not be set. + 0x4000 ; // enum, may be set. + + public final static int FIELD_DEFINED_BITS = + 0x0001 | // public + 0x0002 | // private + 0x0004 | // protected + 0x0008 | // static + 0x0010 | // final + 0x0040 | // volatile + 0x0080 | // transient + 0x1000 | // synthetic + 0x4000 ; // enum + + public final static int METHOD_DEFINED_BITS = + 0x0001 | // public + 0x0002 | // private + 0x0004 | // protected + 0x0008 | // static + 0x0010 | // final + 0x0020 | // synchronized + 0x0040 | // bridge + 0x0080 | // varargs + 0x0100 | // native + 0x0400 | // abstract + 0x0800 | // strictfp + 0x1000 ; // synthetic + + public static void main(String args[]) throws Exception { + modify("Inf"); + modify("NonInf"); + } + + private static void modify(String clazz) throws Exception { + ClassNode classNode = new ClassNode(); + ClassReader cr = new ClassReader(clazz); + cr.accept(classNode, 0); + + modify(classNode); + + ClassWriter cw = new ClassWriter(0); + classNode.accept(cw); + byte[] b = cw.toByteArray(); + OutputStream out = new FileOutputStream(clazz + ".out"); + out.write(b, 0, b.length); + out.close(); + } + + private static void modify(ClassNode classNode) throws Exception { + int classFlagsOr = 0xFFFF; + // Check whether classNode is an interface or class. + if ((classNode.access & Opcodes.ACC_INTERFACE) == 0) { + classFlagsOr ^= CLASS_DEFINED_BITS; + } else { + classFlagsOr ^= INTERFACE_DEFINED_BITS; + } + classNode.access |= classFlagsOr; + + // Fields. + int fieldFlagsOr = 0xFFFF ^ FIELD_DEFINED_BITS; + for (FieldNode fieldNode : (List<FieldNode>)classNode.fields) { + fieldNode.access |= fieldFlagsOr; + } + + // Methods. + int methodFlagsOr = 0xFFFF ^ METHOD_DEFINED_BITS; + for (MethodNode methodNode :(List<MethodNode>) classNode.methods) { + methodNode.access |= methodFlagsOr; + } + } +} diff --git a/test/121-modifiers/src-java/Inf.java b/test/121-modifiers/src-java/Inf.java new file mode 100644 index 0000000000..1dadae0e47 --- /dev/null +++ b/test/121-modifiers/src-java/Inf.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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. + */ + +public interface Inf { + + public final int I = 0; + +}
\ No newline at end of file diff --git a/test/121-modifiers/src-java/NonInf.java b/test/121-modifiers/src-java/NonInf.java new file mode 100644 index 0000000000..52e4882532 --- /dev/null +++ b/test/121-modifiers/src-java/NonInf.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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. + */ + +public abstract class NonInf { + + public int publicField; + private int privateField; + protected int protectedField; + static int staticField; + transient int transientField; + volatile int volatileField; + final int finalField; + + public NonInf() { + publicField = 0; + privateField = 1; + protectedField = 2; + staticField = 3; + transientField = 4; + volatileField = 5; + finalField = 6; + } + + public native void nativeMethod(); + + private int privateMethod() { + return 0; + } + + protected int protectedMethod() { + return 0; + } + + public int publicMethod() { + return 0; + } + + public abstract int abstractMethod(); + + public synchronized int synchronizedMethod() { + return 0; + } + + public static int staticMethod() { + return 0; + } + + public strictfp double strictfpMethod() { + return 0.0; + } + + public int varargsMethod(Object... args) { + return 0; + } + + public final int finalMethod() { + return 0; + } +}
\ No newline at end of file |