Skip to content

Commit

Permalink
8267350: Archived old interface extends interface with default method…
Browse files Browse the repository at this point in the history
… causes crash

Reviewed-by: iklam, minqi
  • Loading branch information
calvinccheung committed May 20, 2021
1 parent 005d8a7 commit 1c7a131
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/hotspot/share/oops/instanceKlass.cpp
Expand Up @@ -2370,7 +2370,11 @@ void InstanceKlass::metaspace_pointers_do(MetaspaceClosure* it) {
it->push(&_local_interfaces);
it->push(&_transitive_interfaces);
it->push(&_method_ordering);
it->push(&_default_vtable_indices);
if (!is_rewritten()) {
it->push(&_default_vtable_indices, MetaspaceClosure::_writable);
} else {
it->push(&_default_vtable_indices);
}
it->push(&_fields);

if (itable_length() > 0) {
Expand Down
80 changes: 80 additions & 0 deletions test/hotspot/jtreg/runtime/cds/appcds/OldInfExtendsInfDefMeth.java
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
/*
* @test
* @bug 8267350
* @summary CDS support of old classes with major version < JDK_6 (50) for static archive.
* Test an old interface extends another interface which has a default method.
* @requires vm.cds
* @library /test/lib
* @compile test-classes/InfDefMeth.java
* @compile test-classes/OldInfDefMeth.jasm
* @compile test-classes/OldInfDefMethImpl.java
* @compile test-classes/OldInfDefMethApp.java
* @run driver OldInfExtendsInfDefMeth
*/

import jdk.test.lib.cds.CDSTestUtils;
import jdk.test.lib.process.OutputAnalyzer;

public class OldInfExtendsInfDefMeth {
public static void main(String[] args) throws Exception {
String mainClass = "OldInfDefMethApp";
String namePrefix = "oldinfdefmeth";
String appClasses[] = TestCommon.list("InfDefMeth", "OldInfDefMeth", "OldInfDefMethImpl", mainClass);
JarBuilder.build(namePrefix, appClasses);
String appJar = TestCommon.getTestJar(namePrefix + ".jar");

boolean dynamicMode = CDSTestUtils.DYNAMIC_DUMP;

// create archive with class list
OutputAnalyzer output = TestCommon.dump(appJar, appClasses, "-Xlog:class+load,cds=debug,verification=trace");
TestCommon.checkExecReturn(output, 0,
dynamicMode ? true : false,
"Pre JDK 6 class not supported by CDS: 49.0 OldInfDefMeth");

// run with archive
TestCommon.run(
"-cp", appJar,
"-Xlog:class+load,cds=debug,verification=trace",
mainClass)
.assertNormalExit(out -> {
out.shouldContain("Verifying class OldInfDefMeth with old format")
.shouldContain("Verifying class OldInfDefMethImpl with new format");
if (!dynamicMode) {
out.shouldContain("InfDefMeth source: shared objects file")
.shouldContain("OldInfDefMeth source: shared objects file")
.shouldContain("OldInfDefMethImpl source: shared objects file");
} else {
// InfDefMeth has version >=50 so it should be loaded from the
// dynamic archive.
out.shouldContain("InfDefMeth source: shared objects file (top)")
// Old classes were already linked before dynamic dump happened,
// so they couldn't be archived.
.shouldMatch(".class.load.*OldInfDefMeth source:.*oldinfdefmeth.jar")
.shouldMatch(".class.load.*OldInfDefMethImpl source:.*oldinfdefmeth.jar");
}
});
}
}
26 changes: 26 additions & 0 deletions test/hotspot/jtreg/runtime/cds/appcds/test-classes/InfDefMeth.java
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
public interface InfDefMeth {
default public int size() { return 0;};
}
@@ -0,0 +1,30 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
public interface OldInfDefMeth
implements InfDefMeth
version 49:0
{
public abstract Method SayHello:"()Ljava/lang/String;";

} // end Class OldInfDefMeth
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
public class OldInfDefMethApp {
public static void main(String args[]) {
OldInfDefMethImpl o = new OldInfDefMethImpl();
System.out.println(o.SayHello());
}
}
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
public class OldInfDefMethImpl implements OldInfDefMeth {
public String SayHello() { return "Hello from OldInfDefMethImpl"; }
}

0 comments on commit 1c7a131

Please sign in to comment.