annotate src/share/vm/classfile/verifier.cpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 18fb7da42534
children 3a531d40ad93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
26 #include "classfile/classFileStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
27 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
28 #include "classfile/stackMapTable.hpp"
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
29 #include "classfile/stackMapFrame.hpp"
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
30 #include "classfile/stackMapTableFormat.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
31 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
32 #include "classfile/verifier.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
33 #include "classfile/vmSymbols.hpp"
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
34 #include "interpreter/bytecodes.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
35 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
36 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
37 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
38 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
39 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
40 #include "oops/typeArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
41 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
42 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
43 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
44 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
45 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
46 #include "runtime/orderAccess.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
47 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
48 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
49 # include "bytes_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
50 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
51 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
52 # include "bytes_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
53 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
54 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
55 # include "bytes_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1957
diff changeset
56 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
57 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
58 # include "bytes_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
59 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
60 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
61 # include "bytes_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
62 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63
1560
e40a3601bc1f 6911922: JVM must throw VerifyError for jsr or jsr_w opcodes in class file v.51+
kamg
parents: 1142
diff changeset
64 #define NOFAILOVER_MAJOR_VERSION 51
e40a3601bc1f 6911922: JVM must throw VerifyError for jsr or jsr_w opcodes in class file v.51+
kamg
parents: 1142
diff changeset
65
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // Access to external entry for VerifyClassCodes - old byte code verifier
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 typedef jboolean (*verify_byte_codes_fn_new_t)(JNIEnv *, jclass, char *, jint, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 static void* volatile _verify_byte_codes_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 static volatile jint _is_new_verify_byte_codes_fn = (jint) true;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static void* verify_byte_codes_fn() {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 if (_verify_byte_codes_fn == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void *lib_handle = os::native_java_library();
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
80 void *func = os::dll_lookup(lib_handle, "VerifyClassCodesForMajorVersion");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 if (func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 OrderAccess::release_store(&_is_new_verify_byte_codes_fn, false);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
84 func = os::dll_lookup(lib_handle, "VerifyClassCodes");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85 OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return (void*)_verify_byte_codes_fn;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Methods in Verifier
a61af66fc99e Initial load
duke
parents:
diff changeset
93
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
94 bool Verifier::should_verify_for(oop class_loader, bool should_verify_class) {
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
95 return (class_loader == NULL || !should_verify_class) ?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 BytecodeVerificationLocal : BytecodeVerificationRemote;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool Verifier::relax_verify_for(oop loader) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 bool need_verify =
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // verifyAll
a61af66fc99e Initial load
duke
parents:
diff changeset
103 (BytecodeVerificationLocal && BytecodeVerificationRemote) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // verifyRemote
a61af66fc99e Initial load
duke
parents:
diff changeset
105 (!BytecodeVerificationLocal && BytecodeVerificationRemote && !trusted);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 return !need_verify;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
109 bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, bool should_verify_class, TRAPS) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
110 HandleMark hm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
112
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
113 Symbol* exception_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114 const size_t message_buffer_len = klass->name()->utf8_length() + 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 char* message_buffer = NEW_RESOURCE_ARRAY(char, message_buffer_len);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
116 char* exception_message = message_buffer;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 const char* klassName = klass->external_name();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
119 bool can_failover = FailOverToOldVerifier &&
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
120 klass->major_version() < NOFAILOVER_MAJOR_VERSION;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // If the class should be verified, first see if we can use the split
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // verifier. If not, or if verification fails and FailOverToOldVerifier
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // is set, then call the inference verifier.
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
125 if (is_eligible_for_verification(klass, should_verify_class)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (TraceClassInitialization) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 tty->print_cr("Start class verification for: %s", klassName);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 if (UseSplitVerifier &&
a61af66fc99e Initial load
duke
parents:
diff changeset
130 klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
131 ClassVerifier split_verifier(klass, THREAD);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
132 split_verifier.verify_class(THREAD);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
133 exception_name = split_verifier.result();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
134 if (can_failover && !HAS_PENDING_EXCEPTION &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 (exception_name == vmSymbols::java_lang_VerifyError() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
136 exception_name == vmSymbols::java_lang_ClassFormatError())) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
137 if (TraceClassInitialization || VerboseVerification) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
139 "Fail over class verification to old verifier for: %s", klassName);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 exception_name = inference_verify(
a61af66fc99e Initial load
duke
parents:
diff changeset
142 klass, message_buffer, message_buffer_len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
144 if (exception_name != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
145 exception_message = split_verifier.exception_message();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
146 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 exception_name = inference_verify(
a61af66fc99e Initial load
duke
parents:
diff changeset
149 klass, message_buffer, message_buffer_len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
152 if (TraceClassInitialization || VerboseVerification) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 tty->print("Verification for %s has", klassName);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 tty->print_cr(" exception pending %s ",
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
156 InstanceKlass::cast(PENDING_EXCEPTION->klass())->external_name());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
157 } else if (exception_name != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
158 tty->print_cr("Verification for %s failed", klassName);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 tty->print_cr("End class verification for: %s", klassName);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 return false; // use the existing exception
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
166 } else if (exception_name == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167 return true; // verifcation succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
168 } else { // VerifyError or ClassFormatError to be created and thrown
a61af66fc99e Initial load
duke
parents:
diff changeset
169 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 instanceKlassHandle kls =
a61af66fc99e Initial load
duke
parents:
diff changeset
171 SystemDictionary::resolve_or_fail(exception_name, true, CHECK_false);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 while (!kls.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (kls == klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // If the class being verified is the exception we're creating
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // or one of it's superclasses, we're in trouble and are going
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // to infinitely recurse when we try to initialize the exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // So bail out here by throwing the preallocated VM error.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 THROW_OOP_(Universe::virtual_machine_error_instance(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 kls = kls->super();
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182 message_buffer[message_buffer_len - 1] = '\0'; // just to be sure
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
183 THROW_MSG_(exception_name, exception_message, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
187 bool Verifier::is_eligible_for_verification(instanceKlassHandle klass, bool should_verify_class) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
188 Symbol* name = klass->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
189 Klass* refl_magic_klass = SystemDictionary::reflect_MagicAccessorImpl_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
191 return (should_verify_for(klass->class_loader(), should_verify_class) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // return if the class is a bootstrapping class
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 844
diff changeset
193 // or defineClass specified not to verify by default (flags override passed arg)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // We need to skip the following four for bootstraping
a61af66fc99e Initial load
duke
parents:
diff changeset
195 name != vmSymbols::java_lang_Object() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
196 name != vmSymbols::java_lang_Class() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
197 name != vmSymbols::java_lang_String() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
198 name != vmSymbols::java_lang_Throwable() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Can not verify the bytecodes for shared classes because they have
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // already been rewritten to contain constant pool cache indices,
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // which the verifier can't understand.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // Shared classes shouldn't have stackmaps either.
a61af66fc99e Initial load
duke
parents:
diff changeset
204 !klass()->is_shared() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // As of the fix for 4486457 we disable verification for all of the
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // dynamically-generated bytecodes associated with the 1.4
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // reflection implementation, not just those associated with
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // sun/reflect/SerializationConstructorAccessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // NOTE: this is called too early in the bootstrapping process to be
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // guarded by Universe::is_gte_jdk14x_version()/UseNewReflection.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 (refl_magic_klass == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
213 !klass->is_subtype_of(refl_magic_klass) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
214 VerifyReflectionBytecodes)
a61af66fc99e Initial load
duke
parents:
diff changeset
215 );
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
218 Symbol* Verifier::inference_verify(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 instanceKlassHandle klass, char* message, size_t message_len, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 JavaThread* thread = (JavaThread*)THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 JNIEnv *env = thread->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void* verify_func = verify_byte_codes_fn();
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (verify_func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 jio_snprintf(message, message_len, "Could not link verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return vmSymbols::java_lang_VerifyError();
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 ResourceMark rm(THREAD);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
231 if (VerboseVerification) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 tty->print_cr("Verifying class %s with old format", klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 jclass cls = (jclass) JNIHandles::make_local(env, klass->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
236 jint result;
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // ThreadToNativeFromVM takes care of changing thread_state, so safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // code knows that we have left the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if (_is_new_verify_byte_codes_fn) {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 verify_byte_codes_fn_new_t func =
a61af66fc99e Initial load
duke
parents:
diff changeset
246 CAST_TO_FN_PTR(verify_byte_codes_fn_new_t, verify_func);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 result = (*func)(env, cls, message, (int)message_len,
a61af66fc99e Initial load
duke
parents:
diff changeset
248 klass->major_version());
a61af66fc99e Initial load
duke
parents:
diff changeset
249 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 verify_byte_codes_fn_t func =
a61af66fc99e Initial load
duke
parents:
diff changeset
251 CAST_TO_FN_PTR(verify_byte_codes_fn_t, verify_func);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 result = (*func)(env, cls, message, (int)message_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 JNIHandles::destroy_local(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // These numbers are chosen so that VerifyClassCodes interface doesn't need
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // to be changed (still return jboolean (unsigned char)), and result is
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // 1 when verification is passed.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if (result == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 return vmSymbols::java_lang_VerifyError();
a61af66fc99e Initial load
duke
parents:
diff changeset
263 } else if (result == 1) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
264 return NULL; // verified.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
265 } else if (result == 2) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
266 THROW_MSG_(vmSymbols::java_lang_OutOfMemoryError(), message, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 } else if (result == 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return vmSymbols::java_lang_ClassFormatError();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ShouldNotReachHere();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
271 return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
275 TypeOrigin TypeOrigin::null() {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
276 return TypeOrigin();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
277 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
278 TypeOrigin TypeOrigin::local(u2 index, StackMapFrame* frame) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
279 assert(frame != NULL, "Must have a frame");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
280 return TypeOrigin(CF_LOCALS, index, StackMapFrame::copy(frame),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
281 frame->local_at(index));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
282 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
283 TypeOrigin TypeOrigin::stack(u2 index, StackMapFrame* frame) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
284 assert(frame != NULL, "Must have a frame");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
285 return TypeOrigin(CF_STACK, index, StackMapFrame::copy(frame),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
286 frame->stack_at(index));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
287 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
288 TypeOrigin TypeOrigin::sm_local(u2 index, StackMapFrame* frame) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
289 assert(frame != NULL, "Must have a frame");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
290 return TypeOrigin(SM_LOCALS, index, StackMapFrame::copy(frame),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
291 frame->local_at(index));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
292 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
293 TypeOrigin TypeOrigin::sm_stack(u2 index, StackMapFrame* frame) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
294 assert(frame != NULL, "Must have a frame");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
295 return TypeOrigin(SM_STACK, index, StackMapFrame::copy(frame),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
296 frame->stack_at(index));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
297 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
298 TypeOrigin TypeOrigin::bad_index(u2 index) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
299 return TypeOrigin(BAD_INDEX, index, NULL, VerificationType::bogus_type());
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
300 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
301 TypeOrigin TypeOrigin::cp(u2 index, VerificationType vt) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
302 return TypeOrigin(CONST_POOL, index, NULL, vt);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
303 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
304 TypeOrigin TypeOrigin::signature(VerificationType vt) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
305 return TypeOrigin(SIG, 0, NULL, vt);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
306 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
307 TypeOrigin TypeOrigin::implicit(VerificationType t) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
308 return TypeOrigin(IMPLICIT, 0, NULL, t);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
309 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
310 TypeOrigin TypeOrigin::frame(StackMapFrame* frame) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
311 return TypeOrigin(FRAME_ONLY, 0, StackMapFrame::copy(frame),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
312 VerificationType::bogus_type());
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
313 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
314
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
315 void TypeOrigin::reset_frame() {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
316 if (_frame != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
317 _frame->restore();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
318 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
319 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
320
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
321 void TypeOrigin::details(outputStream* ss) const {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
322 _type.print_on(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
323 switch (_origin) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
324 case CF_LOCALS:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
325 ss->print(" (current frame, locals[%d])", _index);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
326 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
327 case CF_STACK:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
328 ss->print(" (current frame, stack[%d])", _index);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
329 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
330 case SM_LOCALS:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
331 ss->print(" (stack map, locals[%d])", _index);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
332 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
333 case SM_STACK:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
334 ss->print(" (stack map, stack[%d])", _index);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
335 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
336 case CONST_POOL:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
337 ss->print(" (constant pool %d)", _index);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
338 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
339 case SIG:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
340 ss->print(" (from method signature)");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
341 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
342 case IMPLICIT:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
343 case FRAME_ONLY:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
344 case NONE:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
345 default:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
346 ;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
347 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
348 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
349
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
350 #ifdef ASSERT
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
351 void TypeOrigin::print_on(outputStream* str) const {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
352 str->print("{%d,%d,%p:", _origin, _index, _frame);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
353 if (_frame != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
354 _frame->print_on(str);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
355 } else {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
356 str->print("null");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
357 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
358 str->print(",");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
359 _type.print_on(str);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
360 str->print("}");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
361 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
362 #endif
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
363
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
364 void ErrorContext::details(outputStream* ss, Method* method) const {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
365 if (is_valid()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
366 ss->print_cr("");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
367 ss->print_cr("Exception Details:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
368 location_details(ss, method);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
369 reason_details(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
370 frame_details(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
371 bytecode_details(ss, method);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
372 handler_details(ss, method);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
373 stackmap_details(ss, method);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
374 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
375 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
376
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
377 void ErrorContext::reason_details(outputStream* ss) const {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
378 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
379 ss->indent().print_cr("Reason:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
380 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
381 ss->indent().print("");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
382 switch (_fault) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
383 case INVALID_BYTECODE:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
384 ss->print("Error exists in the bytecode");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
385 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
386 case WRONG_TYPE:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
387 if (_expected.is_valid()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
388 ss->print("Type ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
389 _type.details(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
390 ss->print(" is not assignable to ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
391 _expected.details(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
392 } else {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
393 ss->print("Invalid type: ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
394 _type.details(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
395 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
396 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
397 case FLAGS_MISMATCH:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
398 if (_expected.is_valid()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
399 ss->print("Current frame's flags are not assignable "
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
400 "to stack map frame's.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
401 } else {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
402 ss->print("Current frame's flags are invalid in this context.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
403 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
404 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
405 case BAD_CP_INDEX:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
406 ss->print("Constant pool index %d is invalid", _type.index());
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
407 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
408 case BAD_LOCAL_INDEX:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
409 ss->print("Local index %d is invalid", _type.index());
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
410 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
411 case LOCALS_SIZE_MISMATCH:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
412 ss->print("Current frame's local size doesn't match stackmap.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
413 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
414 case STACK_SIZE_MISMATCH:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
415 ss->print("Current frame's stack size doesn't match stackmap.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
416 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
417 case STACK_OVERFLOW:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
418 ss->print("Exceeded max stack size.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
419 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
420 case STACK_UNDERFLOW:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
421 ss->print("Attempt to pop empty stack.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
422 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
423 case MISSING_STACKMAP:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
424 ss->print("Expected stackmap frame at this location.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
425 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
426 case BAD_STACKMAP:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
427 ss->print("Invalid stackmap specification.");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
428 break;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
429 case UNKNOWN:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
430 default:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
431 ShouldNotReachHere();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
432 ss->print_cr("Unknown");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
433 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
434 ss->print_cr("");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
435 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
436
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
437 void ErrorContext::location_details(outputStream* ss, Method* method) const {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
438 if (_bci != -1 && method != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
439 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
440 const char* bytecode_name = "<invalid>";
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
441 if (method->validate_bci_from_bcx(_bci) != -1) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
442 Bytecodes::Code code = Bytecodes::code_or_bp_at(method->bcp_from(_bci));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
443 if (Bytecodes::is_defined(code)) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
444 bytecode_name = Bytecodes::name(code);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
445 } else {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
446 bytecode_name = "<illegal>";
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
447 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
448 }
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
449 InstanceKlass* ik = method->method_holder();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
450 ss->indent().print_cr("Location:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
451 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
452 ss->indent().print_cr("%s.%s%s @%d: %s",
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
453 ik->name()->as_C_string(), method->name()->as_C_string(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
454 method->signature()->as_C_string(), _bci, bytecode_name);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
455 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
456 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
457
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
458 void ErrorContext::frame_details(outputStream* ss) const {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
459 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
460 if (_type.is_valid() && _type.frame() != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
461 ss->indent().print_cr("Current Frame:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
462 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
463 _type.frame()->print_on(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
464 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
465 if (_expected.is_valid() && _expected.frame() != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
466 ss->indent().print_cr("Stackmap Frame:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
467 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
468 _expected.frame()->print_on(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
469 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
470 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
471
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
472 void ErrorContext::bytecode_details(outputStream* ss, Method* method) const {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
473 if (method != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
474 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
475 ss->indent().print_cr("Bytecode:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
476 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
477 ss->print_data(method->code_base(), method->code_size(), false);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
478 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
479 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
480
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
481 void ErrorContext::handler_details(outputStream* ss, Method* method) const {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
482 if (method != NULL) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
483 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
484 ExceptionTable table(method);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
485 if (table.length() > 0) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
486 ss->indent().print_cr("Exception Handler Table:");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
487 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
488 for (int i = 0; i < table.length(); ++i) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
489 ss->indent().print_cr("bci [%d, %d] => handler: %d", table.start_pc(i),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
490 table.end_pc(i), table.handler_pc(i));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
491 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
492 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
493 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
494 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
495
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
496 void ErrorContext::stackmap_details(outputStream* ss, Method* method) const {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
497 if (method != NULL && method->has_stackmap_table()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
498 streamIndentor si(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
499 ss->indent().print_cr("Stackmap Table:");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
500 Array<u1>* data = method->stackmap_data();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
501 stack_map_table* sm_table =
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
502 stack_map_table::at((address)data->adr_at(0));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
503 stack_map_frame* sm_frame = sm_table->entries();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
504 streamIndentor si2(ss);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
505 int current_offset = -1;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
506 for (u2 i = 0; i < sm_table->number_of_entries(); ++i) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
507 ss->indent();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
508 sm_frame->print_on(ss, current_offset);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
509 ss->print_cr("");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
510 current_offset += sm_frame->offset_delta();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
511 sm_frame = sm_frame->next();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
512 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
513 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
514 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
515
0
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Methods in ClassVerifier
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 ClassVerifier::ClassVerifier(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
519 instanceKlassHandle klass, TRAPS)
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
520 : _thread(THREAD), _exception_type(NULL), _message(NULL), _klass(klass) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
521 _this_type = VerificationType::reference_type(klass->name());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
522 // Create list to hold symbols in reference area.
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
523 _symbols = new GrowableArray<Symbol*>(100, 0, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 ClassVerifier::~ClassVerifier() {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
527 // Decrement the reference count for any symbols created.
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
528 for (int i = 0; i < _symbols->length(); i++) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
529 Symbol* s = _symbols->at(i);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
530 s->decrement_refcount();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
531 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533
1955
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
534 VerificationType ClassVerifier::object_type() const {
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
535 return VerificationType::reference_type(vmSymbols::java_lang_Object());
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
536 }
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
537
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
538 TypeOrigin ClassVerifier::ref_ctx(const char* sig, TRAPS) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
539 VerificationType vt = VerificationType::reference_type(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
540 create_temporary_symbol(sig, (int)strlen(sig), THREAD));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
541 return TypeOrigin::implicit(vt);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
542 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
543
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 void ClassVerifier::verify_class(TRAPS) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
545 if (VerboseVerification) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 tty->print_cr("Verifying class %s with new format",
a61af66fc99e Initial load
duke
parents:
diff changeset
547 _klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
550 Array<Method*>* methods = _klass->methods();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 int num_methods = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 for (int index = 0; index < num_methods; index++) {
1570
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
554 // Check for recursive re-verification before each method.
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
555 if (was_recursively_verified()) return;
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
556
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
557 Method* m = methods->at(index);
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
558 if (m->is_native() || m->is_abstract() || m->is_overpass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // If m is native or abstract, skip it. It is checked in class file
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
560 // parser that methods do not override a final method. Overpass methods
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
561 // are trusted since the VM generates them.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
562 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 verify_method(methodHandle(THREAD, m), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
1570
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
566
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
567 if (VerboseVerification || TraceClassInitialization) {
1570
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
568 if (was_recursively_verified())
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
569 tty->print_cr("Recursive verification detected for: %s",
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
570 _klass->external_name());
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
571 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 void ClassVerifier::verify_method(methodHandle m, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
575 HandleMark hm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
576 _method = m; // initialize _method
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
577 if (VerboseVerification) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
578 tty->print_cr("Verifying method %s", m->name_and_sig_as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 const char* bad_type_msg = "Bad type on operand stack in %s";
a61af66fc99e Initial load
duke
parents:
diff changeset
582
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6214
diff changeset
583 int32_t max_stack = m->verifier_max_stack();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 int32_t max_locals = m->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 constantPoolHandle cp(THREAD, m->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (!SignatureVerifier::is_valid_method_signature(m->signature())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 class_format_error("Invalid method signature");
a61af66fc99e Initial load
duke
parents:
diff changeset
589 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Initial stack map frame: offset is 0, stack is initially empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
593 StackMapFrame current_frame(max_locals, max_stack, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Set initial locals
a61af66fc99e Initial load
duke
parents:
diff changeset
595 VerificationType return_type = current_frame.set_locals_from_arg(
a61af66fc99e Initial load
duke
parents:
diff changeset
596 m, current_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 int32_t stackmap_index = 0; // index to the stackmap array
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 u4 code_length = m->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // Scan the bytecode and map each instruction's start offset to a number.
a61af66fc99e Initial load
duke
parents:
diff changeset
603 char* code_data = generate_code_data(m, code_length, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 int ex_min = code_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 int ex_max = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // Look through each item on the exception table. Each of the fields must refer
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // to a legal instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
609 verify_exception_handler_table(
a61af66fc99e Initial load
duke
parents:
diff changeset
610 code_length, code_data, ex_min, ex_max, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Look through each entry on the local variable table and make sure
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // its range of code array offsets is valid. (4169817)
a61af66fc99e Initial load
duke
parents:
diff changeset
614 if (m->has_localvariable_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 verify_local_variable_table(code_length, code_data, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
618 Array<u1>* stackmap_data = m->stackmap_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619 StackMapStream stream(stackmap_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 StackMapReader reader(this, &stream, code_data, code_length, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 StackMapTable stackmap_table(&reader, &current_frame, max_locals, max_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
622 code_data, code_length, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
623
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
624 if (VerboseVerification) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
625 stackmap_table.print_on(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 RawBytecodeStream bcs(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // Scan the byte code linearly from the start to the end
a61af66fc99e Initial load
duke
parents:
diff changeset
631 bool no_control_flow = false; // Set to true when there is no direct control
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // flow from current instruction to the next
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // instruction in sequence
a61af66fc99e Initial load
duke
parents:
diff changeset
634 Bytecodes::Code opcode;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 while (!bcs.is_last_bytecode()) {
1570
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
636 // Check for recursive re-verification before each bytecode.
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
637 if (was_recursively_verified()) return;
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
638
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 opcode = bcs.raw_next();
a61af66fc99e Initial load
duke
parents:
diff changeset
640 u2 bci = bcs.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // Set current frame's offset to bci
a61af66fc99e Initial load
duke
parents:
diff changeset
643 current_frame.set_offset(bci);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
644 current_frame.set_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Make sure every offset in stackmap table point to the beginning to
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // an instruction. Match current_frame to stackmap_table entry with
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // the same offset if exists.
a61af66fc99e Initial load
duke
parents:
diff changeset
649 stackmap_index = verify_stackmap_table(
a61af66fc99e Initial load
duke
parents:
diff changeset
650 stackmap_index, bci, &current_frame, &stackmap_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
651 no_control_flow, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
652
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
653
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 bool this_uninit = false; // Set to true when invokespecial <init> initialized 'this'
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // Merge with the next instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
657 {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 u2 index;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 int target;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 VerificationType type, type2;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 VerificationType atype;
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 #ifndef PRODUCT
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
664 if (VerboseVerification) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
665 current_frame.print_on(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
666 tty->print_cr("offset = %d, opcode = %s", bci, Bytecodes::name(opcode));
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Make sure wide instruction is in correct format
a61af66fc99e Initial load
duke
parents:
diff changeset
671 if (bcs.is_wide()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 if (opcode != Bytecodes::_iinc && opcode != Bytecodes::_iload &&
a61af66fc99e Initial load
duke
parents:
diff changeset
673 opcode != Bytecodes::_aload && opcode != Bytecodes::_lload &&
a61af66fc99e Initial load
duke
parents:
diff changeset
674 opcode != Bytecodes::_istore && opcode != Bytecodes::_astore &&
a61af66fc99e Initial load
duke
parents:
diff changeset
675 opcode != Bytecodes::_lstore && opcode != Bytecodes::_fload &&
a61af66fc99e Initial load
duke
parents:
diff changeset
676 opcode != Bytecodes::_dload && opcode != Bytecodes::_fstore &&
a61af66fc99e Initial load
duke
parents:
diff changeset
677 opcode != Bytecodes::_dstore) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
678 /* Unreachable? RawBytecodeStream's raw_next() returns 'illegal'
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
679 * if we encounter a wide instruction that modifies an invalid
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
680 * opcode (not one of the ones listed above) */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
681 verify_error(ErrorContext::bad_code(bci), "Bad wide instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 switch (opcode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 case Bytecodes::_nop :
a61af66fc99e Initial load
duke
parents:
diff changeset
688 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 case Bytecodes::_aconst_null :
a61af66fc99e Initial load
duke
parents:
diff changeset
690 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
691 VerificationType::null_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
692 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 case Bytecodes::_iconst_m1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
694 case Bytecodes::_iconst_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case Bytecodes::_iconst_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
696 case Bytecodes::_iconst_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
697 case Bytecodes::_iconst_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
698 case Bytecodes::_iconst_4 :
a61af66fc99e Initial load
duke
parents:
diff changeset
699 case Bytecodes::_iconst_5 :
a61af66fc99e Initial load
duke
parents:
diff changeset
700 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
701 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
702 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
703 case Bytecodes::_lconst_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
704 case Bytecodes::_lconst_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
705 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
706 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
707 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
708 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 case Bytecodes::_fconst_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
710 case Bytecodes::_fconst_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
711 case Bytecodes::_fconst_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
712 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
713 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
714 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 case Bytecodes::_dconst_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
716 case Bytecodes::_dconst_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
717 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
718 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
719 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
720 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
721 case Bytecodes::_sipush :
a61af66fc99e Initial load
duke
parents:
diff changeset
722 case Bytecodes::_bipush :
a61af66fc99e Initial load
duke
parents:
diff changeset
723 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
724 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
725 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
726 case Bytecodes::_ldc :
a61af66fc99e Initial load
duke
parents:
diff changeset
727 verify_ldc(
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
728 opcode, bcs.get_index_u1(), &current_frame,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
729 cp, bci, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
730 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
731 case Bytecodes::_ldc_w :
a61af66fc99e Initial load
duke
parents:
diff changeset
732 case Bytecodes::_ldc2_w :
a61af66fc99e Initial load
duke
parents:
diff changeset
733 verify_ldc(
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
734 opcode, bcs.get_index_u2(), &current_frame,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 cp, bci, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
736 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 case Bytecodes::_iload :
a61af66fc99e Initial load
duke
parents:
diff changeset
738 verify_iload(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
739 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 case Bytecodes::_iload_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
741 case Bytecodes::_iload_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
742 case Bytecodes::_iload_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
743 case Bytecodes::_iload_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
744 index = opcode - Bytecodes::_iload_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
745 verify_iload(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
746 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 case Bytecodes::_lload :
a61af66fc99e Initial load
duke
parents:
diff changeset
748 verify_lload(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
749 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 case Bytecodes::_lload_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
751 case Bytecodes::_lload_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
752 case Bytecodes::_lload_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
753 case Bytecodes::_lload_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
754 index = opcode - Bytecodes::_lload_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
755 verify_lload(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
756 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 case Bytecodes::_fload :
a61af66fc99e Initial load
duke
parents:
diff changeset
758 verify_fload(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
759 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
760 case Bytecodes::_fload_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
761 case Bytecodes::_fload_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
762 case Bytecodes::_fload_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
763 case Bytecodes::_fload_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
764 index = opcode - Bytecodes::_fload_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 verify_fload(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
766 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 case Bytecodes::_dload :
a61af66fc99e Initial load
duke
parents:
diff changeset
768 verify_dload(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
769 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 case Bytecodes::_dload_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
771 case Bytecodes::_dload_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
772 case Bytecodes::_dload_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
773 case Bytecodes::_dload_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
774 index = opcode - Bytecodes::_dload_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 verify_dload(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
776 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 case Bytecodes::_aload :
a61af66fc99e Initial load
duke
parents:
diff changeset
778 verify_aload(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
779 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 case Bytecodes::_aload_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
781 case Bytecodes::_aload_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
782 case Bytecodes::_aload_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
783 case Bytecodes::_aload_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
784 index = opcode - Bytecodes::_aload_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 verify_aload(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
786 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
787 case Bytecodes::_iaload :
a61af66fc99e Initial load
duke
parents:
diff changeset
788 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
789 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
790 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
791 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if (!atype.is_int_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
793 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
794 current_frame.stack_top_ctx(), ref_ctx("[I", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
795 bad_type_msg, "iaload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
799 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
800 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
801 case Bytecodes::_baload :
a61af66fc99e Initial load
duke
parents:
diff changeset
802 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
803 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
804 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
805 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
806 if (!atype.is_bool_array() && !atype.is_byte_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
807 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
808 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
809 bad_type_msg, "baload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
813 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
814 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 case Bytecodes::_caload :
a61af66fc99e Initial load
duke
parents:
diff changeset
816 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
817 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
818 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
819 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
820 if (!atype.is_char_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
821 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
822 current_frame.stack_top_ctx(), ref_ctx("[C", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
823 bad_type_msg, "caload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
827 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
828 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 case Bytecodes::_saload :
a61af66fc99e Initial load
duke
parents:
diff changeset
830 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
831 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
832 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
833 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
834 if (!atype.is_short_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
835 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
836 current_frame.stack_top_ctx(), ref_ctx("[S", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
837 bad_type_msg, "saload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
838 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
841 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
842 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
843 case Bytecodes::_laload :
a61af66fc99e Initial load
duke
parents:
diff changeset
844 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
845 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
846 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
847 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if (!atype.is_long_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
849 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
850 current_frame.stack_top_ctx(), ref_ctx("[J", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
851 bad_type_msg, "laload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
855 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
856 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
857 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 case Bytecodes::_faload :
a61af66fc99e Initial load
duke
parents:
diff changeset
859 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
860 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
861 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
862 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
863 if (!atype.is_float_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
864 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
865 current_frame.stack_top_ctx(), ref_ctx("[F", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
866 bad_type_msg, "faload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
870 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
871 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 case Bytecodes::_daload :
a61af66fc99e Initial load
duke
parents:
diff changeset
873 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
874 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
875 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
876 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
877 if (!atype.is_double_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
878 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
879 current_frame.stack_top_ctx(), ref_ctx("[D", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
880 bad_type_msg, "daload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
881 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
884 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
885 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
886 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 case Bytecodes::_aaload : {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
889 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
890 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
891 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
892 if (!atype.is_reference_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
893 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
894 current_frame.stack_top_ctx(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
895 TypeOrigin::implicit(VerificationType::reference_check())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
896 bad_type_msg, "aaload");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 if (atype.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
901 VerificationType::null_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
902 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 VerificationType component =
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
904 atype.get_component(this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
905 current_frame.push_stack(component, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
907 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909 case Bytecodes::_istore :
a61af66fc99e Initial load
duke
parents:
diff changeset
910 verify_istore(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
911 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
912 case Bytecodes::_istore_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
913 case Bytecodes::_istore_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
914 case Bytecodes::_istore_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
915 case Bytecodes::_istore_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
916 index = opcode - Bytecodes::_istore_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
917 verify_istore(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
918 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
919 case Bytecodes::_lstore :
a61af66fc99e Initial load
duke
parents:
diff changeset
920 verify_lstore(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
921 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 case Bytecodes::_lstore_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
923 case Bytecodes::_lstore_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
924 case Bytecodes::_lstore_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
925 case Bytecodes::_lstore_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
926 index = opcode - Bytecodes::_lstore_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
927 verify_lstore(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
928 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
929 case Bytecodes::_fstore :
a61af66fc99e Initial load
duke
parents:
diff changeset
930 verify_fstore(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
931 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
932 case Bytecodes::_fstore_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
933 case Bytecodes::_fstore_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
934 case Bytecodes::_fstore_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
935 case Bytecodes::_fstore_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
936 index = opcode - Bytecodes::_fstore_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
937 verify_fstore(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
938 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
939 case Bytecodes::_dstore :
a61af66fc99e Initial load
duke
parents:
diff changeset
940 verify_dstore(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
941 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
942 case Bytecodes::_dstore_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
943 case Bytecodes::_dstore_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
944 case Bytecodes::_dstore_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
945 case Bytecodes::_dstore_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
946 index = opcode - Bytecodes::_dstore_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
947 verify_dstore(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
948 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
949 case Bytecodes::_astore :
a61af66fc99e Initial load
duke
parents:
diff changeset
950 verify_astore(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
951 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
952 case Bytecodes::_astore_0 :
a61af66fc99e Initial load
duke
parents:
diff changeset
953 case Bytecodes::_astore_1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
954 case Bytecodes::_astore_2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
955 case Bytecodes::_astore_3 :
a61af66fc99e Initial load
duke
parents:
diff changeset
956 index = opcode - Bytecodes::_astore_0;
a61af66fc99e Initial load
duke
parents:
diff changeset
957 verify_astore(index, &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
958 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
959 case Bytecodes::_iastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
960 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
961 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
962 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
963 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
964 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
965 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
966 if (!atype.is_int_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
967 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
968 current_frame.stack_top_ctx(), ref_ctx("[I", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
969 bad_type_msg, "iastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
970 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
972 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
973 case Bytecodes::_bastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
974 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
975 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
976 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
977 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
978 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
979 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
980 if (!atype.is_bool_array() && !atype.is_byte_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
981 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
982 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
983 bad_type_msg, "bastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
984 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
987 case Bytecodes::_castore :
a61af66fc99e Initial load
duke
parents:
diff changeset
988 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
989 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
990 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
991 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
992 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
993 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
994 if (!atype.is_char_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
995 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
996 current_frame.stack_top_ctx(), ref_ctx("[C", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
997 bad_type_msg, "castore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
998 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 case Bytecodes::_sastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 if (!atype.is_short_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1009 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1010 current_frame.stack_top_ctx(), ref_ctx("[S", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1011 bad_type_msg, "sastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 case Bytecodes::_lastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 if (!atype.is_long_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1024 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1025 current_frame.stack_top_ctx(), ref_ctx("[J", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1026 bad_type_msg, "lastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 case Bytecodes::_fastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 current_frame.pop_stack
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 (VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 if (!atype.is_float_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1038 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1039 current_frame.stack_top_ctx(), ref_ctx("[F", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1040 bad_type_msg, "fastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 case Bytecodes::_dastore :
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (!atype.is_double_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1053 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1054 current_frame.stack_top_ctx(), ref_ctx("[D", THREAD)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1055 bad_type_msg, "dastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 case Bytecodes::_aastore :
1955
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
1060 type = current_frame.pop_stack(object_type(), CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 atype = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // more type-checking is done at runtime
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 if (!atype.is_reference_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1067 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1068 current_frame.stack_top_ctx(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1069 TypeOrigin::implicit(VerificationType::reference_check())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1070 bad_type_msg, "aastore");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 // 4938384: relaxed constraint in JVMS 3nd edition.
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 case Bytecodes::_pop :
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 case Bytecodes::_pop2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 type = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (type.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 } else if (type.is_category2_2nd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 VerificationType::category2_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1088 /* Unreachable? Would need a category2_1st on TOS
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1089 * which does not appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1090 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1091 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1092 bad_type_msg, "pop2");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 case Bytecodes::_dup :
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 case Bytecodes::_dup_x1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 case Bytecodes::_dup_x2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 VerificationType type3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 type2 = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 if (type2.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 type3 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 } else if (type2.is_category2_2nd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 type3 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 VerificationType::category2_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1124 /* Unreachable? Would need a category2_1st at stack depth 2 with
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1125 * a category1 on TOS which does not appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1126 verify_error(ErrorContext::bad_type(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1127 bci, current_frame.stack_top_ctx()), bad_type_msg, "dup_x2");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 current_frame.push_stack(type3, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 case Bytecodes::_dup2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 type = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 if (type.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 } else if (type.is_category2_2nd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 VerificationType::category2_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1145 /* Unreachable? Would need a category2_1st on TOS which does not
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1146 * appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1147 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1148 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1149 bad_type_msg, "dup2");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 case Bytecodes::_dup2_x1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 VerificationType type3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 type = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 if (type.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 VerificationType::category1_check(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1164 } else if (type.is_category2_2nd()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1165 type2 = current_frame.pop_stack(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1166 VerificationType::category2_check(), CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1168 /* Unreachable? Would need a category2_1st on TOS which does
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1169 * not appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1170 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1171 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1172 bad_type_msg, "dup2_x1");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 type3 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 current_frame.push_stack(type3, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 case Bytecodes::_dup2_x2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 VerificationType type3, type4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 type = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 if (type.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 } else if (type.is_category2_2nd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 VerificationType::category2_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1195 /* Unreachable? Would need a category2_1st on TOS which does
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1196 * not appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1197 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1198 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1199 bad_type_msg, "dup2_x2");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 type3 = current_frame.pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 if (type3.is_category1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 type4 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 } else if (type3.is_category2_2nd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 type4 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 VerificationType::category2_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1210 /* Unreachable? Would need a category2_1st on TOS after popping
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1211 * a long/double or two category 1's, which does not
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1212 * appear possible. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1213 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1214 ErrorContext::bad_type(bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1215 bad_type_msg, "dup2_x2");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 current_frame.push_stack(type4, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 current_frame.push_stack(type3, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 case Bytecodes::_swap :
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 VerificationType::category1_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 current_frame.push_stack(type2, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 case Bytecodes::_iadd :
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 case Bytecodes::_isub :
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 case Bytecodes::_imul :
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 case Bytecodes::_idiv :
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 case Bytecodes::_irem :
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 case Bytecodes::_ishl :
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 case Bytecodes::_ishr :
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 case Bytecodes::_iushr :
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 case Bytecodes::_ior :
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 case Bytecodes::_ixor :
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 case Bytecodes::_iand :
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 case Bytecodes::_ineg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 case Bytecodes::_ladd :
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 case Bytecodes::_lsub :
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 case Bytecodes::_lmul :
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 case Bytecodes::_ldiv :
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 case Bytecodes::_lrem :
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 case Bytecodes::_land :
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 case Bytecodes::_lor :
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 case Bytecodes::_lxor :
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 case Bytecodes::_lneg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 case Bytecodes::_lshl :
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 case Bytecodes::_lshr :
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 case Bytecodes::_lushr :
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 case Bytecodes::_fadd :
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 case Bytecodes::_fsub :
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 case Bytecodes::_fmul :
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 case Bytecodes::_fdiv :
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 case Bytecodes::_frem :
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 case Bytecodes::_fneg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 case Bytecodes::_dadd :
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 case Bytecodes::_dsub :
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 case Bytecodes::_dmul :
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 case Bytecodes::_ddiv :
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 case Bytecodes::_drem :
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 case Bytecodes::_dneg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 case Bytecodes::_iinc :
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 verify_iinc(bcs.get_index(), &current_frame, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 case Bytecodes::_i2l :
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 case Bytecodes::_l2i :
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 case Bytecodes::_i2f :
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 case Bytecodes::_i2d :
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 case Bytecodes::_l2f :
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 case Bytecodes::_l2d :
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 case Bytecodes::_f2i :
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 case Bytecodes::_f2l :
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 case Bytecodes::_f2d :
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 case Bytecodes::_d2i :
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 case Bytecodes::_d2l :
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 current_frame.push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 case Bytecodes::_d2f :
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 case Bytecodes::_i2b :
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 case Bytecodes::_i2c :
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 case Bytecodes::_i2s :
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 case Bytecodes::_lcmp :
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 case Bytecodes::_fcmpl :
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 case Bytecodes::_fcmpg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 case Bytecodes::_dcmpl :
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 case Bytecodes::_dcmpg :
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 current_frame.pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 target = bcs.dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 stackmap_table.check_jump_target(
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 &current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 case Bytecodes::_if_acmpeq :
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 case Bytecodes::_if_acmpne :
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 case Bytecodes::_ifnull :
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 case Bytecodes::_ifnonnull :
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 target = bcs.dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 stackmap_table.check_jump_target
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 (&current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 case Bytecodes::_goto :
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 target = bcs.dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 stackmap_table.check_jump_target(
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 &current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 case Bytecodes::_goto_w :
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 target = bcs.dest_w();
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 stackmap_table.check_jump_target(
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 &current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 case Bytecodes::_tableswitch :
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 case Bytecodes::_lookupswitch :
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 verify_switch(
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 &bcs, code_length, code_data, &current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 &stackmap_table, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 case Bytecodes::_ireturn :
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 VerificationType::integer_type(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1495 verify_return_value(return_type, type, bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1496 &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 case Bytecodes::_lreturn :
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 VerificationType::long_type(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1503 verify_return_value(return_type, type, bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1504 &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 case Bytecodes::_freturn :
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 VerificationType::float_type(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1509 verify_return_value(return_type, type, bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1510 &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 case Bytecodes::_dreturn :
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 type2 = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 VerificationType::double_type(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1517 verify_return_value(return_type, type, bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1518 &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 case Bytecodes::_areturn :
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 VerificationType::reference_check(), CHECK_VERIFY(this));
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1523 verify_return_value(return_type, type, bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1524 &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 case Bytecodes::_return :
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 if (return_type != VerificationType::bogus_type()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1528 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1529 "Method expects a return value");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 // Make sure "this" has been initialized if current method is an
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // <init>
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 if (_method->name() == vmSymbols::object_initializer_name() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 current_frame.flag_this_uninit()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1536 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1537 "Constructor must call super() or this() "
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1538 "before return");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 case Bytecodes::_getstatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 case Bytecodes::_putstatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 case Bytecodes::_getfield :
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 case Bytecodes::_putfield :
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 verify_field_instructions(
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 &bcs, &current_frame, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 case Bytecodes::_invokevirtual :
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 case Bytecodes::_invokespecial :
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 case Bytecodes::_invokestatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 verify_invoke_instructions(
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 &bcs, code_length, &current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 &this_uninit, return_type, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 case Bytecodes::_invokeinterface :
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
1557 case Bytecodes::_invokedynamic :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 verify_invoke_instructions(
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 &bcs, code_length, &current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 &this_uninit, return_type, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 case Bytecodes::_new :
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
1564 index = bcs.get_index_u2();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1565 verify_cp_class_type(bci, index, cp, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 VerificationType new_class_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 cp_index_to_type(index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 if (!new_class_type.is_object()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1569 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1570 TypeOrigin::cp(index, new_class_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1571 "Illegal new instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 type = VerificationType::uninitialized_type(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 case Bytecodes::_newarray :
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 type = get_newarray_type(bcs.get_index(), bci, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 current_frame.push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 case Bytecodes::_anewarray :
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 verify_anewarray(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1586 bci, bcs.get_index_u2(), cp, &current_frame, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 case Bytecodes::_arraylength :
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 type = current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 VerificationType::reference_check(), CHECK_VERIFY(this));
134
8a79f7ec8f5d 6692246: Regression : JDK 6u4 b01 fails two JCK tests when fallback is switched off
kamg
parents: 0
diff changeset
1591 if (!(type.is_null() || type.is_array())) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1592 verify_error(ErrorContext::bad_type(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1593 bci, current_frame.stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1594 bad_type_msg, "arraylength");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 case Bytecodes::_checkcast :
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
1601 index = bcs.get_index_u2();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1602 verify_cp_class_type(bci, index, cp, CHECK_VERIFY(this));
1955
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
1603 current_frame.pop_stack(object_type(), CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 VerificationType klass_type = cp_index_to_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 current_frame.push_stack(klass_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 case Bytecodes::_instanceof : {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
1610 index = bcs.get_index_u2();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1611 verify_cp_class_type(bci, index, cp, CHECK_VERIFY(this));
1955
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
1612 current_frame.pop_stack(object_type(), CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 current_frame.push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 case Bytecodes::_monitorenter :
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 case Bytecodes::_monitorexit :
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 case Bytecodes::_multianewarray :
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
1624 index = bcs.get_index_u2();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 u2 dim = *(bcs.bcp()+3);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1626 verify_cp_class_type(bci, index, cp, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 VerificationType new_array_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 cp_index_to_type(index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 if (!new_array_type.is_array()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1630 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1631 TypeOrigin::cp(index, new_array_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1632 "Illegal constant pool index in multianewarray instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 if (dim < 1 || new_array_type.dimensions() < dim) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1636 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1637 "Illegal dimension in multianewarray instruction: %d", dim);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 for (int i = 0; i < dim; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 current_frame.pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 current_frame.push_stack(new_array_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 no_control_flow = false; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 case Bytecodes::_athrow :
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 type = VerificationType::reference_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 vmSymbols::java_lang_Throwable());
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 current_frame.pop_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 no_control_flow = true; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 // We only need to check the valid bytecodes in class file.
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 // And jsr and ret are not in the new class file format in JDK1.5.
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1655 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1656 "Bad instruction: %02x", opcode);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 no_control_flow = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 } // end switch
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 } // end Merge with the next instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
1661
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 // Look for possible jump target in exception handlers and see if it
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 // matches current_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 if (bci >= ex_min && bci < ex_max) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 verify_exception_handler_targets(
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 bci, this_uninit, &current_frame, &stackmap_table, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 } // end while
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 // Make sure that control flow does not fall through end of the method
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 if (!no_control_flow) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1672 verify_error(ErrorContext::bad_code(code_length),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1673 "Control flow falls through code end");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1677
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 char* ClassVerifier::generate_code_data(methodHandle m, u4 code_length, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 char* code_data = NEW_RESOURCE_ARRAY(char, code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 memset(code_data, 0, sizeof(char) * code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 RawBytecodeStream bcs(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1682
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 while (!bcs.is_last_bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 if (bcs.raw_next() != Bytecodes::_illegal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 int bci = bcs.bci();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
1686 if (bcs.raw_code() == Bytecodes::_new) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 code_data[bci] = NEW_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 code_data[bci] = BYTECODE_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1692 verify_error(ErrorContext::bad_code(bcs.bci()), "Bad instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1696
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 return code_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 void ClassVerifier::verify_exception_handler_table(u4 code_length, char* code_data, int& min, int& max, TRAPS) {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1701 ExceptionTable exhandlers(_method());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1702 int exlength = exhandlers.length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 constantPoolHandle cp (THREAD, _method->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1704
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1705 for(int i = 0; i < exlength; i++) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1706 //reacquire the table in case a GC happened
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1707 ExceptionTable exhandlers(_method());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1708 u2 start_pc = exhandlers.start_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1709 u2 end_pc = exhandlers.end_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1710 u2 handler_pc = exhandlers.handler_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1711 if (start_pc >= code_length || code_data[start_pc] == 0) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1712 class_format_error("Illegal exception table start_pc %d", start_pc);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1713 return;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1714 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1715 if (end_pc != code_length) { // special case: end_pc == code_length
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1716 if (end_pc > code_length || code_data[end_pc] == 0) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1717 class_format_error("Illegal exception table end_pc %d", end_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 }
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1720 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1721 if (handler_pc >= code_length || code_data[handler_pc] == 0) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1722 class_format_error("Illegal exception table handler_pc %d", handler_pc);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1723 return;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1724 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1725 int catch_type_index = exhandlers.catch_type_index(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1726 if (catch_type_index != 0) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1727 VerificationType catch_type = cp_index_to_type(
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1728 catch_type_index, cp, CHECK_VERIFY(this));
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1729 VerificationType throwable =
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1730 VerificationType::reference_type(vmSymbols::java_lang_Throwable());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1731 bool is_subclass = throwable.is_assignable_from(
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1732 catch_type, this, CHECK_VERIFY(this));
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1733 if (!is_subclass) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1734 // 4286534: should throw VerifyError according to recent spec change
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1735 verify_error(ErrorContext::bad_type(handler_pc,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1736 TypeOrigin::cp(catch_type_index, catch_type),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1737 TypeOrigin::implicit(throwable)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1738 "Catch type is not a subclass "
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1739 "of Throwable in exception handler %d", handler_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 }
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1743 if (start_pc < min) min = start_pc;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1744 if (end_pc > max) max = end_pc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1747
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 void ClassVerifier::verify_local_variable_table(u4 code_length, char* code_data, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 int localvariable_table_length = _method()->localvariable_table_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 if (localvariable_table_length > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 LocalVariableTableElement* table = _method()->localvariable_table_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 for (int i = 0; i < localvariable_table_length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 u2 start_bci = table[i].start_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 u2 length = table[i].length;
a61af66fc99e Initial load
duke
parents:
diff changeset
1755
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 if (start_bci >= code_length || code_data[start_bci] == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 class_format_error(
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 "Illegal local variable table start_pc %d", start_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 u4 end_bci = (u4)(start_bci + length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 if (end_bci != code_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 if (end_bci >= code_length || code_data[end_bci] == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 class_format_error( "Illegal local variable table length %d", length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1771
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 u2 ClassVerifier::verify_stackmap_table(u2 stackmap_index, u2 bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 StackMapFrame* current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 StackMapTable* stackmap_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 bool no_control_flow, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 if (stackmap_index < stackmap_table->get_frame_count()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 u2 this_offset = stackmap_table->get_offset(stackmap_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 if (no_control_flow && this_offset > bci) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1779 verify_error(ErrorContext::missing_stackmap(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1780 "Expecting a stack map frame");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 if (this_offset == bci) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1784 ErrorContext ctx;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 // See if current stack map can be assigned to the frame in table.
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 // current_frame is the stackmap frame got from the last instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 // If matched, current_frame will be updated by this method.
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1788 bool matches = stackmap_table->match_stackmap(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 current_frame, this_offset, stackmap_index,
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1790 !no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1791 if (!matches) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 // report type error
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1793 verify_error(ctx, "Instruction type does not match stack map");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 stackmap_index++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 } else if (this_offset < bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 // current_offset should have met this_offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 class_format_error("Bad stack map offset %d", this_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 } else if (no_control_flow) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1803 verify_error(ErrorContext::bad_code(bci), "Expecting a stack map frame");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 return stackmap_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1808
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, StackMapFrame* current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 StackMapTable* stackmap_table, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 constantPoolHandle cp (THREAD, _method->constants());
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1812 ExceptionTable exhandlers(_method());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1813 int exlength = exhandlers.length();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1814 for(int i = 0; i < exlength; i++) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1815 //reacquire the table in case a GC happened
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1816 ExceptionTable exhandlers(_method());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1817 u2 start_pc = exhandlers.start_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1818 u2 end_pc = exhandlers.end_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1819 u2 handler_pc = exhandlers.handler_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1820 int catch_type_index = exhandlers.catch_type_index(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1821 if(bci >= start_pc && bci < end_pc) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1822 u1 flags = current_frame->flags();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1823 if (this_uninit) { flags |= FLAG_THIS_UNINIT; }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1824 StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1825 if (catch_type_index != 0) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1826 // We know that this index refers to a subclass of Throwable
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1827 VerificationType catch_type = cp_index_to_type(
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1828 catch_type_index, cp, CHECK_VERIFY(this));
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1829 new_frame->push_stack(catch_type, CHECK_VERIFY(this));
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1830 } else {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1831 VerificationType throwable =
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1832 VerificationType::reference_type(vmSymbols::java_lang_Throwable());
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1833 new_frame->push_stack(throwable, CHECK_VERIFY(this));
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1834 }
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1835 ErrorContext ctx;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1836 bool matches = stackmap_table->match_stackmap(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1837 new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this));
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1838 if (!matches) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1839 verify_error(ctx, "Stack map does not match the one at "
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1840 "exception handler %d", handler_pc);
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6118
diff changeset
1841 return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1847 void ClassVerifier::verify_cp_index(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1848 u2 bci, constantPoolHandle cp, int index, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 int nconstants = cp->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 if ((index <= 0) || (index >= nconstants)) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1851 verify_error(ErrorContext::bad_cp_index(bci, index),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1852 "Illegal constant pool index %d in class %s",
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
1853 index, cp->pool_holder()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1857
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 void ClassVerifier::verify_cp_type(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1859 u2 bci, int index, constantPoolHandle cp, unsigned int types, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1860
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 // In some situations, bytecode rewriting may occur while we're verifying.
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 // In this case, a constant pool cache exists and some indices refer to that
1570
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
1863 // instead. Be sure we don't pick up such indices by accident.
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
1864 // We must check was_recursively_verified() before we get here.
de91a2f25c7e 6956164: nightly regressions from 6939207
jrose
parents: 1565
diff changeset
1865 guarantee(cp->cache() == NULL, "not rewritten yet");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1866
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1867 verify_cp_index(bci, cp, index, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 unsigned int tag = cp->tag_at(index).value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 if ((types & (1 << tag)) == 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1870 verify_error(ErrorContext::bad_cp_index(bci, index),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 "Illegal type at constant pool entry %d in class %s",
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
1872 index, cp->pool_holder()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1876
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 void ClassVerifier::verify_cp_class_type(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1878 u2 bci, int index, constantPoolHandle cp, TRAPS) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1879 verify_cp_index(bci, cp, index, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1882 verify_error(ErrorContext::bad_cp_index(bci, index),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1883 "Illegal type at constant pool entry %d in class %s",
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
1884 index, cp->pool_holder()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1888
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1889 void ClassVerifier::verify_error(ErrorContext ctx, const char* msg, ...) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1890 stringStream ss;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1891
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1892 ctx.reset_frames();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 _exception_type = vmSymbols::java_lang_VerifyError();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1894 _error_context = ctx;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 va_list va;
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1896 va_start(va, msg);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1897 ss.vprint(msg, va);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 va_end(va);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1899 _message = ss.as_string();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1900 #ifdef ASSERT
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1901 ResourceMark rm;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1902 const char* exception_name = _exception_type->as_C_string();
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1903 Exceptions::debug_check_abort(exception_name, NULL);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1904 #endif // ndef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1906
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 void ClassVerifier::class_format_error(const char* msg, ...) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1908 stringStream ss;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 _exception_type = vmSymbols::java_lang_ClassFormatError();
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 va_list va;
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 va_start(va, msg);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1912 ss.vprint(msg, va);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 va_end(va);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1914 if (!_method.is_null()) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1915 ss.print(" in method %s", _method->name_and_sig_as_C_string());
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1916 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1917 _message = ss.as_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1919
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1920 Klass* ClassVerifier::load_class(Symbol* name, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // Get current loader and protection domain first.
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 oop loader = current_class()->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 oop protection_domain = current_class()->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
1924
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 return SystemDictionary::resolve_or_fail(
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 name, Handle(THREAD, loader), Handle(THREAD, protection_domain),
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1929
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 bool ClassVerifier::is_protected_access(instanceKlassHandle this_class,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1931 Klass* target_class,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
1932 Symbol* field_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
1933 Symbol* field_sig,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 bool is_method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 No_Safepoint_Verifier nosafepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
1936
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 // If target class isn't a super class of this class, we don't worry about this case
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 if (!this_class->is_subclass_of(target_class)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 // Check if the specified method or field is protected
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1942 InstanceKlass* target_instance = InstanceKlass::cast(target_class);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 if (is_method) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1945 Method* m = target_instance->uncached_lookup_method(field_name, field_sig);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 if (m != NULL && m->is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 if (!this_class->is_same_class_package(m->method_holder())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1952 Klass* member_klass = target_instance->find_field(field_name, field_sig, &fd);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1953 if (member_klass != NULL && fd.is_protected()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 if (!this_class->is_same_class_package(member_klass)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1961
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 void ClassVerifier::verify_ldc(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1963 int opcode, u2 index, StackMapFrame* current_frame,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1964 constantPoolHandle cp, u2 bci, TRAPS) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1965 verify_cp_index(bci, cp, index, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 unsigned int types;
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 if (opcode == Bytecodes::_ldc || opcode == Bytecodes::_ldc_w) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1969 if (!tag.is_unresolved_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 types = (1 << JVM_CONSTANT_Integer) | (1 << JVM_CONSTANT_Float)
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
1971 | (1 << JVM_CONSTANT_String) | (1 << JVM_CONSTANT_Class)
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
1972 | (1 << JVM_CONSTANT_MethodHandle) | (1 << JVM_CONSTANT_MethodType);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
1973 // Note: The class file parser already verified the legality of
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
1974 // MethodHandle and MethodType constants.
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1975 verify_cp_type(bci, index, cp, types, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 assert(opcode == Bytecodes::_ldc2_w, "must be ldc2_w");
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 types = (1 << JVM_CONSTANT_Double) | (1 << JVM_CONSTANT_Long);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
1980 verify_cp_type(bci, index, cp, types, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 }
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1982 if (tag.is_string() && cp->is_pseudo_string_at(index)) {
1955
1070423b51f3 6865028: Illegal instructions passing verification prior to 'invokespecial Object.<init>'
kamg
parents: 1678
diff changeset
1983 current_frame->push_stack(object_type(), CHECK_VERIFY(this));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
1984 } else if (tag.is_string()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 VerificationType::reference_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 vmSymbols::java_lang_String()), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 } else if (tag.is_klass() || tag.is_unresolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 VerificationType::reference_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 vmSymbols::java_lang_Class()), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 } else if (tag.is_int()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 } else if (tag.is_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 } else if (tag.is_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 current_frame->push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 } else if (tag.is_long()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 current_frame->push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 VerificationType::long2_type(), CHECK_VERIFY(this));
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2006 } else if (tag.is_method_handle()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2007 current_frame->push_stack(
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2008 VerificationType::reference_type(
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
2009 vmSymbols::java_lang_invoke_MethodHandle()), CHECK_VERIFY(this));
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2010 } else if (tag.is_method_type()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2011 current_frame->push_stack(
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2012 VerificationType::reference_type(
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
2013 vmSymbols::java_lang_invoke_MethodType()), CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2015 /* Unreachable? verify_cp_type has already validated the cp type. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2016 verify_error(
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2017 ErrorContext::bad_cp_index(bci, index), "Invalid index in ldc");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 void ClassVerifier::verify_switch(
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 RawBytecodeStream* bcs, u4 code_length, char* code_data,
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 int bci = bcs->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 address bcp = bcs->bcp();
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 address aligned_bcp = (address) round_to((intptr_t)(bcp + 1), jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 // 4639449 & 4647081: padding bytes must be 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 u2 padding_offset = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 while ((bcp + padding_offset) < aligned_bcp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 if(*(bcp + padding_offset) != 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2033 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2034 "Nonzero padding byte in lookswitch or tableswitch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 padding_offset++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 int default_offset = (int) Bytes::get_Java_u4(aligned_bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 int keys, delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 VerificationType::integer_type(), CHECK_VERIFY(this));
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2043 if (bcs->raw_code() == Bytecodes::_tableswitch) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 jint low = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 jint high = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 if (low > high) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2047 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2048 "low must be less than or equal to high in tableswitch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 keys = high - low + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 if (keys < 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2053 verify_error(ErrorContext::bad_code(bci), "too many keys in tableswitch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 delta = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 keys = (int)Bytes::get_Java_u4(aligned_bcp + jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 if (keys < 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2060 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2061 "number of keys in lookupswitch less than 0");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 delta = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // Make sure that the lookupswitch items are sorted
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 for (int i = 0; i < (keys - 1); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 jint this_key = Bytes::get_Java_u4(aligned_bcp + (2+2*i)*jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 jint next_key = Bytes::get_Java_u4(aligned_bcp + (2+2*i+2)*jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 if (this_key >= next_key) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2070 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2071 "Bad lookupswitch instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 int target = bci + default_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 for (int i = 0; i < keys; i++) {
6118
e17b61ba7bb3 7166498: JVM crash in ClassVerifier
kamg
parents: 2460
diff changeset
2079 // Because check_jump_target() may safepoint, the bytecode could have
e17b61ba7bb3 7166498: JVM crash in ClassVerifier
kamg
parents: 2460
diff changeset
2080 // moved, which means 'aligned_bcp' is no good and needs to be recalculated.
e17b61ba7bb3 7166498: JVM crash in ClassVerifier
kamg
parents: 2460
diff changeset
2081 aligned_bcp = (address)round_to((intptr_t)(bcs->bcp() + 1), jintSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 stackmap_table->check_jump_target(
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 current_frame, target, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 }
6118
e17b61ba7bb3 7166498: JVM crash in ClassVerifier
kamg
parents: 2460
diff changeset
2086 NOT_PRODUCT(aligned_bcp = NULL); // no longer valid at this point
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2088
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 bool ClassVerifier::name_in_supers(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2090 Symbol* ref_name, instanceKlassHandle current) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2091 Klass* super = current->super();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 while (super != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2093 if (super->name() == ref_name) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2096 super = super->super();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2100
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 void ClassVerifier::verify_field_instructions(RawBytecodeStream* bcs,
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 StackMapFrame* current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 constantPoolHandle cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 TRAPS) {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2105 u2 index = bcs->get_index_u2();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2106 verify_cp_type(bcs->bci(), index, cp,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2107 1 << JVM_CONSTANT_Fieldref, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2108
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 // Get field name and signature
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2110 Symbol* field_name = cp->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2111 Symbol* field_sig = cp->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2112
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 if (!SignatureVerifier::is_valid_type_signature(field_sig)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 class_format_error(
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 "Invalid signature for field in class %s referenced "
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 "from constant pool index %d", _klass->external_name(), index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 // Get referenced class type
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 VerificationType ref_class_type = cp_ref_index_to_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 if (!ref_class_type.is_object()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2124 /* Unreachable? Class file parser verifies Fieldref contents */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2125 verify_error(ErrorContext::bad_type(bcs->bci(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2126 TypeOrigin::cp(index, ref_class_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2127 "Expecting reference to class in class %s at constant pool index %d",
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2128 _klass->external_name(), index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 VerificationType target_class_type = ref_class_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2132
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 assert(sizeof(VerificationType) == sizeof(uintptr_t),
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 "buffer type must match VerificationType size");
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 uintptr_t field_type_buffer[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 VerificationType* field_type = (VerificationType*)field_type_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 // If we make a VerificationType[2] array directly, the compiler calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 // to the c-runtime library to do the allocation instead of just
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 // stack allocating it. Plus it would run constructors. This shows up
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 // in performance profiles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2141
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 SignatureStream sig_stream(field_sig, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 VerificationType stack_object_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 int n = change_sig_to_verificationType(
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 &sig_stream, field_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 u2 bci = bcs->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 bool is_assignable;
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2148 switch (bcs->raw_code()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 case Bytecodes::_getstatic: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 current_frame->push_stack(field_type[i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 case Bytecodes::_putstatic: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 for (int i = n - 1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 current_frame->pop_stack(field_type[i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 case Bytecodes::_getfield: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 stack_object_type = current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 target_class_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 current_frame->push_stack(field_type[i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 goto check_protected;
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 case Bytecodes::_putfield: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 for (int i = n - 1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 current_frame->pop_stack(field_type[i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 stack_object_type = current_frame->pop_stack(CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2174
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 // The JVMS 2nd edition allows field initialization before the superclass
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 // initializer, if the field is defined within the current class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 if (stack_object_type == VerificationType::uninitialized_this_type() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 target_class_type.equals(current_type()) &&
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2180 _klass->find_local_field(field_name, field_sig, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 stack_object_type = current_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 is_assignable = target_class_type.is_assignable_from(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2184 stack_object_type, this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 if (!is_assignable) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2186 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2187 current_frame->stack_top_ctx(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2188 TypeOrigin::cp(index, target_class_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2189 "Bad type on operand stack in putfield");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 check_protected: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 if (_this_type == stack_object_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 break; // stack_object_type must be assignable to _current_class_type
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2196 Symbol* ref_class_name =
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2197 cp->klass_name_at(cp->klass_ref_index_at(index));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2198 if (!name_in_supers(ref_class_name, current_class()))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 // stack_object_type must be assignable to _current_class_type since:
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 // 1. stack_object_type must be assignable to ref_class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 // 2. ref_class must be _current_class or a subclass of it. It can't
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 // be a superclass of it. See revised JVMS 5.4.4.
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2204
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2205 Klass* ref_class_oop = load_class(ref_class_name, CHECK);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2206 if (is_protected_access(current_class(), ref_class_oop, field_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2207 field_sig, false)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 // It's protected access, check if stack object is assignable to
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 // current class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 is_assignable = current_type().is_assignable_from(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2211 stack_object_type, this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 if (!is_assignable) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2213 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2214 current_frame->stack_top_ctx(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2215 TypeOrigin::implicit(current_type())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2216 "Bad access to protected data in getfield");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2225
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 void ClassVerifier::verify_invoke_init(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2227 RawBytecodeStream* bcs, u2 ref_class_index, VerificationType ref_class_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 StackMapFrame* current_frame, u4 code_length, bool *this_uninit,
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 constantPoolHandle cp, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 u2 bci = bcs->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 VerificationType type = current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 if (type == VerificationType::uninitialized_this_type()) {
6155
d558e01a72c0 7160757: Problem with hotspot/runtime_classfile
kamg
parents: 2460
diff changeset
2234 // The method must be an <init> method of this class or its superclass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2235 Klass* superk = current_class()->super();
1677
a5c9d63a187d 6964170: Verifier crashes
apangin
parents: 1602
diff changeset
2236 if (ref_class_type.name() != current_class()->name() &&
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2237 ref_class_type.name() != superk->name()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2238 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2239 TypeOrigin::implicit(ref_class_type),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2240 TypeOrigin::implicit(current_type())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2241 "Bad <init> method call");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 current_frame->initialize_object(type, current_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 *this_uninit = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 } else if (type.is_uninitialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 u2 new_offset = type.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 address new_bcp = bcs->bcp() - bci + new_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 if (new_offset > (code_length - 3) || (*new_bcp) != Bytecodes::_new) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2250 /* Unreachable? Stack map parsing ensures valid type and new
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2251 * instructions have a valid BCI. */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2252 verify_error(ErrorContext::bad_code(new_offset),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2253 "Expecting new instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 u2 new_class_index = Bytes::get_Java_u2(new_bcp + 1);
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2257 verify_cp_class_type(bci, new_class_index, cp, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2258
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 // The method must be an <init> method of the indicated class
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 VerificationType new_class_type = cp_index_to_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 new_class_index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 if (!new_class_type.equals(ref_class_type)) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2263 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2264 TypeOrigin::cp(new_class_index, new_class_type),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2265 TypeOrigin::cp(ref_class_index, ref_class_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2266 "Call to wrong <init> method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 // According to the VM spec, if the referent class is a superclass of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 // current class, and is in a different runtime package, and the method is
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 // protected, then the objectref must be the current class or a subclass
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 // of the current class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 VerificationType objectref_type = new_class_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 if (name_in_supers(ref_class_type.name(), current_class())) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2275 Klass* ref_klass = load_class(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 ref_class_type.name(), CHECK_VERIFY(this));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2277 Method* m = InstanceKlass::cast(ref_klass)->uncached_lookup_method(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 vmSymbols::object_initializer_name(),
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2279 cp->signature_ref_at(bcs->get_index_u2()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 instanceKlassHandle mh(THREAD, m->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 if (m->is_protected() && !mh->is_same_class_package(_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 bool assignable = current_type().is_assignable_from(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2283 objectref_type, this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 if (!assignable) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2285 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2286 TypeOrigin::cp(new_class_index, objectref_type),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2287 TypeOrigin::implicit(current_type())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2288 "Bad access to protected <init> method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 current_frame->initialize_object(type, new_class_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2295 verify_error(ErrorContext::bad_type(bci, current_frame->stack_top_ctx()),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2296 "Bad operand type when invoking <init>");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2300
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 void ClassVerifier::verify_invoke_instructions(
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 bool *this_uninit, VerificationType return_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 constantPoolHandle cp, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 // Make sure the constant pool item is the right type
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2306 u2 index = bcs->get_index_u2();
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1142
diff changeset
2307 Bytecodes::Code opcode = bcs->raw_code();
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2308 unsigned int types;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2309 switch (opcode) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2310 case Bytecodes::_invokeinterface:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2311 types = 1 << JVM_CONSTANT_InterfaceMethodref;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2312 break;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2313 case Bytecodes::_invokedynamic:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2314 types = 1 << JVM_CONSTANT_InvokeDynamic;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2315 break;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2316 case Bytecodes::_invokespecial:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2317 types = (1 << JVM_CONSTANT_InterfaceMethodref) |
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2318 (1 << JVM_CONSTANT_Methodref);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2319 break;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2320 default:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2321 types = 1 << JVM_CONSTANT_Methodref;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
2322 }
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2323 verify_cp_type(bcs->bci(), index, cp, types, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2324
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 // Get method name and signature
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2326 Symbol* method_name = cp->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2327 Symbol* method_sig = cp->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 if (!SignatureVerifier::is_valid_method_signature(method_sig)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 class_format_error(
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 "Invalid method signature in class %s referenced "
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 "from constant pool index %d", _klass->external_name(), index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2335
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 // Get referenced class type
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2337 VerificationType ref_class_type;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2338 if (opcode == Bytecodes::_invokedynamic) {
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2339 if (!EnableInvokeDynamic ||
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2340 _klass->major_version() < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2341 class_format_error(
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2342 (!EnableInvokeDynamic ?
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2343 "invokedynamic instructions not enabled in this JVM" :
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2344 "invokedynamic instructions not supported by this class file version"),
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2345 _klass->external_name());
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2346 return;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2347 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2348 } else {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2349 ref_class_type = cp_ref_index_to_type(index, cp, CHECK_VERIFY(this));
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2350 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2351
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 // For a small signature length, we just allocate 128 bytes instead
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 // of parsing the signature once to find its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 // -3 is for '(', ')' and return descriptor; multiply by 2 is for
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 // longs/doubles to be consertive.
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 assert(sizeof(VerificationType) == sizeof(uintptr_t),
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 "buffer type must match VerificationType size");
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 uintptr_t on_stack_sig_types_buffer[128];
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 // If we make a VerificationType[128] array directly, the compiler calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 // to the c-runtime library to do the allocation instead of just
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 // stack allocating it. Plus it would run constructors. This shows up
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 // in performance profiles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2363
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 VerificationType* sig_types;
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 int size = (method_sig->utf8_length() - 3) * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 if (size > 128) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 // Long and double occupies two slots here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 ArgumentSizeComputer size_it(method_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 size = size_it.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 sig_types = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, VerificationType, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 } else{
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 sig_types = (VerificationType*)on_stack_sig_types_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 SignatureStream sig_stream(method_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 int sig_i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 while (!sig_stream.at_return_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 sig_i += change_sig_to_verificationType(
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 &sig_stream, &sig_types[sig_i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 sig_stream.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 int nargs = sig_i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2382
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 ArgumentSizeComputer size_it(method_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 assert(nargs == size_it.size(), "Argument sizes do not match");
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 assert(nargs <= (method_sig->utf8_length() - 3) * 2, "estimate of max size isn't conservative enough");
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2390
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 // Check instruction operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 u2 bci = bcs->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 if (opcode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 address bcp = bcs->bcp();
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 // 4905268: count operand in invokeinterface should be nargs+1, not nargs.
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 // JSR202 spec: The count operand of an invokeinterface instruction is valid if it is
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 // the difference between the size of the operand stack before and after the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 // executes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 if (*(bcp+3) != (nargs+1)) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2400 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2401 "Inconsistent args count operand in invokeinterface");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 if (*(bcp+4) != 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2405 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2406 "Fourth operand byte of invokeinterface must be zero");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2410
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2411 if (opcode == Bytecodes::_invokedynamic) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2412 address bcp = bcs->bcp();
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2413 if (*(bcp+3) != 0 || *(bcp+4) != 0) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2414 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2415 "Third and fourth operand bytes of invokedynamic must be zero");
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2416 return;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2417 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2418 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2419
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 if (method_name->byte_at(0) == '<') {
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 // Make sure <init> can only be invoked by invokespecial
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 if (opcode != Bytecodes::_invokespecial ||
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2423 method_name != vmSymbols::object_initializer_name()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2424 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2425 "Illegal call to internal method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 } else if (opcode == Bytecodes::_invokespecial
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 && !ref_class_type.equals(current_type())
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 && !ref_class_type.equals(VerificationType::reference_type(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2431 current_class()->super()->name()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 bool subtype = ref_class_type.is_assignable_from(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2433 current_type(), this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 if (!subtype) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2435 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2436 "Bad invokespecial instruction: "
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 "current class isn't assignable to reference class.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 // Match method descriptor with operand stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 for (int i = nargs - 1; i >= 0; i--) { // Run backwards
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 current_frame->pop_stack(sig_types[i], CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 // Check objectref on operand stack
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2446 if (opcode != Bytecodes::_invokestatic &&
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 431
diff changeset
2447 opcode != Bytecodes::_invokedynamic) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2448 if (method_name == vmSymbols::object_initializer_name()) { // <init> method
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2449 verify_invoke_init(bcs, index, ref_class_type, current_frame,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 code_length, this_uninit, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 } else { // other methods
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 // Ensures that target class is assignable to method class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 if (opcode == Bytecodes::_invokespecial) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 current_frame->pop_stack(current_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 } else if (opcode == Bytecodes::_invokevirtual) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 VerificationType stack_object_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 current_frame->pop_stack(ref_class_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 if (current_type() != stack_object_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 assert(cp->cache() == NULL, "not rewritten yet");
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2460 Symbol* ref_class_name =
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2461 cp->klass_name_at(cp->klass_ref_index_at(index));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 // See the comments in verify_field_instructions() for
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 // the rationale behind this.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2464 if (name_in_supers(ref_class_name, current_class())) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6608
diff changeset
2465 Klass* ref_class = load_class(ref_class_name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 if (is_protected_access(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2467 _klass, ref_class, method_name, method_sig, true)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 // It's protected access, check if stack object is
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 // assignable to current class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 bool is_assignable = current_type().is_assignable_from(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2471 stack_object_type, this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 if (!is_assignable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 if (ref_class_type.name() == vmSymbols::java_lang_Object()
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 && stack_object_type.is_array()
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2475 && method_name == vmSymbols::clone_name()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 // Special case: arrays pretend to implement public Object
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 // clone().
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 } else {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2479 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2480 current_frame->stack_top_ctx(),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2481 TypeOrigin::implicit(current_type())),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2482 "Bad access to protected data in invokevirtual");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 assert(opcode == Bytecodes::_invokeinterface, "Unexpected opcode encountered");
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 current_frame->pop_stack(ref_class_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 // Push the result type.
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 if (sig_stream.type() != T_VOID) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2497 if (method_name == vmSymbols::object_initializer_name()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 // <init> method must have a void return type
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2499 /* Unreachable? Class file parser verifies that methods with '<' have
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2500 * void return */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2501 verify_error(ErrorContext::bad_code(bci),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2502 "Return type must be void in <init> method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 VerificationType return_type[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 int n = change_sig_to_verificationType(
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 &sig_stream, return_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 current_frame->push_stack(return_type[i], CHECK_VERIFY(this)); // push types backwards
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2513
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 VerificationType ClassVerifier::get_newarray_type(
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 u2 index, u2 bci, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 const char* from_bt[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 NULL, NULL, NULL, NULL, "[Z", "[C", "[F", "[D", "[B", "[S", "[I", "[J",
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 if (index < T_BOOLEAN || index > T_LONG) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2520 verify_error(ErrorContext::bad_code(bci), "Illegal newarray instruction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 return VerificationType::bogus_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2523
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 // from_bt[index] contains the array signature which has a length of 2
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2525 Symbol* sig = create_temporary_symbol(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 from_bt[index], 2, CHECK_(VerificationType::bogus_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 return VerificationType::reference_type(sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2529
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 void ClassVerifier::verify_anewarray(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2531 u2 bci, u2 index, constantPoolHandle cp,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2532 StackMapFrame* current_frame, TRAPS) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2533 verify_cp_class_type(bci, index, cp, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2536
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 VerificationType component_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 cp_index_to_type(index, cp, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 int length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 char* arr_sig_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 if (component_type.is_array()) { // it's an array
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 const char* component_name = component_type.name()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 // add one dimension to component
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 length = (int)strlen(component_name) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 arr_sig_str[0] = '[';
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 strncpy(&arr_sig_str[1], component_name, length - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 } else { // it's an object or interface
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 const char* component_name = component_type.name()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 // add one dimension to component with 'L' prepended and ';' postpended.
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 length = (int)strlen(component_name) + 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 arr_sig_str[0] = '[';
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 arr_sig_str[1] = 'L';
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 strncpy(&arr_sig_str[2], component_name, length - 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 arr_sig_str[length - 1] = ';';
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2558 Symbol* arr_sig = create_temporary_symbol(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 arr_sig_str, length, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 VerificationType new_array_type = VerificationType::reference_type(arr_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 current_frame->push_stack(new_array_type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2563
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 void ClassVerifier::verify_iload(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 current_frame->get_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 index, VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2570
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 void ClassVerifier::verify_lload(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 current_frame->get_local_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 index, VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 current_frame->push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2579
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 void ClassVerifier::verify_fload(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 current_frame->get_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 index, VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 current_frame->push_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2586
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 void ClassVerifier::verify_dload(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 current_frame->get_local_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 index, VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 current_frame->push_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2595
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 void ClassVerifier::verify_aload(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 VerificationType type = current_frame->get_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 index, VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 current_frame->push_stack(type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2601
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 void ClassVerifier::verify_istore(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 current_frame->set_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 index, VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2608
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 void ClassVerifier::verify_lstore(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 current_frame->pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 VerificationType::long2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 VerificationType::long_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 current_frame->set_local_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 index, VerificationType::long_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 VerificationType::long2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2617
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 void ClassVerifier::verify_fstore(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 current_frame->pop_stack(VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 current_frame->set_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 index, VerificationType::float_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2623
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 void ClassVerifier::verify_dstore(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 current_frame->pop_stack_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 VerificationType::double2_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 VerificationType::double_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 current_frame->set_local_2(
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 index, VerificationType::double_type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 VerificationType::double2_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2632
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 void ClassVerifier::verify_astore(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 VerificationType type = current_frame->pop_stack(
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 VerificationType::reference_check(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 current_frame->set_local(index, type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2638
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 void ClassVerifier::verify_iinc(u2 index, StackMapFrame* current_frame, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 VerificationType type = current_frame->get_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 index, VerificationType::integer_type(), CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 current_frame->set_local(index, type, CHECK_VERIFY(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2644
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 void ClassVerifier::verify_return_value(
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2646 VerificationType return_type, VerificationType type, u2 bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2647 StackMapFrame* current_frame, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 if (return_type == VerificationType::bogus_type()) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2649 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2650 current_frame->stack_top_ctx(), TypeOrigin::signature(return_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2651 "Method expects a return value");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2654 bool match = return_type.is_assignable_from(type, this, CHECK_VERIFY(this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 if (!match) {
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2656 verify_error(ErrorContext::bad_type(bci,
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2657 current_frame->stack_top_ctx(), TypeOrigin::signature(return_type)),
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6214
diff changeset
2658 "Bad return type");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2662
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2663 // The verifier creates symbols which are substrings of Symbols.
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2664 // These are stored in the verifier until the end of verification so that
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2665 // they can be reference counted.
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2666 Symbol* ClassVerifier::create_temporary_symbol(const Symbol *s, int begin,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2667 int end, TRAPS) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2668 Symbol* sym = SymbolTable::new_symbol(s, begin, end, CHECK_NULL);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2669 _symbols->push(sym);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2670 return sym;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2671 }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2672
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2673 Symbol* ClassVerifier::create_temporary_symbol(const char *s, int length, TRAPS) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2674 Symbol* sym = SymbolTable::new_symbol(s, length, CHECK_NULL);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2675 _symbols->push(sym);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2676 return sym;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1980
diff changeset
2677 }