*******************************************************************************/
#include <assert.h>
-#include <values.h>
#include "global.h"
#include "builtin.h"
{(functionptr) asm_builtin_monitorenter, "monitorenter"},
{(functionptr) builtin_monitorexit, "monitorexit"},
{(functionptr) asm_builtin_monitorexit, "monitorexit"},
+#if !SUPPORT_DIVISION
{(functionptr) builtin_idiv, "idiv"},
-#if !defined(SUPPORT_DIVISION)
{(functionptr) asm_builtin_idiv, "idiv"},
-#endif
{(functionptr) builtin_irem, "irem"},
-#if !defined(SUPPORT_DIVISION)
{(functionptr) asm_builtin_irem, "irem"},
#endif
{(functionptr) builtin_ladd, "ladd"},
{(functionptr) builtin_lsub, "lsub"},
{(functionptr) builtin_lmul, "lmul"},
+#if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_MULDIV)
{(functionptr) builtin_ldiv, "ldiv"},
-#if !defined(SUPPORT_DIVISION) || !defined(SUPPORT_LONG) || !defined(SUPPORT_LONG_MULDIV)
{(functionptr) asm_builtin_ldiv, "ldiv"},
-#endif
{(functionptr) builtin_lrem, "lrem"},
-#if !defined(SUPPORT_DIVISION) || !defined(SUPPORT_LONG) || !defined(SUPPORT_LONG_MULDIV)
{(functionptr) asm_builtin_lrem, "lrem"},
#endif
{(functionptr) builtin_lshl, "lshl"},
{(functionptr) builtin_f2d, "f2d"},
{(functionptr) builtin_d2i, "d2i"},
{(functionptr) builtin_d2l, "d2l"},
+#if defined(__I386__)
+ {(functionptr) asm_builtin_f2i, "f2i"},
+ {(functionptr) asm_builtin_f2l, "f2l"},
+ {(functionptr) asm_builtin_d2i, "d2i"},
+ {(functionptr) asm_builtin_d2l, "d2l"},
+#endif
{(functionptr) builtin_d2f, "d2f"},
{(functionptr) NULL, "unknown"}
};
if (builtin_isanysubclass (obj->vftbl->class, class))
return 1;
- #if DEBUG
+#if DEBUG
printf ("#### checkcast failed ");
utf_display (obj->vftbl->class->name);
printf (" -> ");
utf_display (class->name);
printf ("\n");
- #endif
+#endif
return 0;
}
#define ALIGNMENT 3
#define align_size(size) ((size + ((1 << ALIGNMENT) - 1)) & ~((1 << ALIGNMENT) - 1))
-java_objectheader *builtin_new (classinfo *c)
+java_objectheader *builtin_new(classinfo *c)
{
java_objectheader *o;
#ifdef SIZE_FROM_CLASSINFO
c->alignedsize = align_size(c->instancesize);
- o = heap_allocate ( c->alignedsize, true, c->finalizer );
+ o = heap_allocate(c->alignedsize, true, c->finalizer);
#else
- o = heap_allocate ( c->instancesize, true, c->finalizer );
+ o = heap_allocate(c->instancesize, true, c->finalizer);
#endif
if (!o) return NULL;
- memset (o, 0, c->instancesize);
+ memset(o, 0, c->instancesize);
+
+ o->vftbl = c->vftbl;
- o -> vftbl = c -> vftbl;
return o;
}
*****************************************************************************/
+void XXX_copy_vftbl(vftbl **dest, vftbl *src)
+{
+ *dest = mem_alloc(sizeof(vftbl) + sizeof(methodptr)*(src->vftbllength-1));
+ memcpy(*dest, src, sizeof(vftbl) - sizeof(methodptr));
+ memcpy(&(*dest)->table, &src->table, src->vftbllength * sizeof(methodptr));
+}
+
+void XXX_use_class_as_object(classinfo *c, char *cname)
+{
+ vftbl *vt = class_get(utf_new_char(cname))->vftbl;
+ vftbl *newtbl;
+ if (!c->classvftbl) {
+ c->classvftbl = true;
+ XXX_copy_vftbl(&newtbl, vt);
+ newtbl->class = c->header.vftbl->class;
+ newtbl->baseval = c->header.vftbl->baseval;
+ newtbl->diffval = c->header.vftbl->diffval;
+ c->header.vftbl = newtbl;
+ }
+}
+
static
void* __builtin_newarray(s4 base_size,
s4 size,
bool references,
int elementsize,
- int arraytype)
+ int arraytype,
+ classinfo *el)
{
java_arrayheader *a;
+
#ifdef SIZE_FROM_CLASSINFO
s4 alignedsize = align_size(base_size + (size-1) * elementsize);
- a = heap_allocate ( alignedsize, true, NULL );
+ a = heap_allocate( alignedsize, references, NULL );
#else
- a = heap_allocate ( sizeof(java_objectarray) + (size-1) * elementsize,
- references,
- NULL);
+ a = heap_allocate(sizeof(java_objectarray) + (size-1) * elementsize,
+ references,
+ NULL);
#endif
if (!a) return NULL;
memset(a, 0, base_size + (size-1) * elementsize);
#endif
- a -> objheader.vftbl = class_array -> vftbl;
+#if 0
+ {
+ classinfo *c;
+
+ switch (arraytype) {
+ case ARRAYTYPE_INT:
+ c = create_array_class(utf_new_char("[I"));
+ XXX_use_class_as_object(c, "int");
+ break;
+
+ case ARRAYTYPE_LONG:
+ c = create_array_class(utf_new_char("[J"));
+ XXX_use_class_as_object(c, "long");
+ break;
+
+ case ARRAYTYPE_FLOAT:
+ c = create_array_class(utf_new_char("[F"));
+ XXX_use_class_as_object(c, "float");
+ break;
+
+ case ARRAYTYPE_DOUBLE:
+ c = create_array_class(utf_new_char("[D"));
+ XXX_use_class_as_object(c, "double");
+ break;
+
+ case ARRAYTYPE_BYTE:
+ c = create_array_class(utf_new_char("[B"));
+ XXX_use_class_as_object(c, "byte");
+ break;
+
+ case ARRAYTYPE_CHAR:
+ c = create_array_class(utf_new_char("[C"));
+ XXX_use_class_as_object(c, "char");
+ break;
+
+ case ARRAYTYPE_SHORT:
+ c = create_array_class(utf_new_char("[S"));
+ XXX_use_class_as_object(c, "short");
+ break;
+
+ case ARRAYTYPE_BOOLEAN:
+ c = create_array_class(utf_new_char("[Z"));
+ XXX_use_class_as_object(c, "boolean");
+ break;
+
+ case ARRAYTYPE_OBJECT:
+ {
+ char *cname, *buf;
+ cname = heap_allocate(utf_strlen(el->name), false, NULL);
+ utf_sprint(cname, el->name);
+ buf = heap_allocate(strlen(cname) + 3, false, NULL);
+/* printf("\n\n[L%s;\n\n", cname); */
+ sprintf(buf, "[L%s;", cname);
+ c = create_array_class(utf_new_char(buf));
+/* MFREE(buf, char, strlen(cname) + 3); */
+/* MFREE(cname, char, utf_strlen(el->name)); */
+ XXX_use_class_as_object(c, cname);
+ }
+ break;
+
+ case ARRAYTYPE_ARRAY:
+ c = create_array_class(utf_new_char("[["));
+ XXX_use_class_as_object(c, "java/lang/Boolean");
+ break;
+
+ default:
+ panic("unknown array type");
+ }
+
+ a->objheader.vftbl = c->vftbl;
+ }
+#else
+ a->objheader.vftbl = class_array->vftbl;
+#endif
a -> size = size;
#ifdef SIZE_FROM_CLASSINFO
a -> alignedsize = alignedsize;
size,
true,
sizeof(void*),
- ARRAYTYPE_OBJECT);
+ ARRAYTYPE_OBJECT,
+ elementtype);
if (!a) return NULL;
a -> elementtype = elementtype;
size,
true,
sizeof(void*),
- ARRAYTYPE_ARRAY);
+ ARRAYTYPE_ARRAY,
+ elementdesc->objectclass);
if (!a) return NULL;
a -> elementdescriptor = elementdesc;
size,
false,
sizeof(u1),
- ARRAYTYPE_BOOLEAN);
+ ARRAYTYPE_BOOLEAN,
+ NULL);
return a;
}
size,
false,
sizeof(u2),
- ARRAYTYPE_CHAR);
+ ARRAYTYPE_CHAR,
+ NULL);
return a;
}
size,
false,
sizeof(float),
- ARRAYTYPE_FLOAT);
+ ARRAYTYPE_FLOAT,
+ NULL);
return a;
}
size,
false,
sizeof(double),
- ARRAYTYPE_DOUBLE);
+ ARRAYTYPE_DOUBLE,
+ NULL);
return a;
}
size,
false,
sizeof(u1),
- ARRAYTYPE_BYTE);
+ ARRAYTYPE_BYTE,
+ NULL);
return a;
}
{
java_shortarray *a;
a = (java_shortarray*)__builtin_newarray(sizeof(java_shortarray),
- size,
- false,
- sizeof(s2),
- ARRAYTYPE_SHORT);
+ size,
+ false,
+ sizeof(s2),
+ ARRAYTYPE_SHORT,
+ NULL);
return a;
}
size,
false,
sizeof(s4),
- ARRAYTYPE_INT);
+ ARRAYTYPE_INT,
+ NULL);
return a;
}
size,
false,
sizeof(s8),
- ARRAYTYPE_LONG);
+ ARRAYTYPE_LONG,
+ NULL);
return a;
}
case 0:
break;
+#if defined(__I386__)
case 1:
sprintf(logtext+strlen(logtext), "%llx", a0);
break;
sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx, ...(%d)",
a0, a1, a2, a3, a4, a5, method->paramcount - 6);
break;
+#endif
+#else
+ case 1:
+ sprintf(logtext+strlen(logtext), "%lx", a0);
+ break;
+
+ case 2:
+ sprintf(logtext+strlen(logtext), "%lx, %lx", a0, a1);
+ break;
+
+ case 3:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx", a0, a1, a2);
+ break;
+
+ case 4:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx",
+ a0, a1, a2, a3);
+ break;
+
+ case 5:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx",
+ a0, a1, a2, a3, a4);
+ break;
+
+ case 6:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx",
+ a0, a1, a2, a3, a4, a5);
+ break;
+
+#if TRACE_ARGS_NUM > 6
+ case 7:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx",
+ a0, a1, a2, a3, a4, a5, a6);
+ break;
+
+ case 8:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx",
+ a0, a1, a2, a3, a4, a5, a6, a7);
+ break;
+
+ default:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx, ...(%d)",
+ a0, a1, a2, a3, a4, a5, a6, a7, method->paramcount - 8);
+ break;
+#else
+ default:
+ sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, ...(%d)",
+ a0, a1, a2, a3, a4, a5, method->paramcount - 6);
+ break;
+#endif
#endif
}
sprintf (logtext+strlen(logtext), ")");
utf_sprint (logtext+strlen(logtext), method->descriptor);
switch (method->returntype) {
case TYPE_INT:
- sprintf (logtext+strlen(logtext), "->%ld", l);
+ sprintf (logtext+strlen(logtext), "->%d", (s4) l);
break;
case TYPE_LONG:
- sprintf (logtext+strlen(logtext), "->%lld", l);
+#if defined(__I386__)
+ sprintf(logtext+strlen(logtext), "->%lld", (s8) l);
+#else
+ sprintf(logtext+strlen(logtext), "->%ld", (s8) l);
+#endif
break;
case TYPE_ADDRESS:
- sprintf (logtext+strlen(logtext), "->%p", l);
+#if defined(__I386__)
+ sprintf(logtext+strlen(logtext), "->%p", (u1*) ((s4) l));
+#else
+ sprintf(logtext+strlen(logtext), "->%p", (u1*) l);
+#endif
break;
case TYPE_FLOAT:
sprintf (logtext+strlen(logtext), "->%g", f);
float builtin_frem (float a, float b)
{
-
-/* return (float) builtin_drem((double) a, (double) b); */
-
- float f;
-
- if (finite((double) a) && finite((double) b)) {
- f = a / b;
- if (finite((double) f))
- return fmodf(a, b);
- return FLT_NAN;
- }
- if (isnan((double) b))
- return FLT_NAN;
- if (finite((double) a))
- return a;
- return FLT_NAN;
-
-/* float f;
-
- if (finitef(a) && finitef(b)) {
- f = a / b;
- if (finitef(f))
- return a - floorf(f) * b;
- return FLT_NAN;
- }
- if (isnanf(b))
- return FLT_NAN;
- if (finitef(a))
- return a;
- return FLT_NAN; */
+ return fmodf(a, b);
}
double builtin_drem (double a, double b)
{
- double d;
-
- if (finite(a) && finite(b)) {
- d = a / b;
- if (finite(d)) {
- if ((d < 1.0) && (d > 0.0))
- return a;
- return fmod(a, b);
- }
- return DBL_NAN;
- }
- if (isnan(b))
- return DBL_NAN;
- if (finite(a))
- return a;
- return DBL_NAN;
+ return fmod(a, b);
}
double builtin_dneg (double a)
double d;
if (finite(a)) {
- if (a >= 9223372036854775807L)
- return 9223372036854775807L;
- if (a <= (-9223372036854775807L-1))
- return (-9223372036854775807L-1);
+ if (a >= 9223372036854775807LL)
+ return 9223372036854775807LL;
+ if (a <= (-9223372036854775807LL-1))
+ return (-9223372036854775807LL-1);
return (s8) a;
}
if (isnan(a))
return 0;
d = copysign(1.0, a);
if (d > 0)
- return 9223372036854775807L;
- return (-9223372036854775807L-1);
+ return 9223372036854775807LL;
+ return (-9223372036854775807LL-1);
}