Christian Thalinger
Edwin Steiner
- $Id: jni.c 4552 2006-03-04 17:15:44Z twisti $
+ $Id: jni.c 4559 2006-03-05 23:24:50Z twisti $
*/
}
-/* _Jv_jni_fill_vmargs_from_vargs **********************************************
-
- XXX
-
-*******************************************************************************/
-
-static void _Jv_jni_vmargs_from_vargs(java_objectheader *o, methoddesc *descr,
- vm_arg *vmargs, va_list ap)
-{
- typedesc *paramtypes;
- s4 i;
-
- paramtypes = descr->paramtypes;
-
- /* if method is non-static fill first block and skip `this' pointer */
-
- i = 0;
-
- if (o != NULL) {
- /* the `this' pointer */
- vmargs[0].type = TYPE_ADR;
- vmargs[0].data = (u8) (ptrint) o;
-
- paramtypes++;
- i++;
- }
-
- for (; i < descr->paramcount; i++, paramtypes++) {
- switch (paramtypes->decltype) {
- /* primitive types */
- case PRIMITIVETYPE_BYTE:
- case PRIMITIVETYPE_CHAR:
- case PRIMITIVETYPE_SHORT:
- case PRIMITIVETYPE_BOOLEAN:
- case PRIMITIVETYPE_INT:
- vmargs[i].type = TYPE_INT;
- vmargs[i].data = (s8) va_arg(ap, s4);
- break;
-
- case PRIMITIVETYPE_LONG:
- vmargs[i].type = TYPE_LNG;
- vmargs[i].data = (s8) va_arg(ap, s8);
- break;
-
- case PRIMITIVETYPE_FLOAT:
- vmargs[i].type = TYPE_FLT;
-#if defined(__ALPHA__)
- /* this keeps the assembler function much simpler */
-
- *((jdouble *) (&vmargs[i].data)) = (jdouble) va_arg(ap, jdouble);
-#else
- *((jfloat *) (&vmargs[i].data)) = (jfloat) va_arg(ap, jdouble);
-#endif
- break;
-
- case PRIMITIVETYPE_DOUBLE:
- vmargs[i].type = TYPE_DBL;
- *((jdouble *) (&vmargs[i].data)) = (jdouble) va_arg(ap, jdouble);
- break;
-
- case TYPE_ADR:
- vmargs[i].type = TYPE_ADR;
- vmargs[i].data = (u8) (ptrint) va_arg(ap, void*);
- break;
- }
- }
-}
-
-
/* _Jv_jni_vmargs_from_objectarray *********************************************
XXX
}
-/* _Jv_jni_vmargs_from_objectarray *********************************************
+/* _Jv_jni_CallObjectMethod ****************************************************
- XXX
+ Internal function to call Java Object methods.
*******************************************************************************/
-static void _Jv_jni_vmargs_from_args(java_objectheader *o, methoddesc *descr,
- vm_arg *vmargs, jvalue *args)
+static java_objectheader *_Jv_jni_CallObjectMethod(java_objectheader *o,
+ vftbl_t *vftbl,
+ methodinfo *m, va_list ap)
{
- typedesc *paramtypes;
- s4 i;
- s4 j;
+ methodinfo *resm;
+ java_objectheader *ro;
- paramtypes = descr->paramtypes;
+ STATISTICS(jniinvokation());
- /* if method is non-static fill first block and skip `this' pointer */
+ if (m == NULL) {
+ exceptions_throw_nullpointerexception();
+ return NULL;
+ }
- i = 0;
+ /* Class initialization is done by the JIT compiler. This is ok
+ since a static method always belongs to the declaring class. */
- if (o != NULL) {
- /* the `this' pointer */
- vmargs[0].type = TYPE_ADR;
- vmargs[0].data = (u8) (ptrint) o;
+ if (m->flags & ACC_STATIC) {
+ /* For static methods we reset the object. */
- paramtypes++;
- i++;
- }
+ if (o != NULL)
+ o = NULL;
- for (j = 0; i < descr->paramcount; i++, j++, paramtypes++) {
- switch (paramtypes->decltype) {
- /* primitive types */
- case PRIMITIVETYPE_BOOLEAN:
- case PRIMITIVETYPE_BYTE:
- case PRIMITIVETYPE_CHAR:
- case PRIMITIVETYPE_SHORT:
- case PRIMITIVETYPE_INT:
- vmargs[i].type = TYPE_INT;
- vmargs[i].data = (s8) args[j].i;
- break;
+ /* for convenience */
- case PRIMITIVETYPE_LONG:
- vmargs[i].type = TYPE_LNG;
- vmargs[i].data = (s8) args[j].j;
- break;
+ resm = m;
- case PRIMITIVETYPE_FLOAT:
- vmargs[i].type = TYPE_FLT;
-#if defined(__ALPHA__)
- /* this keeps the assembler function much simpler */
+ } else {
+ /* For instance methods we make a virtual function table lookup. */
- *((jdouble *) (&vmargs[i].data)) = (jdouble) args[j].f;
-#else
- *((jfloat *) (&vmargs[i].data)) = args[j].f;
-#endif
- break;
+ resm = method_vftbl_lookup(vftbl, m);
+ }
- case PRIMITIVETYPE_DOUBLE:
- vmargs[i].type = TYPE_DBL;
- *((jdouble *) (&vmargs[i].data)) = args[j].d;
- break;
+ STATISTICS(jnicallXmethodnvokation());
- case TYPE_ADR:
- vmargs[i].type = TYPE_ADR;
- vmargs[i].data = (u8) (ptrint) args[j].l;
- break;
- }
- }
+ ro = vm_call_method_valist(resm, o, ap);
+
+ return ro;
}
-/* _Jv_jni_CallObjectMethod ****************************************************
+/* _Jv_jni_CallObjectMethodA ***************************************************
Internal function to call Java Object methods.
*******************************************************************************/
-static java_objectheader *_Jv_jni_CallObjectMethod(java_objectheader *o,
- vftbl_t *vftbl,
- methodinfo *m, va_list ap)
+static java_objectheader *_Jv_jni_CallObjectMethodA(java_objectheader *o,
+ vftbl_t *vftbl,
+ methodinfo *m, jvalue *args)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- java_objectheader *ret;
- s4 dumpsize;
+ java_objectheader *ro;
STATISTICS(jniinvokation());
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
STATISTICS(jnicallXmethodnvokation());
- ret = vm_call_method(resm, paramcount, vmargs);
-
- /* release dump area */
-
- dump_release(dumpsize);
+ ro = vm_call_method_jvalue(resm, o, args);
- return ret;
+ return ro;
}
*******************************************************************************/
static jint _Jv_jni_CallIntMethod(java_objectheader *o, vftbl_t *vftbl,
- methodinfo *m, va_list ap, s4 type)
+ methodinfo *m, va_list ap)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- jint ret;
- s4 dumpsize;
+ jint i;
STATISTICS(jniinvokation());
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
STATISTICS(jnicallXmethodnvokation());
- ret = vm_call_method_int(resm, paramcount, vmargs);
+ i = vm_call_method_int_valist(resm, o, ap);
- /* release dump area */
-
- dump_release(dumpsize);
-
- return ret;
+ return i;
}
methodinfo *m, va_list ap)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- jlong ret;
- s4 dumpsize;
+ jlong l;
STATISTICS(jniinvokation());
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
STATISTICS(jnicallXmethodnvokation());
- ret = vm_call_method_long(resm, paramcount, vmargs);
-
- /* release dump area */
+ l = vm_call_method_long_valist(resm, o, ap);
- dump_release(dumpsize);
-
- return ret;
+ return l;
}
methodinfo *m, va_list ap)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- jdouble ret;
- s4 dumpsize;
+ jfloat f;
/* Class initialization is done by the JIT compiler. This is ok
since a static method always belongs to the declaring class. */
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
STATISTICS(jnicallXmethodnvokation());
- ret = vm_call_method_float(resm, paramcount, vmargs);
-
- /* release dump area */
-
- dump_release(dumpsize);
+ f = vm_call_method_float_valist(resm, o, ap);
- return ret;
+ return f;
}
methodinfo *m, va_list ap)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- jfloat ret;
- s4 dumpsize;
+ jdouble d;
/* Class initialization is done by the JIT compiler. This is ok
since a static method always belongs to the declaring class. */
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
+ d = vm_call_method_double_valist(resm, o, ap);
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
- STATISTICS(jnicallXmethodnvokation());
-
- ret = vm_call_method_double(resm, paramcount, vmargs);
-
- /* release dump area */
-
- dump_release(dumpsize);
-
- return ret;
+ return d;
}
methodinfo *m, va_list ap)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- s4 dumpsize;
if (m == NULL) {
exceptions_throw_nullpointerexception();
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_vargs(o, resm->parseddesc, vmargs, ap);
-
STATISTICS(jnicallXmethodnvokation());
- (void) vm_call_method(resm, paramcount, vmargs);
-
- /* release dump area */
-
- dump_release(dumpsize);
+ (void) vm_call_method_valist(resm, o, ap);
}
methodinfo *m, jvalue *args)
{
methodinfo *resm;
- s4 paramcount;
- vm_arg *vmargs;
- s4 dumpsize;
if (m == NULL) {
exceptions_throw_nullpointerexception();
resm = method_vftbl_lookup(vftbl, m);
}
- /* mark start of dump memory area */
-
- dumpsize = dump_size();
-
- paramcount = resm->parseddesc->paramcount;
-
- vmargs = DMNEW(vm_arg, paramcount);
-
- _Jv_jni_vmargs_from_args(o, resm->parseddesc, vmargs, args);
-
STATISTICS(jnicallXmethodnvokation());
- (void) vm_call_method(resm, paramcount, vmargs);
-
- /* release dump area */
-
- dump_release(dumpsize);
+ (void) vm_call_method_jvalue(resm, o, args);
}
switch (resm->parseddesc->returntype.decltype) {
case TYPE_VOID:
- (void) vm_call_method(resm, argcount, vmargs);
+ (void) vm_call_method_vmarg(resm, argcount, vmargs);
ro = NULL;
break;
s4 i;
java_lang_Boolean *bo;
- i = vm_call_method_int(resm, argcount, vmargs);
+ i = vm_call_method_int_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Boolean);
s4 i;
java_lang_Byte *bo;
- i = vm_call_method_int(resm, argcount, vmargs);
+ i = vm_call_method_int_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Byte);
s4 i;
java_lang_Character *co;
- i = vm_call_method_int(resm, argcount, vmargs);
+ i = vm_call_method_int_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Character);
s4 i;
java_lang_Short *so;
- i = vm_call_method_int(resm, argcount, vmargs);
+ i = vm_call_method_int_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Short);
s4 i;
java_lang_Integer *io;
- i = vm_call_method_int(resm, argcount, vmargs);
+ i = vm_call_method_int_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Integer);
s8 l;
java_lang_Long *lo;
- l = vm_call_method_long(resm, argcount, vmargs);
+ l = vm_call_method_long_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Long);
float f;
java_lang_Float *fo;
- f = vm_call_method_float(resm, argcount, vmargs);
+ f = vm_call_method_float_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Float);
double d;
java_lang_Double *_do;
- d = vm_call_method_double(resm, argcount, vmargs);
+ d = vm_call_method_double_vmarg(resm, argcount, vmargs);
ro = builtin_new(class_java_lang_Double);
break;
case TYPE_ADR:
- ro = vm_call_method(resm, argcount, vmargs);
+ ro = vm_call_method_vmarg(resm, argcount, vmargs);
break;
default:
/* print the stacktrace */
- (void) vm_call_method_intern(m, e, NULL, NULL, NULL);
+ (void) vm_call_method(m, e);
}
}
}
-jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
+jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
{
- log_text("JNI-Call: CallObjectMethodA: IMPLEMENT ME!");
+ java_objectheader *o;
+ methodinfo *m;
+ java_objectheader *ret;
- return NewLocalRef(env, NULL);
+ o = (java_objectheader *) obj;
+ m = (methodinfo *) methodID;
+
+ ret = _Jv_jni_CallObjectMethodA(o, o->vftbl, m, args);
+
+ return NewLocalRef(env, ret);
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
va_end(ap);
return b;
o = (java_objectheader *) obj;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
va_end(ap);
return b;
o = (java_objectheader *) obj;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- c = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap, PRIMITIVETYPE_CHAR);
+ c = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
va_end(ap);
return c;
o = (java_objectheader *) obj;
m = (methodinfo *) methodID;
- c = _Jv_jni_CallIntMethod(o, o->vftbl, m, args, PRIMITIVETYPE_CHAR);
+ c = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
return c;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- s = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
va_end(ap);
return s;
o = (java_objectheader *) obj;
m = (methodinfo *) methodID;
- s = _Jv_jni_CallIntMethod(o, o->vftbl, m, args, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
return s;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- i = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
va_end(ap);
return i;
o = (java_objectheader *) obj;
m = (methodinfo *) methodID;
- i = _Jv_jni_CallIntMethod(o, o->vftbl, m, args, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
return i;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
va_end(ap);
return b;
c = (classinfo *) clazz;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
va_end(ap);
return b;
c = (classinfo *) clazz;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap, PRIMITIVETYPE_CHAR);
+ ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
va_end(ap);
return ch;
c = (classinfo *) clazz;
m = (methodinfo *) methodID;
- ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, args, PRIMITIVETYPE_CHAR);
+ ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
return ch;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- s = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
va_end(ap);
return s;
c = (classinfo *) clazz;
m = (methodinfo *) methodID;
- s = _Jv_jni_CallIntMethod(o, c->vftbl, m, args, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
return s;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- i = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
va_end(ap);
return i;
c = (classinfo *) clazz;
m = (methodinfo *) methodID;
- i = _Jv_jni_CallIntMethod(o, c->vftbl, m, args, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
return i;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
va_end(ap);
return b;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(NULL, NULL, m, args, PRIMITIVETYPE_BOOLEAN);
+ b = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
va_end(ap);
return b;
m = (methodinfo *) methodID;
- b = _Jv_jni_CallIntMethod(NULL, NULL, m, args, PRIMITIVETYPE_BYTE);
+ b = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
return b;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- c = _Jv_jni_CallIntMethod(NULL, NULL, m, ap, PRIMITIVETYPE_CHAR);
+ c = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
va_end(ap);
return c;
m = (methodinfo *) methodID;
- c = _Jv_jni_CallIntMethod(NULL, NULL, m, args, PRIMITIVETYPE_CHAR);
+ c = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
return c;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- s = _Jv_jni_CallIntMethod(NULL, NULL, m, ap, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
va_end(ap);
return s;
m = (methodinfo *) methodID;
- s = _Jv_jni_CallIntMethod(NULL, NULL, m, args, PRIMITIVETYPE_SHORT);
+ s = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
return s;
}
m = (methodinfo *) methodID;
va_start(ap, methodID);
- i = _Jv_jni_CallIntMethod(NULL, NULL, m, ap, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
va_end(ap);
return i;
m = (methodinfo *) methodID;
- i = _Jv_jni_CallIntMethod(NULL, NULL, m, args, PRIMITIVETYPE_INT);
+ i = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
return i;
}
builtin_monitorenter(*global_ref_table);
#endif
- o = vm_call_method_intern(getmid, *global_ref_table, lobj, NULL, NULL);
+ o = vm_call_method(getmid, *global_ref_table, lobj);
refcount = (java_lang_Integer *) o;
return NULL;
}
- (void) vm_call_method_intern(putmid, *global_ref_table, lobj, newval,
- NULL);
+ (void) vm_call_method(putmid, *global_ref_table, lobj, newval);
} else {
/* we can access the object itself, as we are in a
builtin_monitorenter(*global_ref_table);
#endif
- o = vm_call_method_intern(getmid, *global_ref_table, globalRef, NULL, NULL);
+ o = vm_call_method(getmid, *global_ref_table, globalRef);
refcount = (java_lang_Integer *) o;
val = refcount->value - 1;
if (val == 0) {
- (void) vm_call_method_intern(removemid, *global_ref_table, refcount,
- NULL, NULL);
+ (void) vm_call_method(removemid, *global_ref_table, refcount);
} else {
/* we do not create a new object, but set the new value into