+
+ return array;
+}
+
+
+/* vm_array_from_objectarray ***************************************************
+
+ XXX
+
+*******************************************************************************/
+
+uint64_t *vm_array_from_objectarray(methodinfo *m, java_objectheader *o,
+ java_objectarray *params)
+{
+ methoddesc *md;
+ paramdesc *pd;
+ typedesc *td;
+ uint64_t *array;
+ java_objectheader *param;
+ classinfo *c;
+ int32_t i;
+ int32_t j;
+ imm_union value;
+
+ /* get the descriptors */
+
+ md = m->parseddesc;
+ pd = md->params;
+ td = md->paramtypes;
+
+ /* allocate argument array */
+
+ array = DMNEW(uint64_t, INT_ARG_CNT + FLT_ARG_CNT + md->memuse);
+
+ /* if method is non-static fill first block and skip `this' pointer */
+
+ i = 0;
+
+ if (o != NULL) {
+ /* this pointer */
+ vm_array_store_adr(array, pd, o);
+
+ pd++;
+ td++;
+ i++;
+ }
+
+ for (j = 0; i < md->paramcount; i++, j++, pd++, td++) {
+ param = params->data[j];
+
+ switch (td->type) {
+ case TYPE_INT:
+ if (param == NULL)
+ goto illegal_arg;
+
+ /* convert the value according to its declared type */
+
+ c = param->vftbl->class;
+
+ switch (td->decltype) {
+ case PRIMITIVETYPE_BOOLEAN:
+ if (c == class_java_lang_Boolean)
+ LLNI_field_get_val((java_lang_Boolean *) param, value, value.i);
+ else
+ goto illegal_arg;
+ break;
+
+ case PRIMITIVETYPE_BYTE:
+ if (c == class_java_lang_Byte)
+ LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
+ else
+ goto illegal_arg;
+ break;
+
+ case PRIMITIVETYPE_CHAR:
+ if (c == class_java_lang_Character)
+ LLNI_field_get_val((java_lang_Character *) param, value, value.i);
+ else
+ goto illegal_arg;
+ break;
+
+ case PRIMITIVETYPE_SHORT:
+ if (c == class_java_lang_Short)
+ LLNI_field_get_val((java_lang_Short *) param, value, value.i);
+ else if (c == class_java_lang_Byte)
+ LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
+ else
+ goto illegal_arg;
+ break;
+
+ case PRIMITIVETYPE_INT:
+ if (c == class_java_lang_Integer)
+ LLNI_field_get_val((java_lang_Integer *) param, value, value.i);
+ else if (c == class_java_lang_Short)
+ LLNI_field_get_val((java_lang_Short *) param, value, value.i);
+ else if (c == class_java_lang_Byte)
+ LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
+ else
+ goto illegal_arg;
+ break;
+
+ default:
+ goto illegal_arg;
+ }
+
+ vm_array_store_int(array, pd, value.i);
+ break;
+
+ case TYPE_LNG:
+ if (param == NULL)
+ goto illegal_arg;
+
+ /* convert the value according to its declared type */
+
+ c = param->vftbl->class;
+
+ switch (td->decltype) {
+ case PRIMITIVETYPE_LONG:
+ if (c == class_java_lang_Long)
+ LLNI_field_get_val((java_lang_Long *) param, value, value.l);
+ else if (c == class_java_lang_Integer)
+ value.l = (int64_t) LLNI_field_direct(((java_lang_Integer *) param), value);
+ else if (c == class_java_lang_Short)
+ value.l = (int64_t) LLNI_field_direct(((java_lang_Short *) param), value);
+ else if (c == class_java_lang_Byte)
+ value.l = (int64_t) LLNI_field_direct(((java_lang_Byte *) param), value);
+ else
+ goto illegal_arg;
+ break;
+
+ default:
+ goto illegal_arg;
+ }
+
+ vm_array_store_lng(array, pd, value.l);
+ break;
+
+ case TYPE_FLT:
+ if (param == NULL)
+ goto illegal_arg;
+
+ /* convert the value according to its declared type */
+
+ c = param->vftbl->class;
+
+ switch (td->decltype) {
+ case PRIMITIVETYPE_FLOAT:
+ if (c == class_java_lang_Float)
+ LLNI_field_get_val((java_lang_Float *) param, value, value.f);
+ else
+ goto illegal_arg;
+ break;
+
+ default:
+ goto illegal_arg;
+ }
+
+ vm_array_store_flt(array, pd, value.l);
+ break;
+
+ case TYPE_DBL:
+ if (param == NULL)
+ goto illegal_arg;
+
+ /* convert the value according to its declared type */
+
+ c = param->vftbl->class;
+
+ switch (td->decltype) {
+ case PRIMITIVETYPE_DOUBLE:
+ if (c == class_java_lang_Double)
+ LLNI_field_get_val((java_lang_Double *) param, value, value.d);
+ else if (c == class_java_lang_Float)
+ LLNI_field_get_val((java_lang_Float *) param, value, value.f);
+ else
+ goto illegal_arg;
+ break;
+
+ default:
+ goto illegal_arg;
+ }
+
+ vm_array_store_dbl(array, pd, value.l);
+ break;
+
+ case TYPE_ADR:
+ if (!resolve_class_from_typedesc(td, true, true, &c))
+ return false;
+
+ if (param != NULL) {
+ if (td->arraydim > 0) {
+ if (!builtin_arrayinstanceof(param, c))
+ goto illegal_arg;
+ }
+ else {
+ if (!builtin_instanceof(param, c))
+ goto illegal_arg;
+ }
+ }
+
+ vm_array_store_adr(array, pd, param);
+ break;
+
+ default:
+ goto illegal_arg;
+ }
+ }
+
+ return array;
+
+illegal_arg:
+ exceptions_throw_illegalargumentexception();
+ return NULL;