From 705ad49f353d3f90d8b63625aca2c2035bacdbef Mon Sep 17 00:00:00 2001 From: Alex Light Date: Mon, 21 Sep 2015 11:36:30 -0700 Subject: Support directly invoking interface default methods With the Java 8 Language one is allowed to directly call default interface methods of interfaces one (directly) implements through the use of the super keyword. We support this behavior through the invoke-super opcode with the target being an interface. We add 3 tests for this behavior. Currently only supports slow-path interpreter. Invoke-super is currently extremely slow. Bug: 24618811 Change-Id: I7e06e17326f7dbae0116bd7dfefca151f0092bd2 --- .../util-src/generate_java.py | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 test/970-iface-super-resolution-generated/util-src/generate_java.py (limited to 'test/970-iface-super-resolution-generated/util-src/generate_java.py') diff --git a/test/970-iface-super-resolution-generated/util-src/generate_java.py b/test/970-iface-super-resolution-generated/util-src/generate_java.py new file mode 100755 index 0000000000..c12f10d790 --- /dev/null +++ b/test/970-iface-super-resolution-generated/util-src/generate_java.py @@ -0,0 +1,77 @@ +#!/usr/bin/python3 +# +# Copyright (C) 2015 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. + +""" +Generate java test files for test 966. +""" + +import generate_smali as base +import os +import sys +from pathlib import Path + +BUILD_TOP = os.getenv("ANDROID_BUILD_TOP") +if BUILD_TOP is None: + print("ANDROID_BUILD_TOP not set. Please run build/envsetup.sh", file=sys.stderr) + sys.exit(1) + +# Allow us to import mixins. +sys.path.append(str(Path(BUILD_TOP)/"art"/"test"/"utils"/"python")) + +import testgen.mixins as mixins + +class JavaConverter(mixins.DumpMixin, mixins.Named, mixins.JavaFileMixin): + """ + A class that can convert a SmaliFile to a JavaFile. + """ + def __init__(self, inner): + self.inner = inner + + def get_name(self): + return self.inner.get_name() + + def __str__(self): + out = "" + for line in str(self.inner).splitlines(keepends = True): + if line.startswith("#"): + out += line[1:] + return out + +def main(argv): + final_java_dir = Path(argv[1]) + if not final_java_dir.exists() or not final_java_dir.is_dir(): + print("{} is not a valid java dir".format(final_java_dir), file=sys.stderr) + sys.exit(1) + initial_java_dir = Path(argv[2]) + if not initial_java_dir.exists() or not initial_java_dir.is_dir(): + print("{} is not a valid java dir".format(initial_java_dir), file=sys.stderr) + sys.exit(1) + expected_txt = Path(argv[3]) + mainclass, all_files = base.create_all_test_files() + with expected_txt.open('w') as out: + print(mainclass.get_expected(), file=out) + for f in all_files: + if f.initial_build_different(): + JavaConverter(f).dump(final_java_dir) + JavaConverter(f.get_initial_build_version()).dump(initial_java_dir) + else: + JavaConverter(f).dump(initial_java_dir) + if isinstance(f, base.TestInterface): + JavaConverter(f).dump(final_java_dir) + + +if __name__ == '__main__': + main(sys.argv) -- cgit v1.2.3-59-g8ed1b