Mercurial > hg > truffle
comparison src/share/vm/classfile/javaClasses.cpp @ 11010:b295e132102d
8001330: Improve on checking order
Reviewed-by: acorn, hawtin
author | mullan |
---|---|
date | Fri, 05 Apr 2013 10:18:36 -0400 |
parents | 22ba8c8ce6a6 |
children | be131aa5a529 |
comparison
equal
deleted
inserted
replaced
11009:f75faf51e8c4 | 11010:b295e132102d |
---|---|
2772 // Support for java_security_AccessControlContext | 2772 // Support for java_security_AccessControlContext |
2773 | 2773 |
2774 int java_security_AccessControlContext::_context_offset = 0; | 2774 int java_security_AccessControlContext::_context_offset = 0; |
2775 int java_security_AccessControlContext::_privilegedContext_offset = 0; | 2775 int java_security_AccessControlContext::_privilegedContext_offset = 0; |
2776 int java_security_AccessControlContext::_isPrivileged_offset = 0; | 2776 int java_security_AccessControlContext::_isPrivileged_offset = 0; |
2777 int java_security_AccessControlContext::_isAuthorized_offset = -1; | |
2777 | 2778 |
2778 void java_security_AccessControlContext::compute_offsets() { | 2779 void java_security_AccessControlContext::compute_offsets() { |
2779 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); | 2780 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); |
2780 fieldDescriptor fd; | 2781 fieldDescriptor fd; |
2781 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass()); | 2782 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass()); |
2792 | 2793 |
2793 if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) { | 2794 if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) { |
2794 fatal("Invalid layout of java.security.AccessControlContext"); | 2795 fatal("Invalid layout of java.security.AccessControlContext"); |
2795 } | 2796 } |
2796 _isPrivileged_offset = fd.offset(); | 2797 _isPrivileged_offset = fd.offset(); |
2797 } | 2798 |
2798 | 2799 // The offset may not be present for bootstrapping with older JDK. |
2800 if (ik->find_local_field(vmSymbols::isAuthorized_name(), vmSymbols::bool_signature(), &fd)) { | |
2801 _isAuthorized_offset = fd.offset(); | |
2802 } | |
2803 } | |
2804 | |
2805 | |
2806 bool java_security_AccessControlContext::is_authorized(Handle context) { | |
2807 assert(context.not_null() && context->klass() == SystemDictionary::AccessControlContext_klass(), "Invalid type"); | |
2808 assert(_isAuthorized_offset != -1, "should be set"); | |
2809 return context->bool_field(_isAuthorized_offset) != 0; | |
2810 } | |
2799 | 2811 |
2800 oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) { | 2812 oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) { |
2801 assert(_isPrivileged_offset != 0, "offsets should have been initialized"); | 2813 assert(_isPrivileged_offset != 0, "offsets should have been initialized"); |
2802 // Ensure klass is initialized | 2814 // Ensure klass is initialized |
2803 InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0); | 2815 InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0); |
2805 oop result = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0); | 2817 oop result = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0); |
2806 // Fill in values | 2818 // Fill in values |
2807 result->obj_field_put(_context_offset, context()); | 2819 result->obj_field_put(_context_offset, context()); |
2808 result->obj_field_put(_privilegedContext_offset, privileged_context()); | 2820 result->obj_field_put(_privilegedContext_offset, privileged_context()); |
2809 result->bool_field_put(_isPrivileged_offset, isPrivileged); | 2821 result->bool_field_put(_isPrivileged_offset, isPrivileged); |
2822 // whitelist AccessControlContexts created by the JVM. | |
2823 result->bool_field_put(_isAuthorized_offset, true); | |
2810 return result; | 2824 return result; |
2811 } | 2825 } |
2812 | 2826 |
2813 | 2827 |
2814 // Support for java_lang_ClassLoader | 2828 // Support for java_lang_ClassLoader |
2914 int java_lang_System::err_offset_in_bytes() { | 2928 int java_lang_System::err_offset_in_bytes() { |
2915 return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset); | 2929 return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset); |
2916 } | 2930 } |
2917 | 2931 |
2918 | 2932 |
2933 bool java_lang_System::has_security_manager() { | |
2934 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::System_klass()); | |
2935 address addr = ik->static_field_addr(static_security_offset); | |
2936 if (UseCompressedOops) { | |
2937 return oopDesc::load_decode_heap_oop((narrowOop *)addr) != NULL; | |
2938 } else { | |
2939 return oopDesc::load_decode_heap_oop((oop*)addr) != NULL; | |
2940 } | |
2941 } | |
2919 | 2942 |
2920 int java_lang_Class::_klass_offset; | 2943 int java_lang_Class::_klass_offset; |
2921 int java_lang_Class::_array_klass_offset; | 2944 int java_lang_Class::_array_klass_offset; |
2922 int java_lang_Class::_oop_size_offset; | 2945 int java_lang_Class::_oop_size_offset; |
2923 int java_lang_Class::_static_oop_field_count_offset; | 2946 int java_lang_Class::_static_oop_field_count_offset; |
2974 int java_lang_ref_SoftReference::static_clock_offset; | 2997 int java_lang_ref_SoftReference::static_clock_offset; |
2975 int java_lang_ClassLoader::parent_offset; | 2998 int java_lang_ClassLoader::parent_offset; |
2976 int java_lang_System::static_in_offset; | 2999 int java_lang_System::static_in_offset; |
2977 int java_lang_System::static_out_offset; | 3000 int java_lang_System::static_out_offset; |
2978 int java_lang_System::static_err_offset; | 3001 int java_lang_System::static_err_offset; |
3002 int java_lang_System::static_security_offset; | |
2979 int java_lang_StackTraceElement::declaringClass_offset; | 3003 int java_lang_StackTraceElement::declaringClass_offset; |
2980 int java_lang_StackTraceElement::methodName_offset; | 3004 int java_lang_StackTraceElement::methodName_offset; |
2981 int java_lang_StackTraceElement::fileName_offset; | 3005 int java_lang_StackTraceElement::fileName_offset; |
2982 int java_lang_StackTraceElement::lineNumber_offset; | 3006 int java_lang_StackTraceElement::lineNumber_offset; |
2983 int java_lang_AssertionStatusDirectives::classes_offset; | 3007 int java_lang_AssertionStatusDirectives::classes_offset; |
3099 | 3123 |
3100 // java_lang_System | 3124 // java_lang_System |
3101 java_lang_System::static_in_offset = java_lang_System::hc_static_in_offset * x; | 3125 java_lang_System::static_in_offset = java_lang_System::hc_static_in_offset * x; |
3102 java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x; | 3126 java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x; |
3103 java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x; | 3127 java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x; |
3128 java_lang_System::static_security_offset = java_lang_System::hc_static_security_offset * x; | |
3104 | 3129 |
3105 // java_lang_StackTraceElement | 3130 // java_lang_StackTraceElement |
3106 java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset * x + header; | 3131 java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset * x + header; |
3107 java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header; | 3132 java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header; |
3108 java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header; | 3133 java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header; |
3298 // java.lang.System | 3323 // java.lang.System |
3299 | 3324 |
3300 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, in, "Ljava/io/InputStream;"); | 3325 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, in, "Ljava/io/InputStream;"); |
3301 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;"); | 3326 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;"); |
3302 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;"); | 3327 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;"); |
3328 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, security, "Ljava/lang/SecurityManager;"); | |
3303 | 3329 |
3304 // java.lang.StackTraceElement | 3330 // java.lang.StackTraceElement |
3305 | 3331 |
3306 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;"); | 3332 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;"); |
3307 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;"); | 3333 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;"); |