OSDN Git Service

Cherry-pick recent WebKit changes to JavaClassJSC.cpp
authorSteve Block <steveblock@google.com>
Thu, 11 Feb 2010 14:16:22 +0000 (14:16 +0000)
committerSteve Block <steveblock@google.com>
Thu, 11 Feb 2010 14:16:22 +0000 (14:16 +0000)
These changes were made in http://trac.webkit.org/changeset/53865, so should
have been picked up in the last WebKit merge to r54127, but were somehow missed.

Change-Id: Id21807fe9bf6507a591b6b12e914aea41a62c3de

WebCore/bridge/jni/jsc/JavaClassJSC.cpp

index 350c8ae..bbe3871 100644 (file)
@@ -41,52 +41,57 @@ JavaClass::JavaClass(jobject anInstance)
 
     if (!aClass) {
         fprintf(stderr, "%s:  unable to call getClass on instance %p\n", __PRETTY_FUNCTION__, anInstance);
+        m_name = strdup("<Unknown>");
         return;
     }
 
-    jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;");
-    const char* classNameC = getCharactersFromJString(className);
-    m_name = strdup(classNameC);
-    releaseCharactersForJString(className, classNameC);
+    if (jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;")) {
+        const char* classNameC = getCharactersFromJString(className);
+        m_name = strdup(classNameC);
+        releaseCharactersForJString(className, classNameC);
+    } else
+        m_name = strdup("<Unknown>");
 
     int i;
     JNIEnv* env = getJNIEnv();
 
     // Get the fields
-    jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;");
-    int numFields = env->GetArrayLength(fields);
-    for (i = 0; i < numFields; i++) {
-        jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
-        JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
-        {
-            JSLock lock(SilenceAssertionsOnly);
-            m_fields.set(((UString)aField->name()).rep(), aField);
+    if (jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;")) {
+        int numFields = env->GetArrayLength(fields);
+        for (i = 0; i < numFields; i++) {
+            jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
+            JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
+            {
+                JSLock lock(SilenceAssertionsOnly);
+                m_fields.set(((UString)aField->name()).rep(), aField);
+            }
+            env->DeleteLocalRef(aJField);
         }
-        env->DeleteLocalRef(aJField);
+        env->DeleteLocalRef(fields);
     }
 
     // Get the methods
-    jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;");
-    int numMethods = env->GetArrayLength(methods);
-    for (i = 0; i < numMethods; i++) {
-        jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
-        JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
-        MethodList* methodList;
-        {
-            JSLock lock(SilenceAssertionsOnly);
-
-            methodList = m_methods.get(((UString)aMethod->name()).rep());
-            if (!methodList) {
-                methodList = new MethodList();
-                m_methods.set(((UString)aMethod->name()).rep(), methodList);
+    if (jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;")) {
+        int numMethods = env->GetArrayLength(methods);
+        for (i = 0; i < numMethods; i++) {
+            jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
+            JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
+            MethodList* methodList;
+            {
+                JSLock lock(SilenceAssertionsOnly);
+
+                methodList = m_methods.get(((UString)aMethod->name()).rep());
+                if (!methodList) {
+                    methodList = new MethodList();
+                    m_methods.set(((UString)aMethod->name()).rep(), methodList);
+                }
             }
+            methodList->append(aMethod);
+            env->DeleteLocalRef(aJMethod);
         }
-        methodList->append(aMethod);
-        env->DeleteLocalRef(aJMethod);
+        env->DeleteLocalRef(methods);
     }
 
-    env->DeleteLocalRef(fields);
-    env->DeleteLocalRef(methods);
     env->DeleteLocalRef(aClass);
 }