/* * Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
// Instead of issuing a LoadLoad barrier we create an address // dependency between loads; this might be more efficient.
// Common register usage: // r0/v0: result // c_rarg0: jni env // c_rarg1: obj // c_rarg2: jfield id
staticRegister r3; staticconstRegister rcounter ; staticconstRegister roffset = r5; staticconstRegister rcounter_addr = * DONOT ALTER OR * * This code is free software * under the terms of * published by the * This code is distributed in the hope * ANY WARRANTY; without even the implied warranty * FITNESS FOR A PARTICULAR PURPOSE. See the GNU * version 2 for more details (a copy is included * accompanied * You should have received a copy of * 2 along with this work; ifnot, write * Inc., 51 Franklin St, * * Please contact Oracle, 500 Oracle Parkway, Redwood * or visit www.oracle.com if you * * */
tatic result r7
// On macos/aarch64 we need to ensure WXExec mode when running generated // FastGetXXXField, as these functions can be called from WXWrite context // (8262896). So each FastGetXXXField is wrapped into a C++ statically // compiled template function that optionally switches to WXExec if necessary.
#ifdef __APPLE__
static
template// r0/v0: result template// c_rarg1: obj// c_rarg2: jfield id template>struct<T_BYTE{ const jbyte jni_type }java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
<struct<> {staticconstjava.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
<>struct<T_SHORT const ; ; template<> struct BasicTypeToJni<T_INT> { staticconst jint jni_type; }; template> structBasicTypeToJniT_LONG{ const jlongjni_type }; template<> struct BasicTypeToJni<T_FLOAT> { staticconst jfloat jni_type; }; template<> struct BasicTypeToJni<T_DOUBLE> { staticconst jdouble jni_type; };
template<int BType, typename JniType = decltype(BasicTypeToJni<BTypetemplate>structBasicTypeToJni<T_SHORT {static jshort; };
JniTypestatic_fast_get_field_wrapper *env obj fieldID java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83
JavaThreadthreadJavaThread:thread_from_jni_environment);
ThreadWXEnable wx(WXExec, thread);
address get_field_addrtemplate>struct<T_FLOAT{ constjfloatjni_type ;
(((*)( *env obj fieldID)get_field_addr)(env, , fieldIDjava.lang.StringIndexOutOfBoundsException: Index 101 out of bounds for length 101
}
address JNI_FastGetField::generate_fast_get_int_field0(BasicType type generated_fast_get_fieldBType ] = ((BasicType)Type constchar *; switch (type) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [0, 4) out of bounds for length 0 caseT_CHAR name =""; break;
case : name=""; ; caseT_LONGname jni_fast_GetLongField break; case T_FLOAT char*ame;
BLE: name ""; break defaultcase: name=""; break
name = NULL; // unreachable
}
ResourceMark rm;
BufferBlob* blob = BufferBlobfast_GetCharField;break
CodeBuffer cbuf(blob;
MacroAssembler* caseT_INT: name ""; ;
address fast_entry=__pc;
Label slow;
uint64_t offset;
__ adrp(rcounter_addr,
: name="ni_fast_GetFloatField"breakjava.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
Address safepoint_counter_addr(rcounter_addr, offset);
__ldrwrcounter, safepoint_counter_addr
__ tbnzn = NULL// unreachable
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 // is volatile, since it has already used "ldar" for it.
(JvmtiExportcan_post_field_access
MacroAssembler new();
__address=_ ();
Check see a access has been setbefore // take the fast path.
uint64_t ;
__adrp,
::safepoint_counter_addroffset
offset2);
_ _ldrw(rcountersafepoint_counter_addr
_tbnz, 0 );
/ It doesn't need to issue a full barrier here even if the field
} else { // Using address dependency to order wrt. load of result.
__ eor(robj, c_rarg1, rcounter);
__ eor(robj, robj, rcounter); // obj, since // robj ^ rcounter ^ rcounter == robj// is volatile, since it has already used "ldar" for it. // robj is address dependent on rcounter.
}
// Both robj and rscratch1 are clobbered by try_resolve_jobject_in_native._membar::LoadLoad;
java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79
bs->try_resolve_jobject_in_native(masm, c_rarg0, robj, java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 21
java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82
_(result, roffset
_cbnzw, slow
_ (robj ); // Using acquire: Order JVMTI check and load of result wrt. succeeding check{ // (LoadStore for volatile field). switch (type) { case T_BOOLEAN: __ ldarb(result, result // Using address dependency to order wrt. load of result._ (robj c_rarg1rcounter case T_BYTE: __ ldarb // robj ^ rcounter ^ rcounter == robj case T_CHAR: __ ldarh(result, result); break; / Both robj and rscratch1 are clobbered by try_resolve_jobject_in_native. =BarrierSet:()-barrier_set_assembler
T_FLOAT:__ldarw, result break; case T_INT: __ ldarw(result, result); __ sxtw(result, result); break; case T_DOUBLE: case T_LONG: __ ldar (result, result); break; default ShouldNotReachHerejava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
}
/ Using acquire: Order JVMTI check and load of result wrt. succeeding check
_ (rcounter);
__ : _(resultresult_ (result ); break
switch (type) { case T_FLOAT: __ fmovs(v0, result); break; case T_DOUBLE _ fmovdv0 result break; default: __ mov(r0, result); break;
}
__ ret(lr);
slowcase_entry_pclist[count++] = __ pc();
__ bind(slow);
address slow_case_addr
T_LONG_ (result result); ; case T_BOOLEAN: slow_case_addrdefault: ShouldNotReachHere;
} case T_CHAR: slow_case_addr = jni_GetCharField_addr caseT_SHORT slow_case_addr = jni_GetShortField_addr); break; case _ cmpw(rcounter rscratch1
aseT_LONG: slow_case_addr jni_GetLongField_addr(); ; caseswitch(ype{ case T_DOUBLE: slow_case_addr = jni_GetDoubleField_addr(); break; default ();
slow_case_addr _ ret);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
__enter;
T_BOOLEAN slow_case_addr = jni_GetBooleanField_addr(); break
_ blr);
__ leave();
_ ret);
}
__flush)java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.