Path: blob/master/runtime/jcl/common/java_lang_invoke_VarHandle.c
6000 views
/*******************************************************************************1* Copyright (c) 2016, 2021 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#include "jclprots.h"2324#include <string.h>25#include <stdlib.h>2627#include "j9.h"28#include "jcl.h"29#include "j9consts.h"30#include "jni.h"31#include "j9protos.h"32#include "jclprots.h"33#include "ut_j9jcl.h"34#include "VM_MethodHandleKinds.h"3536#include "rommeth.h"37#include "j9vmnls.h"38#include "j9vmconstantpool.h"39#include "j9jclnls.h"4041#if defined(J9VM_OPT_METHOD_HANDLE) && (JAVA_SPEC_VERSION >= 11)42static BOOLEAN43accessCheckFieldType(J9VMThread *currentThread, J9Class* lookupClass, J9Class* type, J9UTF8 *lookupSig)44{45J9JavaVM *vm = currentThread->javaVM;46J9BytecodeVerificationData *verifyData = vm->bytecodeVerificationData;47BOOLEAN result = TRUE;4849/* If the verifier isn't enabled, accept the access check unconditionally */50if (NULL != verifyData) {51U_8 *lookupSigData = J9UTF8_DATA(lookupSig);52/* Only check reference types (not primitive types) */53if ('L' == *lookupSigData) {54J9ClassLoader *lookupClassloader = lookupClass->classLoader;55J9ClassLoader *typeClassloader = type->classLoader;56if (typeClassloader != lookupClassloader) {57/* Different class loaders - check class loading constraint */58j9thread_monitor_enter(vm->classTableMutex);59if (verifyData->checkClassLoadingConstraintForNameFunction(60currentThread,61lookupClassloader,62typeClassloader,63&lookupSigData[1],64&lookupSigData[1],65J9UTF8_LENGTH(lookupSig) - 2,66TRUE) != 0) {67result = FALSE;68}69j9thread_monitor_exit(vm->classTableMutex);70}71}72}73return result;74}7576jlong JNICALL77Java_java_lang_invoke_FieldVarHandle_lookupField(JNIEnv *env, jobject handle, jclass lookupClass, jstring name, jstring signature, jclass type, jboolean isStatic, jclass accessClass)78{79J9UTF8 *signatureUTF8 = NULL;80char signatureUTF8Buffer[256];81J9Class *j9LookupClass; /* J9Class for java.lang.Class lookupClass */82J9Class *definingClass = NULL;83UDATA field = 0;84UDATA romField = 0;85J9VMThread *vmThread = (J9VMThread *) env;86J9JavaVM *vm = vmThread->javaVM;87J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;88j9object_t varHandle = NULL;89PORT_ACCESS_FROM_ENV(env);9091vmFuncs->internalEnterVMFromJNI(vmThread);9293signatureUTF8 = vmFuncs->copyStringToJ9UTF8WithMemAlloc(vmThread, J9_JNI_UNWRAP_REFERENCE(signature), J9_STR_NONE, "", 0, signatureUTF8Buffer, sizeof(signatureUTF8Buffer));9495if (signatureUTF8 == NULL) {96vmFuncs->setNativeOutOfMemoryError(vmThread, 0, 0);97Assert_JCL_notNull(vmThread->currentException);98goto _cleanup;99}100101j9LookupClass = J9VM_J9CLASS_FROM_JCLASS(vmThread, lookupClass);102103field = lookupField(env, isStatic, j9LookupClass, name, signatureUTF8, &definingClass, &romField, accessClass);104105if (NULL != vmThread->currentException) {106goto _cleanup;107}108109/* Check signature for classloader visibility */110if (!accessCheckFieldType(vmThread, j9LookupClass, J9VM_J9CLASS_FROM_JCLASS(vmThread, type), signatureUTF8)) {111setClassLoadingConstraintLinkageError(vmThread, definingClass, signatureUTF8);112goto _cleanup;113}114115varHandle = J9_JNI_UNWRAP_REFERENCE(handle);116J9VMJAVALANGINVOKEVARHANDLE_SET_MODIFIERS(vmThread, varHandle, ((J9ROMFieldShape *)romField)->modifiers);117118/* StaticFieldVarHandle and InstanceFieldVarHandle extend FieldVarHandle. For StaticFieldVarHandle, isStatic119* is true, and the definingClass field is set to the owner of the static field. For InstanceFieldVarHandle,120* isStatic is false, and the definingClass field is set to the lookupClass, which is also the instance class,121* in FieldVarHandle's constructor.122*/123if (isStatic) {124Assert_JCL_notNull(definingClass);125J9VMJAVALANGINVOKEFIELDVARHANDLE_SET_DEFININGCLASS(vmThread, varHandle, J9VM_J9CLASS_TO_HEAPCLASS(definingClass));126}127128_cleanup:129vmFuncs->internalExitVMToJNI(vmThread);130131if (signatureUTF8 != (J9UTF8*)signatureUTF8Buffer) {132j9mem_free_memory(signatureUTF8);133}134135return field;136}137138jlong JNICALL139Java_java_lang_invoke_FieldVarHandle_unreflectField(JNIEnv *env, jobject handle, jobject reflectField, jboolean isStatic)140{141J9VMThread *vmThread = (J9VMThread *) env;142J9JavaVM *vm = vmThread->javaVM;143J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;144J9ReflectFunctionTable *reflectFunctions = &(vm->reflectFunctions);145J9JNIFieldID *fieldID = NULL;146j9object_t fieldObject = NULL;147UDATA fieldOffset = 0;148149vmFuncs->internalEnterVMFromJNI(vmThread);150/* Can't fail as we know the field is not null */151fieldObject = J9_JNI_UNWRAP_REFERENCE(reflectField);152fieldID = reflectFunctions->idFromFieldObject(vmThread, NULL, fieldObject);153154fieldOffset = fieldID->offset;155if (isStatic) {156/* ensure this is correctly tagged so that the JIT targets using Unsafe will correctly detect this is static */157fieldOffset |= J9_SUN_STATIC_FIELD_OFFSET_TAG;158}159160J9VMJAVALANGINVOKEVARHANDLE_SET_MODIFIERS(vmThread, J9_JNI_UNWRAP_REFERENCE(handle), fieldID->field->modifiers);161162vmFuncs->internalExitVMToJNI(vmThread);163return fieldOffset;164}165#endif /* defined(J9VM_OPT_METHOD_HANDLE) && (JAVA_SPEC_VERSION >= 11) */166167jobject JNICALL168Java_java_lang_invoke_VarHandle_get(JNIEnv *env, jobject handle, jobject args)169{170throwNewUnsupportedOperationException(env);171return NULL;172}173174void JNICALL175Java_java_lang_invoke_VarHandle_set(JNIEnv *env, jobject handle, jobject args)176{177throwNewUnsupportedOperationException(env);178}179180jobject JNICALL181Java_java_lang_invoke_VarHandle_getVolatile(JNIEnv *env, jobject handle, jobject args)182{183throwNewUnsupportedOperationException(env);184return NULL;185}186187void JNICALL188Java_java_lang_invoke_VarHandle_setVolatile(JNIEnv *env, jobject handle, jobject args)189{190throwNewUnsupportedOperationException(env);191}192193jobject JNICALL194Java_java_lang_invoke_VarHandle_getOpaque(JNIEnv *env, jobject handle, jobject args)195{196throwNewUnsupportedOperationException(env);197return NULL;198}199200void JNICALL201Java_java_lang_invoke_VarHandle_setOpaque(JNIEnv *env, jobject handle, jobject args)202{203throwNewUnsupportedOperationException(env);204}205206jobject JNICALL207Java_java_lang_invoke_VarHandle_getAcquire(JNIEnv *env, jobject handle, jobject args)208{209throwNewUnsupportedOperationException(env);210return NULL;211}212213void JNICALL214Java_java_lang_invoke_VarHandle_setRelease(JNIEnv *env, jobject handle, jobject args)215{216throwNewUnsupportedOperationException(env);217}218219jboolean JNICALL220Java_java_lang_invoke_VarHandle_compareAndSet(JNIEnv *env, jobject handle, jobject args)221{222throwNewUnsupportedOperationException(env);223return JNI_FALSE;224}225226jboolean JNICALL227Java_java_lang_invoke_VarHandle_compareAndExchange(JNIEnv *env, jobject handle, jobject args)228{229throwNewUnsupportedOperationException(env);230return JNI_FALSE;231}232233jboolean JNICALL234Java_java_lang_invoke_VarHandle_compareAndExchangeAcquire(JNIEnv *env, jobject handle, jobject args)235{236throwNewUnsupportedOperationException(env);237return JNI_FALSE;238}239240jboolean JNICALL241Java_java_lang_invoke_VarHandle_compareAndExchangeRelease(JNIEnv *env, jobject handle, jobject args)242{243throwNewUnsupportedOperationException(env);244return JNI_FALSE;245}246247jboolean JNICALL248Java_java_lang_invoke_VarHandle_weakCompareAndSet(JNIEnv *env, jobject handle, jobject args)249{250throwNewUnsupportedOperationException(env);251return JNI_FALSE;252}253254jboolean JNICALL255Java_java_lang_invoke_VarHandle_weakCompareAndSetAcquire(JNIEnv *env, jobject handle, jobject args)256{257throwNewUnsupportedOperationException(env);258return JNI_FALSE;259}260261jboolean JNICALL262Java_java_lang_invoke_VarHandle_weakCompareAndSetRelease(JNIEnv *env, jobject handle, jobject args)263{264throwNewUnsupportedOperationException(env);265return JNI_FALSE;266}267268jboolean JNICALL269Java_java_lang_invoke_VarHandle_weakCompareAndSetPlain(JNIEnv *env, jobject handle, jobject args)270{271throwNewUnsupportedOperationException(env);272return JNI_FALSE;273}274275jobject JNICALL276Java_java_lang_invoke_VarHandle_getAndSet(JNIEnv *env, jobject handle, jobject args)277{278throwNewUnsupportedOperationException(env);279return NULL;280}281282jobject JNICALL283Java_java_lang_invoke_VarHandle_getAndSetAcquire(JNIEnv *env, jobject handle, jobject args)284{285throwNewUnsupportedOperationException(env);286return NULL;287}288289jobject JNICALL290Java_java_lang_invoke_VarHandle_getAndSetRelease(JNIEnv *env, jobject handle, jobject args)291{292throwNewUnsupportedOperationException(env);293return NULL;294}295296jobject JNICALL297Java_java_lang_invoke_VarHandle_getAndAdd(JNIEnv *env, jobject handle, jobject args)298{299throwNewUnsupportedOperationException(env);300return NULL;301}302303jobject JNICALL304Java_java_lang_invoke_VarHandle_getAndAddAcquire(JNIEnv *env, jobject handle, jobject args)305{306throwNewUnsupportedOperationException(env);307return NULL;308}309310jobject JNICALL311Java_java_lang_invoke_VarHandle_getAndAddRelease(JNIEnv *env, jobject handle, jobject args)312{313throwNewUnsupportedOperationException(env);314return NULL;315}316317jobject JNICALL318Java_java_lang_invoke_VarHandle_getAndBitwiseAnd(JNIEnv *env, jobject handle, jobject args)319{320throwNewUnsupportedOperationException(env);321return NULL;322}323324jobject JNICALL325Java_java_lang_invoke_VarHandle_getAndBitwiseAndAcquire(JNIEnv *env, jobject handle, jobject args)326{327throwNewUnsupportedOperationException(env);328return NULL;329}330331jobject JNICALL332Java_java_lang_invoke_VarHandle_getAndBitwiseAndRelease(JNIEnv *env, jobject handle, jobject args)333{334throwNewUnsupportedOperationException(env);335return NULL;336}337338jobject JNICALL339Java_java_lang_invoke_VarHandle_getAndBitwiseOr(JNIEnv *env, jobject handle, jobject args)340{341throwNewUnsupportedOperationException(env);342return NULL;343}344345jobject JNICALL346Java_java_lang_invoke_VarHandle_getAndBitwiseOrAcquire(JNIEnv *env, jobject handle, jobject args)347{348throwNewUnsupportedOperationException(env);349return NULL;350}351352jobject JNICALL353Java_java_lang_invoke_VarHandle_getAndBitwiseOrRelease(JNIEnv *env, jobject handle, jobject args)354{355throwNewUnsupportedOperationException(env);356return NULL;357}358359jobject JNICALL360Java_java_lang_invoke_VarHandle_getAndBitwiseXor(JNIEnv *env, jobject handle, jobject args)361{362throwNewUnsupportedOperationException(env);363return NULL;364}365366jobject JNICALL367Java_java_lang_invoke_VarHandle_getAndBitwiseXorAcquire(JNIEnv *env, jobject handle, jobject args)368{369throwNewUnsupportedOperationException(env);370return NULL;371}372373jobject JNICALL374Java_java_lang_invoke_VarHandle_getAndBitwiseXorRelease(JNIEnv *env, jobject handle, jobject args)375{376throwNewUnsupportedOperationException(env);377return NULL;378}379380jobject JNICALL381Java_java_lang_invoke_VarHandle_addAndGet(JNIEnv *env, jobject handle, jobject args)382{383throwNewUnsupportedOperationException(env);384return NULL;385}386387388