1 /* |
1 /* |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
3910 // check if this class overrides any final method |
3910 // check if this class overrides any final method |
3911 check_final_method_override(this_klass, CHECK_(nullHandle)); |
3911 check_final_method_override(this_klass, CHECK_(nullHandle)); |
3912 |
3912 |
3913 // check that if this class is an interface then it doesn't have static methods |
3913 // check that if this class is an interface then it doesn't have static methods |
3914 if (this_klass->is_interface()) { |
3914 if (this_klass->is_interface()) { |
3915 check_illegal_static_method(this_klass, CHECK_(nullHandle)); |
3915 /* An interface in a JAVA 8 classfile can be static */ |
|
3916 if (_major_version < JAVA_8_VERSION) { |
|
3917 check_illegal_static_method(this_klass, CHECK_(nullHandle)); |
|
3918 } |
3916 } |
3919 } |
3917 |
3920 |
3918 |
3921 |
3919 #ifdef ASSERT |
3922 #ifdef ASSERT |
3920 if (ParseAllGenericSignatures) { |
3923 if (ParseAllGenericSignatures) { |
4464 const bool is_native = (flags & JVM_ACC_NATIVE) != 0; |
4467 const bool is_native = (flags & JVM_ACC_NATIVE) != 0; |
4465 const bool is_abstract = (flags & JVM_ACC_ABSTRACT) != 0; |
4468 const bool is_abstract = (flags & JVM_ACC_ABSTRACT) != 0; |
4466 const bool is_bridge = (flags & JVM_ACC_BRIDGE) != 0; |
4469 const bool is_bridge = (flags & JVM_ACC_BRIDGE) != 0; |
4467 const bool is_strict = (flags & JVM_ACC_STRICT) != 0; |
4470 const bool is_strict = (flags & JVM_ACC_STRICT) != 0; |
4468 const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0; |
4471 const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0; |
|
4472 const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0; |
4469 const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; |
4473 const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; |
4470 const bool major_gte_8 = _major_version >= JAVA_8_VERSION; |
4474 const bool major_gte_8 = _major_version >= JAVA_8_VERSION; |
4471 const bool is_initializer = (name == vmSymbols::object_initializer_name()); |
4475 const bool is_initializer = (name == vmSymbols::object_initializer_name()); |
4472 |
4476 |
4473 bool is_illegal = false; |
4477 bool is_illegal = false; |
4474 |
4478 |
4475 if (is_interface) { |
4479 if (is_interface) { |
4476 if (!is_public || is_static || is_final || is_native || |
4480 if (major_gte_8) { |
4477 ((is_synchronized || is_strict) && major_gte_15 && |
4481 // Class file version is JAVA_8_VERSION or later Methods of |
4478 (!major_gte_8 || is_abstract)) || |
4482 // interfaces may set any of the flags except ACC_PROTECTED, |
4479 (!major_gte_8 && !is_abstract)) { |
4483 // ACC_FINAL, ACC_NATIVE, and ACC_SYNCHRONIZED; they must |
4480 is_illegal = true; |
4484 // have exactly one of the ACC_PUBLIC or ACC_PRIVATE flags set. |
|
4485 if ((is_public == is_private) || /* Only one of private and public should be true - XNOR */ |
|
4486 (is_native || is_protected || is_final || is_synchronized) || |
|
4487 // If a specific method of a class or interface has its |
|
4488 // ACC_ABSTRACT flag set, it must not have any of its |
|
4489 // ACC_FINAL, ACC_NATIVE, ACC_PRIVATE, ACC_STATIC, |
|
4490 // ACC_STRICT, or ACC_SYNCHRONIZED flags set. No need to |
|
4491 // check for ACC_FINAL, ACC_NATIVE or ACC_SYNCHRONIZED as |
|
4492 // those flags are illegal irrespective of ACC_ABSTRACT being set or not. |
|
4493 (is_abstract && (is_private || is_static || is_strict))) { |
|
4494 is_illegal = true; |
|
4495 } |
|
4496 } else if (major_gte_15) { |
|
4497 // Class file version in the interval [JAVA_1_5_VERSION, JAVA_8_VERSION) |
|
4498 if (!is_public || is_static || is_final || is_synchronized || |
|
4499 is_native || !is_abstract || is_strict) { |
|
4500 is_illegal = true; |
|
4501 } |
|
4502 } else { |
|
4503 // Class file version is pre-JAVA_1_5_VERSION |
|
4504 if (!is_public || is_static || is_final || is_native || !is_abstract) { |
|
4505 is_illegal = true; |
|
4506 } |
4481 } |
4507 } |
4482 } else { // not interface |
4508 } else { // not interface |
4483 if (is_initializer) { |
4509 if (is_initializer) { |
4484 if (is_static || is_final || is_synchronized || is_native || |
4510 if (is_static || is_final || is_synchronized || is_native || |
4485 is_abstract || (major_gte_15 && is_bridge)) { |
4511 is_abstract || (major_gte_15 && is_bridge)) { |