/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void ThrowUnsupportedOperationForAccessMode(JNIEnv* env, const char* accessMode) { // VarHandle access mode methods should be dispatched by the // interpreter or inlined into compiled code. The JNI methods below // are discoverable via reflection, but are not intended to be // invoked this way. jniThrowExceptionFmt(env, "java/lang/UnsupportedOperationException", "VarHandle.%s cannot be invoked reflectively.", accessMode); } static jobject VarHandle_compareAndExchange(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "compareAndExchange"); return nullptr; } static jobject VarHandle_compareAndExchangeAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "compareAndExchangeAcquire"); return nullptr; } static jobject VarHandle_compareAndExchangeRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "compareAndExchangeRelease"); return nullptr; } static jboolean VarHandle_compareAndSet(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "compareAndSet"); return JNI_FALSE; } static jobject VarHandle_get(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "get"); return nullptr; } static jobject VarHandle_getAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAcquire"); return nullptr; } static jobject VarHandle_getAndAdd(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndAdd"); return nullptr; } static jobject VarHandle_getAndAddAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndAddAcquire"); return nullptr; } static jobject VarHandle_getAndAddRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndAddRelease"); return nullptr; } static jobject VarHandle_getAndBitwiseAnd(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseAnd"); return nullptr; } static jobject VarHandle_getAndBitwiseAndAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseAndAcquire"); return nullptr; } static jobject VarHandle_getAndBitwiseAndRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseAndRelease"); return nullptr; } static jobject VarHandle_getAndBitwiseOr(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseOr"); return nullptr; } static jobject VarHandle_getAndBitwiseOrAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseOrAcquire"); return nullptr; } static jobject VarHandle_getAndBitwiseOrRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseOrRelease"); return nullptr; } static jobject VarHandle_getAndBitwiseXor(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseXor"); return nullptr; } static jobject VarHandle_getAndBitwiseXorAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseXorAcquire"); return nullptr; } static jobject VarHandle_getAndBitwiseXorRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndBitwiseXorRelease"); return nullptr; } static jobject VarHandle_getAndSet(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndSet"); return nullptr; } static jobject VarHandle_getAndSetAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndSetAcquire"); return nullptr; } static jobject VarHandle_getAndSetRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getAndSetRelease"); return nullptr; } static jobject VarHandle_getOpaque(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getOpaque"); return nullptr; } static jobject VarHandle_getVolatile(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "getVolatile"); return nullptr; } static void VarHandle_set(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "set"); } static void VarHandle_setOpaque(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "setOpaque"); } static void VarHandle_setRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "setRelease"); } static void VarHandle_setVolatile(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "setVolatile"); } static jboolean VarHandle_weakCompareAndSet(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "weakCompareAndSet"); return JNI_FALSE; } static jboolean VarHandle_weakCompareAndSetAcquire(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "weakCompareAndSetAcquire"); return JNI_FALSE; } static jboolean VarHandle_weakCompareAndSetPlain(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "weakCompareAndSetPlain"); return JNI_FALSE; } static jboolean VarHandle_weakCompareAndSetRelease(JNIEnv* env, jobject, jobjectArray) { // Only reachable with reflection (see comment in ThrowUnsupportedOperationForAccessMode). ThrowUnsupportedOperationForAccessMode(env, "weakCompareAndSetRelease"); return JNI_FALSE; } static JNINativeMethod gMethods[] = { NATIVE_METHOD(VarHandle, compareAndExchange, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, compareAndExchangeAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, compareAndExchangeRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, compareAndSet, "([Ljava/lang/Object;)Z"), NATIVE_METHOD(VarHandle, get, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndAdd, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndAddAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndAddRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseAnd, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseAndAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseAndRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseOr, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseOrAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseOrRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseXor, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseXorAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndBitwiseXorRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndSet, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndSetAcquire, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getAndSetRelease, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getOpaque, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, getVolatile, "([Ljava/lang/Object;)Ljava/lang/Object;"), NATIVE_METHOD(VarHandle, set, "([Ljava/lang/Object;)V"), NATIVE_METHOD(VarHandle, setOpaque, "([Ljava/lang/Object;)V"), NATIVE_METHOD(VarHandle, setRelease, "([Ljava/lang/Object;)V"), NATIVE_METHOD(VarHandle, setVolatile, "([Ljava/lang/Object;)V"), NATIVE_METHOD(VarHandle, weakCompareAndSet, "([Ljava/lang/Object;)Z"), NATIVE_METHOD(VarHandle, weakCompareAndSetAcquire, "([Ljava/lang/Object;)Z"), NATIVE_METHOD(VarHandle, weakCompareAndSetPlain, "([Ljava/lang/Object;)Z"), NATIVE_METHOD(VarHandle, weakCompareAndSetRelease, "([Ljava/lang/Object;)Z"), }; void register_java_lang_invoke_VarHandle(JNIEnv* env) { jniRegisterNativeMethods(env, "java/lang/invoke/VarHandle", gMethods, NELEM(gMethods)); }