aboutsummaryrefslogtreecommitdiffstats
path: root/native/natives.c
diff options
context:
space:
mode:
authorIvan Dubrov <idubrov@guidewire.com>2014-04-24 17:02:24 -0700
committerIvan Dubrov <idubrov@guidewire.com>2014-04-24 17:27:05 -0700
commit38ed95d3c0e7043351bcd98edcec840440c2f50c (patch)
tree2e96aab1587260c971f55ad2e3431ab69b6571ab /native/natives.c
parentb4a131ffa7877b6c1853a3b0d6cf2dc1391b72d9 (diff)
downloaddcevm-38ed95d3c0e7043351bcd98edcec840440c2f50c.tar.gz
dcevm-38ed95d3c0e7043351bcd98edcec840440c2f50c.zip
Extracting DCEVM patch & code into separate project
Making DCEVM to be toplevel project that clones HotSpot repository, patches the code, builds JVM and tests it.
Diffstat (limited to 'native/natives.c')
-rw-r--r--native/natives.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/native/natives.c b/native/natives.c
new file mode 100644
index 00000000..9c40f2c7
--- /dev/null
+++ b/native/natives.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. 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.
+ *
+ */
+
+#include <stdio.h>
+#include <jni.h>
+#include <string.h>
+#include <stdlib.h>
+#include "natives.h"
+
+JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value(JNIEnv *env, jclass c) {
+ return 1;
+}
+
+JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value2(JNIEnv *env, jclass c) {
+ return 2;
+}
+
+JNIEXPORT jclass JNICALL Java_at_ssw_hotswap_test_access_jni_JNIVMAccess_findClassNative(JNIEnv *env, jclass c, jstring s) {
+ const char* name = (*env)->GetStringUTFChars(env, s, 0);
+ jclass clazz = (*env)->FindClass(env, name);
+ (*env)->ReleaseStringUTFChars(env, s, name);
+ return clazz;
+}
+
+JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_findMethodNative(JNIEnv *env, jclass c, jclass cls, jstring methodName) {
+ const char *methodstr = (*env)->GetStringUTFChars(env, methodName, 0);
+
+ jclass jCls = (*env)->GetObjectClass(env, cls);
+
+ // Get Method ID of getMethods()
+ jmethodID midGetFields = (*env)->GetMethodID(env, jCls, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;");
+ (*env)->ExceptionDescribe(env);
+ jobjectArray jobjArray = (jobjectArray) (*env)->CallObjectMethod(env, cls, midGetFields);
+
+ jsize len = (*env)->GetArrayLength(env, jobjArray);
+ jsize i = 0;
+
+ for (i = 0; i < len; i++) {
+ jobject _strMethod = (*env)->GetObjectArrayElement(env, jobjArray, i);
+ jclass _methodClazz = (*env)->GetObjectClass(env, _strMethod);
+ jmethodID mid = (*env)->GetMethodID(env, _methodClazz, "getName", "()Ljava/lang/String;");
+ jstring _name = (jstring) (*env)->CallObjectMethod(env, _strMethod, mid);
+
+ const char *str = (*env)->GetStringUTFChars(env, _name, 0);
+
+ if (strcmp(str, methodstr) == 0) {
+ (*env)->ReleaseStringUTFChars(env, methodName, methodstr);
+ (*env)->ReleaseStringUTFChars(env, _name, str);
+ return _strMethod;
+ }
+ (*env)->ReleaseStringUTFChars(env, _name, str);
+ }
+
+ jclass exc = (*env)->FindClass(env, "java/lang/NoSuchMethodError");
+ (*env)->ThrowNew(env, exc, methodstr);
+ (*env)->ReleaseStringUTFChars(env, methodName, methodstr);
+
+}
+
+JNIEXPORT jobjectArray JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_getMethodsNative(JNIEnv *env, jclass c, jclass cls) {
+ jobjectArray array;
+
+ jclass jCls = (*env)->GetObjectClass(env, cls);
+
+ // Get Method ID of getMethods()
+ jmethodID midGetFields = (*env)->GetMethodID(env, jCls, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;");
+ (*env)->ExceptionDescribe(env);
+ jobjectArray jobjArray = (jobjectArray) (*env)->CallObjectMethod(env, cls, midGetFields);
+
+ jsize len = (*env)->GetArrayLength(env, jobjArray);
+ jsize i = 0;
+
+ array = (*env)->NewObjectArray(env, len, (*env)->FindClass(env, "java/lang/reflect/Method"), 0);
+
+ for (i = 0; i < len; i++) {
+ jobject _strMethod = (*env)->GetObjectArrayElement(env, jobjArray, i);
+ (*env)->SetObjectArrayElement(env, array, i, _strMethod);
+ }
+
+ return array;
+}
+
+jobject callVoidMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) {
+ if (staticValue) {
+ (*env)->CallStaticVoidMethodA(env, obj, methodID, params);
+ } else {
+ (*env)->CallVoidMethodA(env, obj, methodID, params);
+ }
+ return (*env)->NewGlobalRef(env, NULL);
+}
+
+jobject callIntMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) {
+ jint intValue;
+ if (staticValue) {
+ intValue = (*env)->CallStaticIntMethodA(env, obj, methodID, params);
+ } else {
+ intValue = (*env)->CallIntMethodA(env, obj, methodID, params);
+ }
+ jclass clazz = (*env)->FindClass(env, "Ljava/lang/Integer;");
+ jmethodID methodIDInteger = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
+ return (*env)->NewObject(env, clazz, methodIDInteger, intValue);
+}
+
+jobject callObjectMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) {
+ if (staticValue) {
+ return (*env)->CallStaticObjectMethodA(env, obj, methodID, params);
+ } else {
+ return (*env)->CallObjectMethodA(env, obj, methodID, params);
+ }
+}
+
+JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIMethodAccess_invokeMethodNative(JNIEnv *env, jclass c, jclass cls, jobject obj, jstring methodName, jstring retValue, jboolean staticValue, jstring descriptor, jobjectArray params) {
+ const char *methodstr = (*env)->GetStringUTFChars(env, methodName, 0);
+ const char *descriptorstr = (*env)->GetStringUTFChars(env, descriptor, 0);
+ const char *retValuestr = (*env)->GetStringUTFChars(env, retValue, 0);
+
+ jmethodID methodID;
+ if (staticValue) {
+ methodID = (*env)->GetStaticMethodID(env, cls, methodstr, descriptorstr);
+ } else {
+ methodID = (*env)->GetMethodID(env, cls, methodstr, descriptorstr);
+ }
+
+ jsize len = (*env)->GetArrayLength(env, params);
+ jvalue *m = (jvalue*) malloc(sizeof (jvalue) * len);
+
+ jvalue *mm = m;
+ int i = 0;
+ for (i; i < len; i++) {
+ *mm = (jvalue)(*env)->GetObjectArrayElement(env, params, i);
+ mm += 1;
+ }
+
+ jobject object = (*env)->NewGlobalRef(env, NULL);
+
+ if (strcmp(retValuestr, "void") == 0) {
+ object = callVoidMethod(env, obj, staticValue, methodID, m);
+ } else if (strcmp(retValuestr, "int") == 0) {
+ object = callIntMethod(env, obj, staticValue, methodID, m);
+ } else if (strcmp(retValuestr, "java.lang.Object") == 0) {
+ object = callObjectMethod(env, obj, staticValue, methodID, m);
+ } else {
+ jclass exc = (*env)->FindClass(env, "java.lang.NotImplementedException");
+ (*env)->ThrowNew(env, exc, "required retValue: bool/int/object");
+ }
+
+ (*env)->ReleaseStringUTFChars(env, methodName, methodstr);
+ (*env)->ReleaseStringUTFChars(env, descriptor, descriptorstr);
+ (*env)->ReleaseStringUTFChars(env, retValue, retValuestr);
+
+ return object;
+}
+