[java-atk-wrapper] Factorize code to get ac jobjects from AtkObjects



commit 04d525765b60daddb74756975823dd9ef4eb2ff1
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Fri Aug 2 19:01:28 2019 +0200

    Factorize code to get ac jobjects from AtkObjects

 jni/src/jawaction.c       |  97 +++------------
 jni/src/jawcomponent.c    | 101 +++------------
 jni/src/jaweditabletext.c | 106 +++-------------
 jni/src/jawhyperlink.c    |  69 ++---------
 jni/src/jawhypertext.c    |  42 +------
 jni/src/jawimage.c        |  58 ++-------
 jni/src/jawobject.c       | 100 +++------------
 jni/src/jawselection.c    |  94 ++------------
 jni/src/jawtable.c        | 306 +++++++---------------------------------------
 jni/src/jawtablecell.c    | 114 ++++-------------
 jni/src/jawtext.c         | 228 ++++------------------------------
 jni/src/jawutil.h         |  27 ++++
 jni/src/jawvalue.c        |  72 +++--------
 13 files changed, 231 insertions(+), 1183 deletions(-)
---
diff --git a/jni/src/jawaction.c b/jni/src/jawaction.c
index abad372..bccfc71 100644
--- a/jni/src/jawaction.c
+++ b/jni/src/jawaction.c
@@ -39,6 +39,9 @@ typedef struct _ActionData {
   jstring jstrActionKeybinding;
 } ActionData;
 
+#define JAW_GET_ACTION(action, def_ret) \
+    JAW_GET_OBJ_IFACE(action, INTERFACE_ACTION, ActionData, atk_action, jniEnv, atk_action, def_ret)
+
 void
 jaw_action_interface_init (AtkActionIface *iface, gpointer data)
 {
@@ -114,18 +117,7 @@ static gboolean
 jaw_action_do_action (AtkAction *action, gint i)
 {
   JAW_DEBUG_C("%p, %d", action, i);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_action = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return FALSE;
-  }
+  JAW_GET_ACTION(action, FALSE);
 
   jclass classAtkAction = (*jniEnv)->FindClass(jniEnv,
                                                "org/GNOME/Accessibility/AtkAction");
@@ -145,18 +137,7 @@ static gint
 jaw_action_get_n_actions (AtkAction *action)
 {
   JAW_DEBUG_C("%p", action);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_action = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return 0;
-  }
+  JAW_GET_ACTION(action, 0);
 
   jclass classAtkAction = (*jniEnv)->FindClass(jniEnv,
                                                "org/GNOME/Accessibility/AtkAction");
@@ -173,18 +154,7 @@ static const gchar*
 jaw_action_get_description (AtkAction *action, gint i)
 {
   JAW_DEBUG_C("%p, %d", action, i);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_action = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return NULL;
-  }
+  JAW_GET_ACTION(action, NULL);
 
   jclass classAtkAction = (*jniEnv)->FindClass(jniEnv,
                                                "org/GNOME/Accessibility/AtkAction");
@@ -222,18 +192,7 @@ static gboolean
 jaw_action_set_description (AtkAction *action, gint i, const gchar *description)
 {
   JAW_DEBUG_C("%p, %d, %s", action, i, description);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_action = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return FALSE;
-  }
+  JAW_GET_ACTION(action, FALSE);
 
   jclass classAtkAction = (*jniEnv)->FindClass(jniEnv,
                                                "org/GNOME/Accessibility/AtkAction");
@@ -254,33 +213,22 @@ static const gchar*
 jaw_action_get_localized_name (AtkAction *action, gint i)
 {
   JAW_DEBUG_C("%p, %d", action, i);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_action = (*env)->NewGlobalRef(env, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return NULL;
-  }
+  JAW_GET_ACTION(action, NULL);
 
-  jclass classAtkAction = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkAction");
-  jmethodID jmid = (*env)->GetMethodID(env,
+  jclass classAtkAction = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkAction");
+  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
                                        classAtkAction,
                                        "getLocalizedName",
                                        "(I)Ljava/lang/String;");
-  jstring jstr = (*env)->CallObjectMethod(env, atk_action, jmid, (jint)i);
-  (*env)->DeleteGlobalRef(env, atk_action);
+  jstring jstr = (*jniEnv)->CallObjectMethod(jniEnv, atk_action, jmid, (jint)i);
+  (*jniEnv)->DeleteGlobalRef(jniEnv, atk_action);
   if (data->localized_name != NULL)
   {
-    (*env)->ReleaseStringUTFChars(env, data->jstrLocalizedName, data->localized_name);
-    (*env)->DeleteGlobalRef(env, data->jstrLocalizedName);
+    (*jniEnv)->ReleaseStringUTFChars(jniEnv, data->jstrLocalizedName, data->localized_name);
+    (*jniEnv)->DeleteGlobalRef(jniEnv, data->jstrLocalizedName);
   }
-  data->jstrLocalizedName = (*env)->NewGlobalRef(env, jstr);
-  data->localized_name = (gchar*)(*env)->GetStringUTFChars(env, data->jstrLocalizedName, NULL);
+  data->jstrLocalizedName = (*jniEnv)->NewGlobalRef(jniEnv, jstr);
+  data->localized_name = (gchar*)(*jniEnv)->GetStringUTFChars(jniEnv, data->jstrLocalizedName, NULL);
   return data->localized_name;
 }
 
@@ -288,18 +236,7 @@ static const gchar*
 jaw_action_get_keybinding (AtkAction *action, gint i)
 {
   JAW_DEBUG_C("%p, %d", action, i);
-  JawObject *jaw_obj = JAW_OBJECT(action);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  ActionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_ACTION);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_action = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_action);
-  if (!atk_action) {
-    JAW_DEBUG_I("atk_action == NULL");
-    return NULL;
-  }
+  JAW_GET_ACTION(action, NULL);
 
   jclass classAtkAction = (*jniEnv)->FindClass(jniEnv,
                                                "org/GNOME/Accessibility/AtkAction");
diff --git a/jni/src/jawcomponent.c b/jni/src/jawcomponent.c
index 9a9fc05..c3ae34f 100644
--- a/jni/src/jawcomponent.c
+++ b/jni/src/jawcomponent.c
@@ -56,6 +56,9 @@ typedef struct _ComponentData {
   jobject atk_component;
 } ComponentData;
 
+#define JAW_GET_COMPONENT(component, def_ret) \
+  JAW_GET_OBJ_IFACE(component, INTERFACE_COMPONENT, ComponentData, atk_component, jniEnv, atk_component, 
def_ret)
+
 void
 jaw_component_interface_init (AtkComponentIface *iface, gpointer data)
 {
@@ -116,18 +119,7 @@ static gboolean
 jaw_component_contains (AtkComponent *component, gint x, gint y, AtkCoordType coord_type)
 {
   JAW_DEBUG_C("%p, %d, %d, %d", component, x, y, coord_type);
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    return FALSE;
-  }
+  JAW_GET_COMPONENT(component, FALSE);
 
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkComponent");
@@ -152,18 +144,7 @@ static AtkObject*
 jaw_component_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type)
 {
   JAW_DEBUG_C("%p, %d, %d, %d", component, x, y, coord_type);
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    return NULL;
-  }
+  JAW_GET_COMPONENT(component, NULL);
 
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkComponent");
@@ -199,30 +180,15 @@ jaw_component_get_extents (AtkComponent *component,
   if (x == NULL || y == NULL || width == NULL || height == NULL)
     return;
 
+  (*x) = 0;
+  (*y) = 0;
+  (*width) = 0;
+  (*height) = 0;
+
   if (component == NULL)
     return;
 
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    (*x) = 0;
-    (*y) = 0;
-    (*width) = 0;
-    (*height) = 0;
-    return;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj,
-                                                      INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    (*x) = 0;
-    (*y) = 0;
-    (*width) = 0;
-    (*height) = 0;
-    return;
-  }
+  JAW_GET_COMPONENT(component, );
 
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkComponent");
@@ -237,10 +203,6 @@ jaw_component_get_extents (AtkComponent *component,
   if (jrectangle == NULL)
   {
     JAW_DEBUG_I("jrectangle == NULL");
-    (*x) = 0;
-    (*y) = 0;
-    (*width) = 0;
-    (*height) = 0;
     return;
   }
 
@@ -264,18 +226,8 @@ jaw_component_set_extents (AtkComponent *component,
                            AtkCoordType coord_type)
 {
   JAW_DEBUG_C("%p, %d, %d, %d, %d, %d", component, x, y, width, height, coord_type);
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    return FALSE;
-  }
+  JAW_GET_COMPONENT(component, FALSE);
+
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkComponent");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkComponent, "set_extents", "(IIIII)Z");
   jboolean assigned = (*jniEnv)->CallBooleanMethod(jniEnv, atk_component, jmid, (jint)x, (jint)y, 
(jint)width, (jint)height, (jint)coord_type);
@@ -287,18 +239,7 @@ static gboolean
 jaw_component_grab_focus (AtkComponent *component)
 {
   JAW_DEBUG_C("%p", component);
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    return FALSE;
-  }
+  JAW_GET_COMPONENT(component, FALSE);
 
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkComponent");
@@ -315,19 +256,7 @@ static AtkLayer
 jaw_component_get_layer (AtkComponent *component)
 {
   JAW_DEBUG_C("%p", component);
-  JawObject *jaw_obj = JAW_OBJECT(component);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  ComponentData *data = jaw_object_get_interface_data(jaw_obj,
-                                                      INTERFACE_COMPONENT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_component = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_component);
-  if (!atk_component) {
-    JAW_DEBUG_I("atk_component == NULL");
-    return 0;
-  }
+  JAW_GET_COMPONENT(component, 0);
 
   jclass classAtkComponent = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkComponent");
diff --git a/jni/src/jaweditabletext.c b/jni/src/jaweditabletext.c
index 61954e6..3d8e71e 100644
--- a/jni/src/jaweditabletext.c
+++ b/jni/src/jaweditabletext.c
@@ -50,6 +50,9 @@ typedef struct _EditableTextData {
   jobject atk_editable_text;
 }EditableTextData;
 
+#define JAW_GET_EDITABLETEXT(text, def_ret) \
+  JAW_GET_OBJ_IFACE(text, INTERFACE_EDITABLE_TEXT, EditableTextData, atk_editable_text, jniEnv, 
atk_editable_text, def_ret)
+
 void
 jaw_editable_text_interface_init (AtkEditableTextIface *iface, gpointer data)
 {
@@ -105,18 +108,7 @@ jaw_editable_text_set_text_contents (AtkEditableText *text,
                                      const gchar *string)
 {
   JAW_DEBUG_C("%p, %s", text, string);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -137,18 +129,7 @@ jaw_editable_text_insert_text (AtkEditableText *text,
                                gint *position)
 {
   JAW_DEBUG_C("%p, %s, %d, %p", text, string, length, position);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -173,19 +154,7 @@ jaw_editable_text_copy_text (AtkEditableText *text,
                              gint end_pos)
 {
   JAW_DEBUG_C("%p, %d, %d", text, start_pos, end_pos);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj,
-                                                         INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -206,18 +175,7 @@ jaw_editable_text_cut_text (AtkEditableText *text,
                             gint start_pos, gint end_pos)
 {
   JAW_DEBUG_C("%p, %d, %d", text, start_pos, end_pos);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -239,19 +197,7 @@ jaw_editable_text_delete_text (AtkEditableText *text,
                                gint end_pos)
 {
   JAW_DEBUG_C("%p, %d, %d", text, start_pos, end_pos);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj,
-                                                         INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -272,19 +218,7 @@ jaw_editable_text_paste_text (AtkEditableText *text,
                               gint position)
 {
   JAW_DEBUG_C("%p, %d", text, position);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj,
-                                                         INTERFACE_EDITABLE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return;
-  }
+  JAW_GET_EDITABLETEXT(text, );
 
   jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv,
                                                      "org/GNOME/Accessibility/AtkEditableText");
@@ -306,29 +240,19 @@ jaw_editable_text_set_run_attributes(AtkEditableText *text,
                                      gint             end_offset)
 {
   JAW_DEBUG_C("%p, %p, %d, %d", text, attrib_set, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if(!jaw_obj){
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_editable_text = (*env)->NewGlobalRef(env, data->atk_editable_text);
-  if (!atk_editable_text) {
-    JAW_DEBUG_I("atk_editable_text == NULL");
-    return FALSE;
-  }
-  jclass classAtkEditableText = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkEditableText");
-  jmethodID jmid = (*env)->GetMethodID(env,
+  JAW_GET_EDITABLETEXT(text, FALSE);
+
+  jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText");
+  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
                                        classAtkEditableText,
                                        "setRunAttributes",
                                        "(Ljavax/swing/text/AttributeSet;II)Z");
-  jboolean jresult = (*env)->CallBooleanMethod(env,
+  jboolean jresult = (*jniEnv)->CallBooleanMethod(jniEnv,
                                                atk_editable_text,
                                                jmid,
                                                (jobject)attrib_set,
                                                (jint)start_offset,
                                                (jint)end_offset);
-  (*env)->DeleteGlobalRef(env, atk_editable_text);
+  (*jniEnv)->DeleteGlobalRef(jniEnv, atk_editable_text);
   return jresult;
 }
diff --git a/jni/src/jawhyperlink.c b/jni/src/jawhyperlink.c
index 69cdc74..a19c145 100644
--- a/jni/src/jawhyperlink.c
+++ b/jni/src/jawhyperlink.c
@@ -37,6 +37,9 @@ static gint                   jaw_hyperlink_get_n_anchors             (AtkHyperlink         
  *atk_hyperlink);
 
 G_DEFINE_TYPE (JawHyperlink, jaw_hyperlink, ATK_TYPE_HYPERLINK)
 
+#define JAW_GET_HYPERLINK(atk_hyperlink, def_ret) \
+    JAW_GET_OBJ(atk_hyperlink, JAW_HYPERLINK, JawHyperlink, jaw_hyperlink, jhyperlink, jniEnv, jhyperlink, 
def_ret)
+
 JawHyperlink*
 jaw_hyperlink_new (jobject jhyperlink)
 {
@@ -100,16 +103,7 @@ jaw_hyperlink_get_uri (AtkHyperlink *atk_hyperlink,
                        gint i)
 {
        JAW_DEBUG_C("%p, %d", atk_hyperlink, i);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return NULL;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return NULL;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, NULL);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "get_uri", 
"(I)Ljava/lang/String;");
@@ -132,16 +126,7 @@ jaw_hyperlink_get_object (AtkHyperlink *atk_hyperlink,
                        gint i)
 {
        JAW_DEBUG_C("%p, %d", atk_hyperlink, i);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return NULL;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return NULL;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, NULL);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "get_object", 
"(I)Ljavax/accessibility/AccessibleContext;");
@@ -160,16 +145,7 @@ static gint
 jaw_hyperlink_get_end_index (AtkHyperlink *atk_hyperlink)
 {
        JAW_DEBUG_C("%p", atk_hyperlink);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return 0;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return 0;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, 0);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "get_end_index", "()I");
@@ -182,16 +158,7 @@ jaw_hyperlink_get_end_index (AtkHyperlink *atk_hyperlink)
 static gint jaw_hyperlink_get_start_index (AtkHyperlink        *atk_hyperlink)
 {
        JAW_DEBUG_C("%p", atk_hyperlink);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return 0;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return 0;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, 0);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "get_start_index", "()I");
@@ -204,16 +171,7 @@ static gint jaw_hyperlink_get_start_index (AtkHyperlink    *atk_hyperlink)
 static gboolean jaw_hyperlink_is_valid (AtkHyperlink *atk_hyperlink)
 {
        JAW_DEBUG_C("%p", atk_hyperlink);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return FALSE;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return FALSE;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, FALSE);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "is_valid", "()Z");
@@ -226,16 +184,7 @@ static gboolean jaw_hyperlink_is_valid (AtkHyperlink *atk_hyperlink)
 static gint jaw_hyperlink_get_n_anchors (AtkHyperlink *atk_hyperlink)
 {
        JAW_DEBUG_C("%p", atk_hyperlink);
-       JawHyperlink *jaw_hyperlink = JAW_HYPERLINK(atk_hyperlink);
-       if (!jaw_hyperlink) {
-               JAW_DEBUG_I("jaw_hyperlink == NULL");
-               return 0;
-       }
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject jhyperlink = (*jniEnv)->NewGlobalRef(jniEnv, jaw_hyperlink->jhyperlink);
-       if (!jhyperlink) {
-               return 0;
-       }
+       JAW_GET_HYPERLINK(atk_hyperlink, 0);
 
        jclass classAtkHyperlink = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHyperlink");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHyperlink, "get_n_anchors", "()I");
diff --git a/jni/src/jawhypertext.c b/jni/src/jawhypertext.c
index 0ecc979..077ea29 100644
--- a/jni/src/jawhypertext.c
+++ b/jni/src/jawhypertext.c
@@ -34,6 +34,9 @@ typedef struct _HypertextData {
        GHashTable *link_table;
 } HypertextData;
 
+#define JAW_GET_HYPERTEXT(hypertext, def_ret) \
+  JAW_GET_OBJ_IFACE(hypertext, INTERFACE_HYPERTEXT, HypertextData, atk_hypertext, jniEnv, atk_hypertext, 
def_ret)
+
 void
 jaw_hypertext_interface_init (AtkHypertextIface *iface, gpointer data)
 {
@@ -87,18 +90,7 @@ static AtkHyperlink*
 jaw_hypertext_get_link (AtkHypertext *hypertext, gint link_index)
 {
        JAW_DEBUG_C("%p, %d", hypertext, link_index);
-       JawObject *jaw_obj = JAW_OBJECT(hypertext);
-       if(!jaw_obj){
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return NULL;
-       }
-       HypertextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_HYPERTEXT);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_hypertext = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_hypertext);
-       if (!atk_hypertext) {
-               JAW_DEBUG_I("atk_hypertext == NULL");
-               return NULL;
-       }
+       JAW_GET_HYPERTEXT(hypertext, NULL);
 
        jclass classAtkHypertext = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHypertext");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHypertext, "get_link", 
"(I)Lorg/GNOME/Accessibility/AtkHyperlink;");
@@ -119,18 +111,7 @@ static gint
 jaw_hypertext_get_n_links (AtkHypertext *hypertext)
 {
        JAW_DEBUG_C("%p", hypertext);
-       JawObject *jaw_obj = JAW_OBJECT(hypertext);
-       if(!jaw_obj){
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return 0;
-       }
-       HypertextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_HYPERTEXT);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_hypertext = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_hypertext);
-       if (!atk_hypertext) {
-               JAW_DEBUG_I("atk_hypertext == NULL");
-               return 0;
-       }
+       JAW_GET_HYPERTEXT(hypertext, 0);
 
        jclass classAtkHypertext = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHypertext");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHypertext, "get_n_links", "()I");
@@ -144,18 +125,7 @@ static gint
 jaw_hypertext_get_link_index (AtkHypertext *hypertext, gint char_index)
 {
        JAW_DEBUG_C("%p, %d", hypertext, char_index);
-       JawObject *jaw_obj = JAW_OBJECT(hypertext);
-       if(!jaw_obj){
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return 0;
-       }
-       HypertextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_HYPERTEXT);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_hypertext = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_hypertext);
-       if (!atk_hypertext) {
-               JAW_DEBUG_I("atk_hypertext == NULL");
-               return 0;
-       }
+       JAW_GET_HYPERTEXT(hypertext, 0);
 
        jclass classAtkHypertext = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkHypertext");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkHypertext, "get_link_index", "(I)I");
diff --git a/jni/src/jawimage.c b/jni/src/jawimage.c
index 9faf9b8..833fb11 100644
--- a/jni/src/jawimage.c
+++ b/jni/src/jawimage.c
@@ -37,6 +37,9 @@ typedef struct _ImageData {
        jstring jstrImageDescription;
 } ImageData;
 
+#define JAW_GET_IMAGE(image, def_ret) \
+  JAW_GET_OBJ_IFACE(image, INTERFACE_IMAGE, ImageData, atk_image, jniEnv, atk_image, def_ret)
+
 void
 jaw_image_interface_init (AtkImageIface *iface, gpointer data)
 {
@@ -89,22 +92,9 @@ jaw_image_get_image_position (AtkImage *image,
                gint *x, gint *y, AtkCoordType coord_type)
 {
        JAW_DEBUG_C("%p, %p, %p, %d", image, x, y, coord_type);
-       JawObject *jaw_obj = JAW_OBJECT(image);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               (*x) = 0;
-               (*y) = 0;
-               return;
-       }
-       ImageData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_IMAGE);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_image = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_image);
-       if (!atk_image) {
-               JAW_DEBUG_I("atk_image == NULL");
-               (*x) = 0;
-               (*y) = 0;
-               return;
-       }
+       (*x) = 0;
+       (*y) = 0;
+       JAW_GET_IMAGE(image, );
 
        jclass classAtkImage = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkImage");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkImage, "get_image_position", 
"(I)Ljava/awt/Point;");
@@ -113,8 +103,6 @@ jaw_image_get_image_position (AtkImage *image,
 
        if (jpoint == NULL) {
                JAW_DEBUG_I("jpoint == NULL");
-               (*x) = 0;
-               (*y) = 0;
                return;
        }
 
@@ -132,18 +120,7 @@ static const gchar*
 jaw_image_get_image_description (AtkImage *image)
 {
        JAW_DEBUG_C("%p", image);
-       JawObject *jaw_obj = JAW_OBJECT(image);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return NULL;
-       }
-       ImageData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_IMAGE);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_image = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_image);
-       if (!atk_image) {
-               JAW_DEBUG_I("atk_image == NULL");
-               return NULL;
-       }
+       JAW_GET_IMAGE(image, NULL);
 
        jclass classAtkImage = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkImage");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkImage, "get_image_description", 
"()Ljava/lang/String;");
@@ -165,22 +142,9 @@ static void
 jaw_image_get_image_size (AtkImage *image, gint *width, gint *height)
 {
        JAW_DEBUG_C("%p, %p, %p", image, width, height);
-       JawObject *jaw_obj = JAW_OBJECT(image);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               (*width) = 0;
-               (*height) = 0;
-               return;
-       }
-       ImageData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_IMAGE);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_image = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_image);
-       if (!atk_image) {
-               JAW_DEBUG_I("atk_image == NULL");
-               (*width) = 0;
-               (*height) = 0;
-               return;
-       }
+       (*width) = 0;
+       (*height) = 0;
+       JAW_GET_IMAGE(image, );
 
        jclass classAtkImage = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkImage");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkImage, "get_image_size", 
"()Ljava/awt/Dimension;");
@@ -189,8 +153,6 @@ jaw_image_get_image_size (AtkImage *image, gint *width, gint *height)
 
        if (jdimension == NULL) {
                JAW_DEBUG_I("jdimension == NULL");
-               (*width) = 0;
-               (*height) = 0;
                return;
        }
 
diff --git a/jni/src/jawobject.c b/jni/src/jawobject.c
index 425305e..3507cfb 100644
--- a/jni/src/jawobject.c
+++ b/jni/src/jawobject.c
@@ -73,6 +73,9 @@ static guint jaw_window_signals[LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE (JawObject, jaw_object, ATK_TYPE_OBJECT);
 
+#define JAW_GET_OBJECT(atk_obj, def_ret) \
+  JAW_GET_OBJ(atk_obj, JAW_OBJECT, JawObject, jaw_obj, acc_context, jniEnv, ac, def_ret)
+
 static guint
 jaw_window_add_signal (const gchar *name, JawObjectClass *klass)
 {
@@ -219,11 +222,7 @@ jaw_object_get_parent(AtkObject *atk_obj)
   if (jaw_toplevel_get_child_index(JAW_TOPLEVEL(atk_get_root()), atk_obj) != -1)
     return ATK_OBJECT(atk_get_root());
 
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac)
-    return NULL;
+  JAW_GET_OBJECT(atk_obj, NULL);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv,"org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleParent", 
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
@@ -246,12 +245,8 @@ static void
 jaw_object_set_parent(AtkObject *atk_obj, AtkObject *parent)
 {
   JAW_DEBUG_C("%p, %p", atk_obj, parent);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return;
-  }
+  JAW_GET_OBJECT(atk_obj, );
+
   JawObject *jaw_par = JAW_OBJECT(parent);
   jobject pa = (*jniEnv)->NewGlobalRef(jniEnv, jaw_par->acc_context);
   if (!pa) {
@@ -271,8 +266,6 @@ static const gchar*
 jaw_object_get_name (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p", atk_obj);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
 
   atk_obj->name = (gchar *)ATK_OBJECT_CLASS (parent_class)->get_name (atk_obj);
 
@@ -292,10 +285,7 @@ jaw_object_get_name (AtkObject *atk_obj)
     }
   }
 
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
+  JAW_GET_OBJECT(atk_obj, NULL);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleName", 
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
@@ -325,12 +315,7 @@ jaw_object_get_name (AtkObject *atk_obj)
 static void jaw_object_set_name (AtkObject *atk_obj, const gchar *name)
 {
   JAW_DEBUG_C("%p, %s", atk_obj, name);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return;
-  }
+  JAW_GET_OBJECT(atk_obj, );
 
   jstring jstr = NULL;
   if (name) {
@@ -348,12 +333,7 @@ static const gchar*
 jaw_object_get_description (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p", atk_obj);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
+  JAW_GET_OBJECT(atk_obj, NULL);
 
   jclass atkObject = (*jniEnv)->FindClass ( jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleDescription", 
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
@@ -383,12 +363,7 @@ jaw_object_get_description (AtkObject *atk_obj)
 static void jaw_object_set_description (AtkObject *atk_obj, const gchar *description)
 {
   JAW_DEBUG_C("%p, %s", atk_obj, description);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return;
-  }
+  JAW_GET_OBJECT(atk_obj, );
 
   jstring jstr = NULL;
   if (description) {
@@ -407,12 +382,7 @@ static gint
 jaw_object_get_n_children (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p", atk_obj);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return 0;
-  }
+  JAW_GET_OBJECT(atk_obj, 0);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleChildrenCount", 
"(Ljavax/accessibility/AccessibleContext;)I");
@@ -432,12 +402,7 @@ jaw_object_get_index_in_parent (AtkObject *atk_obj)
     return jaw_toplevel_get_child_index(JAW_TOPLEVEL(atk_get_root()), atk_obj);
   }
 
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return 0;
-  }
+  JAW_GET_OBJECT(atk_obj, 0);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleIndexInParent", 
"(Ljavax/accessibility/AccessibleContext;)I");
@@ -457,11 +422,8 @@ jaw_object_get_role (AtkObject *atk_obj)
     return atk_obj->role;
   }
 
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac)
-    return ATK_ROLE_INVALID;
+  JAW_GET_OBJECT(atk_obj, ATK_ROLE_INVALID);
+
   AtkRole role = jaw_util_get_atk_role_from_AccessibleContext(ac);
   (*jniEnv)->DeleteGlobalRef(jniEnv, ac);
   return role;
@@ -478,16 +440,11 @@ static AtkStateSet*
 jaw_object_ref_state_set (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p", atk_obj);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
+  JAW_GET_OBJECT(atk_obj, NULL);
+
   AtkStateSet* state_set = jaw_obj->state_set;
   atk_state_set_clear_states( state_set );
 
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
-
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getArrayAccessibleState", 
"(Ljavax/accessibility/AccessibleContext;)[Ljavax/accessibility/AccessibleState;");
   jobject jstate_arr = (*jniEnv)->CallStaticObjectMethod (jniEnv, atkObject, jmid, ac);
@@ -517,12 +474,7 @@ jaw_object_ref_state_set (AtkObject *atk_obj)
 static const gchar *jaw_object_get_object_locale (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p", atk_obj);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
+  JAW_GET_OBJECT(atk_obj, NULL);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getLocale", 
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
@@ -553,18 +505,11 @@ static AtkRelationSet*
 jaw_object_ref_relation_set (AtkObject *atk_obj)
 {
   JAW_DEBUG_C("%p)", atk_obj);
+  JAW_GET_OBJECT(atk_obj, NULL);
+
   if (atk_obj->relation_set)
     g_object_unref(G_OBJECT(atk_obj->relation_set));
   atk_obj->relation_set = atk_relation_set_new();
-  if(atk_obj == NULL)
-    return NULL;
-
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getArrayAccessibleRelation", 
"(Ljavax/accessibility/AccessibleContext;)[Lorg/GNOME/Accessibility/AtkObject$WrapKeyAndTarget;");
@@ -609,12 +554,7 @@ static AtkObject*
 jaw_object_ref_child(AtkObject *atk_obj, gint i)
 {
   JAW_DEBUG_C("%p, %d", atk_obj, i);
-  JawObject *jaw_obj = JAW_OBJECT(atk_obj);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject ac = (*jniEnv)->NewGlobalRef(jniEnv, jaw_obj->acc_context);
-  if (!ac) {
-    return NULL;
-  }
+  JAW_GET_OBJECT(atk_obj, NULL);
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
   jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getAccessibleChild", 
"(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;" );
diff --git a/jni/src/jawselection.c b/jni/src/jawselection.c
index d85d583..ea2596a 100644
--- a/jni/src/jawselection.c
+++ b/jni/src/jawselection.c
@@ -38,6 +38,9 @@ typedef struct _SelectionData {
        jobject atk_selection;
 } SelectionData;
 
+#define JAW_GET_SELECTION(selection, def_ret) \
+  JAW_GET_OBJ_IFACE(selection, INTERFACE_SELECTION, SelectionData, atk_selection, jniEnv, atk_selection, 
def_ret)
+
 void
 jaw_selection_interface_init (AtkSelectionIface *iface, gpointer data)
 {
@@ -83,18 +86,7 @@ static gboolean
 jaw_selection_add_selection (AtkSelection *selection, gint i)
 {
        JAW_DEBUG_C("%p, %d", selection, i);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return FALSE;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return FALSE;
-       }
+       JAW_GET_SELECTION(selection, FALSE);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "add_selection", "(I)Z");
@@ -108,18 +100,7 @@ static gboolean
 jaw_selection_clear_selection (AtkSelection *selection)
 {
        JAW_DEBUG_C("%p", selection);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return FALSE;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return FALSE;
-       }
+       JAW_GET_SELECTION(selection, FALSE);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "clear_selection", "()Z");
@@ -133,18 +114,7 @@ static AtkObject*
 jaw_selection_ref_selection (AtkSelection *selection, gint i)
 {
        JAW_DEBUG_C("%p, %d", selection, i);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return NULL;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return NULL;
-       }
+       JAW_GET_SELECTION(selection, NULL);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "ref_selection", 
"(I)Ljavax/accessibility/AccessibleContext;");
@@ -165,18 +135,7 @@ static gint
 jaw_selection_get_selection_count (AtkSelection *selection)
 {
        JAW_DEBUG_C("%p", selection);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return 0;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return 0;
-       }
+       JAW_GET_SELECTION(selection, 0);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "get_selection_count", "()I");
@@ -190,18 +149,7 @@ static gboolean
 jaw_selection_is_child_selected (AtkSelection *selection, gint i)
 {
        JAW_DEBUG_C("%p, %d", selection, i);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return FALSE;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return FALSE;
-       }
+       JAW_GET_SELECTION(selection, FALSE);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "is_child_selected", "(I)Z");
@@ -215,18 +163,7 @@ static gboolean
 jaw_selection_remove_selection (AtkSelection *selection, gint i)
 {
        JAW_DEBUG_C("%p, %d", selection, i);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return FALSE;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return FALSE;
-       }
+       JAW_GET_SELECTION(selection, FALSE);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "remove_selection", "(I)Z");
@@ -240,18 +177,7 @@ static gboolean
 jaw_selection_select_all_selection (AtkSelection *selection)
 {
        JAW_DEBUG_C("%p", selection);
-       JawObject *jaw_obj = JAW_OBJECT(selection);
-       if (!jaw_obj) {
-               JAW_DEBUG_I("jaw_obj == NULL");
-               return FALSE;
-       }
-       SelectionData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_SELECTION);
-       JNIEnv *jniEnv = jaw_util_get_jni_env();
-       jobject atk_selection = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_selection);
-       if (!atk_selection) {
-               JAW_DEBUG_I("atk_selection == NULL");
-               return FALSE;
-       }
+       JAW_GET_SELECTION(selection, FALSE);
 
        jclass classAtkSelection = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkSelection");
        jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkSelection, "select_all_selection", "()Z");
diff --git a/jni/src/jawtable.c b/jni/src/jawtable.c
index 9315459..b0e7446 100644
--- a/jni/src/jawtable.c
+++ b/jni/src/jawtable.c
@@ -63,6 +63,9 @@ typedef struct _TableData {
   jstring jstrDescription;
 } TableData;
 
+#define JAW_GET_TABLE(table, def_ret) \
+  JAW_GET_OBJ_IFACE(table, INTERFACE_TABLE, TableData, atk_table, env, atk_table, def_ret)
+
 void
 jaw_table_interface_init (AtkTableIface *iface, gpointer data)
 {
@@ -179,18 +182,7 @@ static gint
 jaw_table_get_index_at (AtkTable *table, gint row, gint column)
 {
   JAW_DEBUG_C("%p, %d, %d", table, row, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_index_at", "(II)I");
@@ -204,18 +196,7 @@ static gint
 jaw_table_get_column_at_index (AtkTable *table, gint index)
 {
   JAW_DEBUG_C("%p, %d", table, index);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_column_at_index", "(I)I");
@@ -229,18 +210,7 @@ static gint
 jaw_table_get_row_at_index (AtkTable *table, gint index)
 {
   JAW_DEBUG_C("%p, %d", table, index);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_row_at_index", "(I)I");
@@ -254,18 +224,7 @@ static gint
 jaw_table_get_n_columns        (AtkTable *table)
 {
   JAW_DEBUG_C("%p", table);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_n_columns", "()I");
@@ -279,18 +238,7 @@ static gint
 jaw_table_get_n_rows (AtkTable *table)
 {
   JAW_DEBUG_C("%p", table);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_n_rows", "()I");
@@ -304,18 +252,7 @@ static gint
 jaw_table_get_column_extent_at (AtkTable *table, gint row, gint        column)
 {
   JAW_DEBUG_C("%p, %d, %d", table, row, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_column_extent_at", "(II)I");
@@ -329,18 +266,7 @@ static gint
 jaw_table_get_row_extent_at (AtkTable *table, gint row, gint column)
 {
   JAW_DEBUG_C("%p, %d, %d", table, row, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_row_extent_at", "(II)I");
@@ -354,18 +280,7 @@ static AtkObject*
 jaw_table_get_caption (AtkTable        *table)
 {
   JAW_DEBUG_C("%p", table);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env,
@@ -388,18 +303,7 @@ static const gchar*
 jaw_table_get_column_description (AtkTable *table, gint        column)
 {
   JAW_DEBUG_C("%p, %d", table, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  };
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_column_description", 
"(I)Ljava/lang/String;");
@@ -422,18 +326,7 @@ static const gchar*
 jaw_table_get_row_description (AtkTable *table, gint row)
 {
   JAW_DEBUG_C("%p, %d", table, row);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_row_description", "(I)Ljava/lang/String;");
@@ -456,18 +349,7 @@ static AtkObject*
 jaw_table_get_column_header (AtkTable *table, gint column)
 {
   JAW_DEBUG_C("%p, %d", table, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_column_header", 
"(I)Ljavax/accessibility/AccessibleContext;");
@@ -486,18 +368,7 @@ static AtkObject*
 jaw_table_get_row_header (AtkTable *table, gint row)
 {
   JAW_DEBUG_C("%p, %d", table, row);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_row_header", 
"(I)Ljavax/accessibility/AccessibleContext;");
@@ -516,18 +387,7 @@ static AtkObject*
 jaw_table_get_summary (AtkTable *table)
 {
   JAW_DEBUG_C("%p", table);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLE(table, NULL);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_summary", 
"()Ljavax/accessibility/AccessibleContext;");
@@ -546,18 +406,7 @@ static gint
 jaw_table_get_selected_columns (AtkTable *table, gint **selected)
 {
   JAW_DEBUG_C("%p, %p", table, selected);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_selected_columns", "()[I");
@@ -585,18 +434,7 @@ static gint
 jaw_table_get_selected_rows (AtkTable *table, gint **selected)
 {
   JAW_DEBUG_C("%p, %p", table, selected);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return 0;
-  }
+  JAW_GET_TABLE(table, 0);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "get_selected_rows", "()[I");
@@ -624,18 +462,7 @@ static gboolean
 jaw_table_is_column_selected (AtkTable *table, gint column)
 {
   JAW_DEBUG_C("%p, %d", table, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return FALSE;
-  }
+  JAW_GET_TABLE(table, FALSE);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "is_column_selected", "(I)Z");
@@ -648,18 +475,7 @@ static gboolean
 jaw_table_is_row_selected (AtkTable *table, gint row)
 {
   JAW_DEBUG_C("%p, %d", table, row);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return FALSE;
-  }
+  JAW_GET_TABLE(table, FALSE);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "is_row_selected", "(I)Z");
@@ -672,18 +488,7 @@ static gboolean
 jaw_table_is_selected (AtkTable *table, gint row, gint column)
 {
   JAW_DEBUG_C("%p, %d, %d", table, row, column);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return FALSE;
-  }
+  JAW_GET_TABLE(table, FALSE);
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkTable, "is_selected", "(II)Z");
@@ -725,18 +530,7 @@ static void
 jaw_table_set_row_description(AtkTable *table, gint row, const gchar *description)
 {
   JAW_DEBUG_C("%p, %d, %s", table, row, description);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return;
-  }
+  JAW_GET_TABLE(table, );
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env,
@@ -752,18 +546,7 @@ static void
 jaw_table_set_column_description(AtkTable *table, gint column, const gchar *description)
 {
   JAW_DEBUG_C("%p, %d, %s", table, column, description);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    return;
-  }
+  JAW_GET_TABLE(table, );
 
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
   jmethodID jmid = (*env)->GetMethodID(env,
@@ -791,28 +574,25 @@ static void
 jaw_table_set_caption(AtkTable *table, AtkObject *caption)
 {
   JAW_DEBUG_C("%p, %p", table, caption);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
+  JAW_GET_TABLE(table, );
+
   JawObject *jcaption = JAW_OBJECT(caption);
   if (!jcaption) {
     JAW_DEBUG_I("jcaption == NULL");
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
   }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
   jclass accessible = (*env)->FindClass (env, "javax/accessibility/Accessible");
   if ( !((*env)->IsInstanceOf(env, jcaption->acc_context, accessible)) )
+  {
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
+  }
   jobject obj = (*env)->NewGlobalRef(env, jcaption->acc_context);
   if (!obj)
-    return;
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    (*env)->DeleteGlobalRef(env, obj);
+  {
+    JAW_DEBUG_I("jcaption obj == NULL");
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
   }
   jclass classAtkTable = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTable");
@@ -826,28 +606,24 @@ static void
 jaw_table_set_summary(AtkTable *table, AtkObject *summary)
 {
   JAW_DEBUG_C("%p, %p", table, summary);
-  JawObject *jaw_obj = JAW_OBJECT(table);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
+  JAW_GET_TABLE(table, );
+
   JawObject *jsummary = JAW_OBJECT(summary);
   if (!jsummary) {
     JAW_DEBUG_I("jsummary == NULL");
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
   }
-  TableData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE);
-  JNIEnv *env = jaw_util_get_jni_env();
   jclass accessible = (*env)->FindClass (env, "javax/accessibility/Accessible");
   if ( !((*env)->IsInstanceOf(env, jsummary->acc_context, accessible)) )
+  {
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
+  }
   jobject obj = (*env)->NewGlobalRef(env, jsummary->acc_context);
-  if (!obj)
-    return;
-  jobject atk_table = (*env)->NewGlobalRef(env, data->atk_table);
-  if (!atk_table) {
-    JAW_DEBUG_I("atk_table == NULL");
-    (*env)->DeleteGlobalRef(env, obj);
+  if (!obj) {
+    JAW_DEBUG_I("jsummary obj == NULL");
+    (*env)->DeleteGlobalRef(env, atk_table);
     return;
   }
 
diff --git a/jni/src/jawtablecell.c b/jni/src/jawtablecell.c
index 8478543..afa6b3e 100644
--- a/jni/src/jawtablecell.c
+++ b/jni/src/jawtablecell.c
@@ -40,6 +40,9 @@ typedef struct _TableCellData {
   jstring jstrDescription;
 } TableCellData;
 
+#define JAW_GET_TABLECELL(cell, def_ret) \
+  JAW_GET_OBJ_IFACE(cell, INTERFACE_TABLE_CELL, TableCellData, atk_table_cell, jniEnv, jatk_table_cell, 
def_ret)
+
 void
 jaw_table_cell_interface_init (AtkTableCellIface *iface, gpointer data)
 {
@@ -94,18 +97,7 @@ static AtkObject*
 jaw_table_cell_get_table(AtkTableCell *cell)
 {
   JAW_DEBUG_C("%p", cell);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLECELL(cell, NULL);
 
   jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv,
                                                   "org/GNOME/Accessibility/AtkTableCell");
@@ -139,18 +131,8 @@ static gboolean
 jaw_table_cell_get_position (AtkTableCell *cell, gint *row, gint *column)
 {
   JAW_DEBUG_C("%p, %p, %p", cell, row, column);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return FALSE;
-  }
+  JAW_GET_TABLECELL(cell, FALSE);
+
   jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
   getPosition (jniEnv, jatk_table_cell, classAtkTableCell, row, column);
   (*jniEnv)->DeleteGlobalRef(jniEnv, jatk_table_cell);
@@ -177,18 +159,8 @@ static gboolean
 jaw_table_cell_get_row_column_span(AtkTableCell *cell, gint *row, gint *column, gint *row_span, gint 
*column_span)
 {
   JAW_DEBUG_C("%p, %p, %p, %p, %p", cell, row, column, row_span, column_span);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return FALSE;
-  }
+  JAW_GET_TABLECELL(cell, FALSE);
+
   jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
   getPosition (jniEnv, jatk_table_cell, classAtkTableCell, row, column);
   getRowSpan (jniEnv, jatk_table_cell, classAtkTableCell, row_span);
@@ -201,22 +173,12 @@ static gint
 jaw_table_cell_get_row_span(AtkTableCell *cell)
 {
   JAW_DEBUG_C("%p", cell);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*env)->NewGlobalRef(env, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return 0;
-  }
+  JAW_GET_TABLECELL(cell, 0);
+
   gint row_span = -1;
-  jclass classAtkTableCell = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTableCell");
-  getRowSpan (env, jatk_table_cell, classAtkTableCell, &row_span);
-  (*env)->DeleteGlobalRef(env, jatk_table_cell);
+  jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
+  getRowSpan (jniEnv, jatk_table_cell, classAtkTableCell, &row_span);
+  (*jniEnv)->DeleteGlobalRef(jniEnv, jatk_table_cell);
   return row_span;
 }
 
@@ -224,22 +186,12 @@ static gint
 jaw_table_cell_get_column_span(AtkTableCell *cell)
 {
   JAW_DEBUG_C("%p", cell);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*env)->NewGlobalRef(env, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return 0;
-  }
+  JAW_GET_TABLECELL(cell, 0);
+
   gint column_span = -1;
-  jclass classAtkTableCell = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkTableCell");
-  getColumnSpan (env, jatk_table_cell, classAtkTableCell, &column_span);
-  (*env)->DeleteGlobalRef(env, jatk_table_cell);
+  jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
+  getColumnSpan (jniEnv, jatk_table_cell, classAtkTableCell, &column_span);
+  (*jniEnv)->DeleteGlobalRef(jniEnv, jatk_table_cell);
   return column_span;
 }
 
@@ -247,18 +199,8 @@ static GPtrArray*
 jaw_table_cell_get_column_header_cells(AtkTableCell *cell)
 {
   JAW_DEBUG_C("%p", cell);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLECELL(cell, NULL);
+
   jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkTableCell, "getAccessibleColumnHeader", 
"()[Ljavax/accessibility/AccessibleContext;");
   jobjectArray ja_ac = (jobjectArray) (*jniEnv)->CallObjectMethod(jniEnv, jatk_table_cell, jmid);
@@ -280,18 +222,8 @@ static GPtrArray*
 jaw_table_cell_get_row_header_cells(AtkTableCell *cell)
 {
   JAW_DEBUG_C("%p", cell);
-  JawObject *jaw_obj = JAW_OBJECT(cell);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TableCellData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TABLE_CELL);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject jatk_table_cell = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_table_cell);
-  if (!jatk_table_cell) {
-    JAW_DEBUG_I("jatk_table_cell == NULL");
-    return NULL;
-  }
+  JAW_GET_TABLECELL(cell, NULL);
+
   jclass classAtkTableCell = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkTableCell");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkTableCell, "getAccessibleRowHeader", 
"()[Ljavax/accessibility/AccessibleContext;");
   jobjectArray ja_ac = (jobjectArray) (*jniEnv)->CallObjectMethod(jniEnv, jatk_table_cell, jmid);
@@ -307,4 +239,4 @@ jaw_table_cell_get_row_header_cells(AtkTableCell *cell)
     g_ptr_array_add(result, jaw_impl);
   }
   return result;
-}
\ No newline at end of file
+}
diff --git a/jni/src/jawtext.c b/jni/src/jawtext.c
index 9f03e12..4a47d00 100644
--- a/jni/src/jawtext.c
+++ b/jni/src/jawtext.c
@@ -94,6 +94,9 @@ typedef struct _TextData {
   jstring jstrText;
 }TextData;
 
+#define JAW_GET_TEXT(text, def_ret) \
+  JAW_GET_OBJ_IFACE(text, INTERFACE_TEXT, TextData, atk_text, jniEnv, atk_text, def_ret)
+
 void
 jaw_text_interface_init (AtkTextIface *iface, gpointer data)
 {
@@ -186,18 +189,7 @@ static gchar*
 jaw_text_get_text (AtkText *text, gint start_offset, gint end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d", text, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return NULL;
-  }
+  JAW_GET_TEXT(text, NULL);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -220,18 +212,7 @@ static gunichar
 jaw_text_get_character_at_offset (AtkText *text, gint offset)
 {
   JAW_DEBUG_C("%p, %d", text, offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return 0;
-  }
+  JAW_GET_TEXT(text, 0);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -284,18 +265,7 @@ jaw_text_get_text_at_offset (AtkText *text,
                              gint *start_offset, gint *end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d, %p, %p", text, offset, boundary_type, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return NULL;
-  }
+  JAW_GET_TEXT(text, NULL);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -325,18 +295,7 @@ jaw_text_get_text_before_offset (AtkText *text,
                                  gint *start_offset, gint *end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d, %p, %p", text, offset, boundary_type, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return NULL;
-  }
+  JAW_GET_TEXT(text, NULL);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -366,18 +325,7 @@ jaw_text_get_text_after_offset (AtkText *text,
                                 gint *start_offset, gint *end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d, %p, %p", text, offset, boundary_type, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return NULL;
-  }
+  JAW_GET_TEXT(text, NULL);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -404,18 +352,7 @@ static gint
 jaw_text_get_caret_offset (AtkText *text)
 {
   JAW_DEBUG_C("%p", text);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return 0;
-  }
+  JAW_GET_TEXT(text, 0);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -436,26 +373,11 @@ jaw_text_get_character_extents (AtkText *text,
                                 AtkCoordType coords)
 {
   JAW_DEBUG_C("%p, %d, %p, %p, %p, %p, %d", text, offset, x, y, width, height, coords);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    *x = 0;
-    *y = 0;
-    *width = 0;
-    *height = 0;
-    return;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    *x = 0;
-    *y = 0;
-    *width = 0;
-    *height = 0;
-    return;
-  }
+  *x = 0;
+  *y = 0;
+  *width = 0;
+  *height = 0;
+  JAW_GET_TEXT(text, );
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -473,10 +395,6 @@ jaw_text_get_character_extents (AtkText *text,
   if (jrect == NULL)
   {
     JAW_DEBUG_I("jrect == NULL");
-    *x = 0;
-    *y = 0;
-    *width = 0;
-    *height = 0;
     return;
   }
 
@@ -487,18 +405,7 @@ static gint
 jaw_text_get_character_count (AtkText *text)
 {
   JAW_DEBUG_C("%p", text);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return 0;
-  }
+  JAW_GET_TEXT(text, 0);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -516,18 +423,7 @@ static gint
 jaw_text_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords)
 {
   JAW_DEBUG_C("%p, %d, %d, %d", text, x, y, coords);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return 0;
-  }
+  JAW_GET_TEXT(text, 0);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
@@ -557,19 +453,9 @@ jaw_text_get_range_extents (AtkText *text,
   {
     return;
   }
+  memset(rect, 0, sizeof(*rect));
 
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return;
-  }
+  JAW_GET_TEXT(text, );
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -597,18 +483,7 @@ static gint
 jaw_text_get_n_selections (AtkText *text)
 {
   JAW_DEBUG_C("%p", text);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return 0;
-  }
+  JAW_GET_TEXT(text, 0);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -626,18 +501,7 @@ static gchar*
 jaw_text_get_selection (AtkText *text, gint selection_num, gint *start_offset, gint *end_offset)
 {
   JAW_DEBUG_C("%p, %d, %p, %p", text, selection_num, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return NULL;
-  }
+  JAW_GET_TEXT(text, NULL);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
@@ -678,18 +542,7 @@ static gboolean
 jaw_text_add_selection (AtkText *text, gint start_offset, gint end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d", text, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return FALSE;
-  }
+  JAW_GET_TEXT(text, FALSE);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
@@ -710,18 +563,7 @@ static gboolean
 jaw_text_remove_selection (AtkText *text, gint selection_num)
 {
   JAW_DEBUG_C("%p, %d", text, selection_num);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return FALSE;
-  }
+  JAW_GET_TEXT(text, FALSE);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
@@ -742,18 +584,7 @@ static gboolean
 jaw_text_set_selection (AtkText *text, gint selection_num, gint start_offset, gint end_offset)
 {
   JAW_DEBUG_C("%p, %d, %d, %d", text, selection_num, start_offset, end_offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return FALSE;
-  }
+  JAW_GET_TEXT(text, FALSE);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
   jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkText, "set_selection", "(III)Z");
@@ -772,18 +603,7 @@ static gboolean
 jaw_text_set_caret_offset (AtkText *text, gint offset)
 {
   JAW_DEBUG_C("%p, %d", text, offset);
-  JawObject *jaw_obj = JAW_OBJECT(text);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return FALSE;
-  }
-  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_text = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_text);
-  if (!atk_text) {
-    JAW_DEBUG_I("atk_text == NULL");
-    return FALSE;
-  }
+  JAW_GET_TEXT(text, FALSE);
 
   jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
                                              "org/GNOME/Accessibility/AtkText");
diff --git a/jni/src/jawutil.h b/jni/src/jawutil.h
index 3b70ed7..21372ed 100644
--- a/jni/src/jawutil.h
+++ b/jni/src/jawutil.h
@@ -116,6 +116,33 @@ gboolean jaw_util_dispatch_key_event (AtkKeyEventStruct *event);
 
 void jaw_util_detach(void);
 
+#define JAW_GET_OBJ_IFACE(o, iface, Data, field, env, name, def_ret) \
+  JawObject *jaw_obj = JAW_OBJECT(o); \
+  if (!jaw_obj) { \
+    JAW_DEBUG_I("jaw_obj == NULL"); \
+    return def_ret; \
+  } \
+  Data *data = jaw_object_get_interface_data(jaw_obj, iface); \
+  JNIEnv *env = jaw_util_get_jni_env(); \
+  jobject name = (*env)->NewGlobalRef(env, data->field); \
+  if (!name) { \
+    JAW_DEBUG_I(#name " == NULL"); \
+    return def_ret; \
+  }
+
+#define JAW_GET_OBJ(o, CAST, JawObject, object_name, field, env, name, def_ret) \
+  JawObject *object_name = CAST(o); \
+  if (!object_name) { \
+    JAW_DEBUG_I(#object_name " == NULL"); \
+    return def_ret; \
+  } \
+  JNIEnv *env = jaw_util_get_jni_env(); \
+  jobject name = (*env)->NewGlobalRef(env, object_name->field); \
+  if (!name) { \
+    JAW_DEBUG_I(#name " == NULL"); \
+    return def_ret; \
+  }
+
 G_END_DECLS
 
 #endif
diff --git a/jni/src/jawvalue.c b/jni/src/jawvalue.c
index 5be92a9..96012e0 100644
--- a/jni/src/jawvalue.c
+++ b/jni/src/jawvalue.c
@@ -36,6 +36,9 @@ typedef struct _ValueData {
   jobject atk_value;
 } ValueData;
 
+#define JAW_GET_VALUE(obj, def_ret) \
+  JAW_GET_OBJ_IFACE(obj, INTERFACE_VALUE, ValueData, atk_value, env, atk_value, def_ret)
+
 void
 jaw_value_interface_init (AtkValueIface *iface, gpointer data)
 {
@@ -154,61 +157,35 @@ jaw_value_get_current_value (AtkValue *obj, GValue *value)
 {
   JAW_DEBUG_C("%p, %p", obj, value);
   if (!value)
-  {
     return;
-  }
+  g_value_unset(value);
+  JAW_GET_VALUE(obj, );
 
-  JawObject *jaw_obj = JAW_OBJECT(obj);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
-  JNIEnv *jniEnv = jaw_util_get_jni_env();
-  jobject atk_value = (*jniEnv)->NewGlobalRef(jniEnv, data->atk_value);
-  if (!atk_value) {
-    JAW_DEBUG_I("atk_value == NULL");
-    return;
-  }
-
-  jclass classAtkValue = (*jniEnv)->FindClass(jniEnv,
+  jclass classAtkValue = (*env)->FindClass(env,
                                               "org/GNOME/Accessibility/AtkValue");
-  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
+  jmethodID jmid = (*env)->GetMethodID(env,
                                           classAtkValue,
                                           "get_current_value",
                                           "()Ljava/lang/Number;");
-  jobject jnumber = (*jniEnv)->CallObjectMethod(jniEnv,
+  jobject jnumber = (*env)->CallObjectMethod(env,
                                                 atk_value,
                                                 jmid);
-  (*jniEnv)->DeleteGlobalRef(jniEnv, atk_value);
+  (*env)->DeleteGlobalRef(env, atk_value);
 
   if (!jnumber)
   {
     return;
   }
 
-  get_g_value_from_java_number(jniEnv, jnumber, value);
+  get_g_value_from_java_number(env, jnumber, value);
 }
 
 static void
 jaw_value_set_value(AtkValue *obj, const gdouble value)
 {
   JAW_DEBUG_C("%p, %lf", obj, value);
-  if (!value)
-    return;
 
-  JawObject *jaw_obj = JAW_OBJECT(obj);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return;
-  }
-  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_value = (*env)->NewGlobalRef(env, data->atk_value);
-  if (!atk_value) {
-    JAW_DEBUG_I("atk_value == NULL");
-    return;
-  }
+  JAW_GET_VALUE(obj, );
 
   jclass classAtkValue = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkValue");
   jmethodID jmid = (*env)->GetMethodID(env,
@@ -223,18 +200,7 @@ static AtkRange*
 jaw_value_get_range(AtkValue *obj)
 {
   JAW_DEBUG_C("%p", obj);
-  JawObject *jaw_obj = JAW_OBJECT(obj);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return NULL;
-  }
-  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_value = (*env)->NewGlobalRef(env, data->atk_value);
-  if (!atk_value) {
-    JAW_DEBUG_I("atk_value == NULL");
-    return NULL;
-  }
+  JAW_GET_VALUE(obj, NULL);
 
   jclass classAtkValue = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkValue");
   jmethodID jmidMin = (*env)->GetMethodID(env, classAtkValue, "getMinimumValue", "()D");
@@ -250,18 +216,8 @@ static gdouble
 jaw_value_get_increment (AtkValue *obj)
 {
   JAW_DEBUG_C("%p", obj);
-  JawObject *jaw_obj = JAW_OBJECT(obj);
-  if (!jaw_obj) {
-    JAW_DEBUG_I("jaw_obj == NULL");
-    return 0;
-  }
-  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
-  JNIEnv *env = jaw_util_get_jni_env();
-  jobject atk_value = (*env)->NewGlobalRef(env, data->atk_value);
-  if (!atk_value) {
-    JAW_DEBUG_I("atk_value == NULL");
-    return 0.;
-  }
+  JAW_GET_VALUE(obj, 0.);
+
   jclass classAtkValue = (*env)->FindClass(env, "org/GNOME/Accessibility/AtkValue");
   jmethodID jmid = (*env)->GetMethodID(env, classAtkValue, "getIncrement", "()D");
   gdouble ret = (*env)->CallDoubleMethod(env, atk_value, jmid);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]