annotate src/share/vm/classfile/verifier.cpp @ 3762:5c0a3c1858b1

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