comparison src/share/vm/classfile/classFileParser.cpp @ 2356:72dee110246f

6839872: remove implementation inheritance from JSR 292 APIs Summary: consolidate runtime support in java.dyn.MethodHandleNatives; include transitional compatibility logic Reviewed-by: twisti
author jrose
date Fri, 11 Mar 2011 22:33:47 -0800
parents dbad0519a1c4
children 8033953d67ff
comparison
equal deleted inserted replaced
2355:799d8ccf63cf 2356:72dee110246f
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
144 cp->string_index_at_put(index, string_index); 144 cp->string_index_at_put(index, string_index);
145 } 145 }
146 break; 146 break;
147 case JVM_CONSTANT_MethodHandle : 147 case JVM_CONSTANT_MethodHandle :
148 case JVM_CONSTANT_MethodType : 148 case JVM_CONSTANT_MethodType :
149 if (!EnableMethodHandles || 149 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
150 _major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
151 classfile_parse_error( 150 classfile_parse_error(
152 (!EnableMethodHandles ? 151 "Class file version does not support constant tag %u in class file %s",
153 "This JVM does not support constant tag %u in class file %s" : 152 tag, CHECK);
154 "Class file version does not support constant tag %u in class file %s"), 153 }
154 if (!EnableMethodHandles) {
155 classfile_parse_error(
156 "This JVM does not support constant tag %u in class file %s",
155 tag, CHECK); 157 tag, CHECK);
156 } 158 }
157 if (tag == JVM_CONSTANT_MethodHandle) { 159 if (tag == JVM_CONSTANT_MethodHandle) {
158 cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags 160 cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags
159 u1 ref_kind = cfs->get_u1_fast(); 161 u1 ref_kind = cfs->get_u1_fast();
168 } 170 }
169 break; 171 break;
170 case JVM_CONSTANT_InvokeDynamicTrans : // this tag appears only in old classfiles 172 case JVM_CONSTANT_InvokeDynamicTrans : // this tag appears only in old classfiles
171 case JVM_CONSTANT_InvokeDynamic : 173 case JVM_CONSTANT_InvokeDynamic :
172 { 174 {
173 if (!EnableInvokeDynamic || 175 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
174 _major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
175 classfile_parse_error( 176 classfile_parse_error(
176 (!EnableInvokeDynamic ? 177 "Class file version does not support constant tag %u in class file %s",
177 "This JVM does not support constant tag %u in class file %s" : 178 tag, CHECK);
178 "Class file version does not support constant tag %u in class file %s"), 179 }
180 if (!EnableInvokeDynamic) {
181 classfile_parse_error(
182 "This JVM does not support constant tag %u in class file %s",
179 tag, CHECK); 183 tag, CHECK);
180 } 184 }
181 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags 185 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags
182 u2 bootstrap_specifier_index = cfs->get_u2_fast(); 186 u2 bootstrap_specifier_index = cfs->get_u2_fast();
183 u2 name_and_type_index = cfs->get_u2_fast(); 187 u2 name_and_type_index = cfs->get_u2_fast();
2821 word_sig_index = index; 2825 word_sig_index = index;
2822 break; 2826 break;
2823 } 2827 }
2824 } 2828 }
2825 2829
2830 if (AllowTransitionalJSR292 && word_sig_index == 0) return;
2826 if (word_sig_index == 0) 2831 if (word_sig_index == 0)
2827 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), 2832 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
2828 "missing I or J signature (for vmentry) in java.dyn.MethodHandle"); 2833 "missing I or J signature (for vmentry) in java.dyn.MethodHandle");
2829 2834
2830 // Find vmentry field and change the signature. 2835 // Find vmentry field and change the signature.
2860 break; 2865 break;
2861 } 2866 }
2862 } 2867 }
2863 } 2868 }
2864 2869
2870 if (AllowTransitionalJSR292 && !found_vmentry) return;
2865 if (!found_vmentry) 2871 if (!found_vmentry)
2866 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), 2872 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
2867 "missing vmentry byte field in java.dyn.MethodHandle"); 2873 "missing vmentry byte field in java.dyn.MethodHandle");
2868 } 2874 }
2869 2875
3228 if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) { 3234 if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) {
3229 java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle)); 3235 java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle));
3230 } 3236 }
3231 3237
3232 // adjust the vmentry field declaration in java.dyn.MethodHandle 3238 // adjust the vmentry field declaration in java.dyn.MethodHandle
3233 if (EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) { 3239 if (EnableMethodHandles && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) {
3240 java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
3241 }
3242 if (AllowTransitionalJSR292 &&
3243 EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) {
3244 // allow vmentry field in MethodHandleImpl also
3234 java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); 3245 java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
3235 } 3246 }
3236 3247
3237 // Add a fake "discovered" field if it is not present 3248 // Add a fake "discovered" field if it is not present
3238 // for compatibility with earlier jdk's. 3249 // for compatibility with earlier jdk's.