vResult = access_array_int(aArray, iIndex);
}
+FALOAD ( aArray iIndex -- fResult ) 0x2e
+{
+ CHECK_NULL_PTR(aArray);
+ CHECK_OUT_OF_BOUNDS(aArray, iIndex);
+ ;
+ fResult = access_array_float(aArray, iIndex);
+}
+
LALOAD ( aArray iIndex -- lResult ) 0x2f
{
CHECK_NULL_PTR(aArray);
access_array_int(aArray, iIndex) = iValue;
}
+FASTORE ( aArray iIndex fValue -- ) 0x4f
+{
+ CHECK_NULL_PTR(aArray);
+ CHECK_OUT_OF_BOUNDS(aArray, iIndex);
+ ;
+ access_array_float(aArray, iIndex) = fValue;
+}
+
LASTORE ( aArray iIndex lValue -- ) 0x50
{
CHECK_NULL_PTR(aArray);
{
Inst *new_ip;
Cell *currentsp = sp;
- new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P);
- sp = fp+1;
- fp = (Cell *)access_local_cell(vOffsetFP);
- CLEARSTACK(currentsp-6, sp-1);
+ new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P);
+ sp = fp + 1;
+ fp = (Cell *) access_local_cell(vOffsetFP);
+ CLEARSTACK(currentsp - 6, sp - 1);
vResult = vValue;
SET_IP(new_ip);
}
LRETURN ( #vOffsetFP ... lValue -- lResult ) 0xad
{
- Inst *new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P);
+ Inst *new_ip;
Cell *currentsp = sp;
+ new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P);
sp = fp + 1;
- fp = (Cell *)access_local_cell(vOffsetFP);
- CLEARSTACK(currentsp-7, sp-2);
+ fp = (Cell *) access_local_cell(vOffsetFP);
+ CLEARSTACK(currentsp - 7, sp - 2);
lResult = lValue;
SET_IP(new_ip);
}
{
Inst *new_ip;
Cell *currentsp = sp;
- new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P);
- sp = fp+1;
- fp = (Cell *)access_local_cell(vOffsetFP);
- CLEARSTACK(currentsp-5, sp-1);
+ new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P);
+ sp = fp + 1;
+ fp = (Cell *) access_local_cell(vOffsetFP);
+ CLEARSTACK(currentsp - 5, sp - 1);
SET_IP(new_ip);
}
-GETSTATIC_CELL ( #addr #auf -- vResult ) opt
+GETSTATIC_CELL ( #addr #afi -- vResult ) opt
{
vResult = *(Cell *)addr;
}
-GETSTATIC_INT ( #addr #auf -- iResult ) opt
+GETSTATIC_INT ( #addr #afi -- iResult ) opt
{
iResult = *(s4 *)addr;
}
-GETSTATIC_LONG ( #addr #auf -- lResult ) opt
+GETSTATIC_FLOAT ( #addr #afi -- fResult ) opt
+{
+ fResult = *(float *)addr;
+}
+
+GETSTATIC_LONG ( #addr #afi -- lResult ) opt
{
lResult = *((s8 *) addr);
}
-PUTSTATIC_CELL ( #addr #auf vValue -- ) opt
+PUTSTATIC_CELL ( #addr #afi vValue -- ) opt
{
*((Cell *) addr) = vValue;
}
-PUTSTATIC_INT ( #addr #auf iValue -- ) opt
+PUTSTATIC_INT ( #addr #afi iValue -- ) opt
{
*((s4 *) addr) = iValue;
}
-PUTSTATIC_LONG ( #addr #auf lValue -- ) opt
+PUTSTATIC_FLOAT ( #addr #afi fValue -- ) opt
+{
+ *((float *) addr) = fValue;
+}
+
+PUTSTATIC_LONG ( #addr #afi lValue -- ) opt
{
*((s8 *) addr) = lValue;
}
-GETFIELD_CELL ( #vOffset #auf aRef -- vResult ) opt
+GETFIELD_CELL ( #vOffset #afi aRef -- vResult ) opt
{
CHECK_NULL_PTR(aRef);
vResult = *((Cell *) (((u1 *)aRef) + vOffset));
}
-GETFIELD_INT ( #vOffset #auf aRef -- iResult ) opt
+GETFIELD_INT ( #vOffset #afi aRef -- iResult ) opt
{
CHECK_NULL_PTR(aRef);
iResult = *((s4 *) (((u1 *)aRef) + vOffset));
}
-GETFIELD_LONG ( #vOffset #auf aRef -- lResult ) opt
+GETFIELD_FLOAT ( #vOffset #afi aRef -- fResult ) opt
+{
+ CHECK_NULL_PTR(aRef);
+ fResult = *((float *) (((u1 *) aRef) + vOffset));
+}
+
+GETFIELD_LONG ( #vOffset #afi aRef -- lResult ) opt
{
CHECK_NULL_PTR(aRef);
lResult = *((s8 *) (((u1 *)aRef) + vOffset));
}
-PUTFIELD_CELL ( #vOffset #auf aRef vValue -- ) opt
+PUTFIELD_CELL ( #vOffset #afi aRef vValue -- ) opt
{
CHECK_NULL_PTR(aRef);
*((Cell *) (((u1 *)aRef) + vOffset)) = vValue;
}
-PUTFIELD_INT ( #vOffset #auf aRef iValue -- ) opt
+PUTFIELD_INT ( #vOffset #afi aRef iValue -- ) opt
{
CHECK_NULL_PTR(aRef);
*((s4 *) (((u1 *)aRef) + vOffset)) = iValue;
}
-PUTFIELD_LONG ( #vOffset #auf aRef lValue -- ) opt
+PUTFIELD_FLOAT ( #vOffset #afi aRef fValue -- ) opt
+{
+ CHECK_NULL_PTR(aRef);
+ *((float *) (((u1 *)aRef) + vOffset)) = fValue;
+}
+
+PUTFIELD_LONG ( #vOffset #afi aRef lValue -- ) opt
{
CHECK_NULL_PTR(aRef);
*((s8 *) (((u1 *)aRef) + vOffset)) = lValue;
\ methods are always called indirectly through the codeptr in the stub
\ (see createcompilerstub and TRANSLATE).
-INVOKEVIRTUAL ( #vOffset #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xd8
+INVOKEVIRTUAL ( #vOffset #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xd8
{
java_objectheader *aRef = (java_objectheader *)(sp[iNargs - 1]);
char *v;
SET_IP(target);
}
-INVOKESTATIC ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb8
+INVOKESTATIC ( #aaTarget #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xb8
/* an indirect pointer to target is passed to avoid references to uncompiled code */
{
Inst *target = *aaTarget;
SET_IP(target);
}
-INVOKESPECIAL ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb7
+INVOKESPECIAL ( #aaTarget #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xb7
/* an indirect pointer to target is passed to avoid references to uncompiled code */
{
java_objectheader *aRef = (java_objectheader *)(sp[iNargs - 1]);
SET_IP(target);
}
-INVOKEINTERFACE ( #iInterfaceOffset #vOffset #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xd8
+INVOKEINTERFACE ( #iInterfaceOffset #vOffset #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xd8
{
java_objectheader *aRef;
char *v, *t;
MONITORENTER ( aRef -- )
{
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
/* CHECK_NULL_PTR(aRef); is now done explicitly */
builtin_monitorenter(aRef);
#endif
MONITOREXIT ( aRef -- )
{
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
/* CHECK_NULL_PTR(aRef); cannot happen */
builtin_monitorexit(aRef);
#endif
MULTIANEWARRAY ( #aClass #iSize #acr ... -- aRef )
{
- long dims[iSize];
+ long *dims;
int i;
+
+ dims = MNEW(long, iSize);
+
for (i = 0; i < iSize; i++) {
dims[i] = sp[iSize - i - 1];
}
global_sp = sp;
aRef = (java_objectheader *) builtin_multianewarray(iSize, aClass, dims);
+
+ MFREE(dims, long, iSize);
+
if (aRef == NULL) {
global_sp = sp;
*exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (u1 *) IP, (u1 *) IP);
}
}
-\ patchers for stuff that is unknown at compile time (unloaded classes)
+\ patchers for resolving fields
PATCHER_GETSTATIC_INT ( #aRef #auf ... -- )
stackframeinfo sfi;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+PATCHER_GETSTATIC_FLOAT ( #aRef #auf ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putstatic((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETSTATIC_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
PATCHER_GETSTATIC_LONG ( #aRef #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+\ patchers for statically initializing classes
+
+PATCHER_GETSTATIC_CLINIT_INT ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETSTATIC_INT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_GETSTATIC_CLINIT_FLOAT ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETSTATIC_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_GETSTATIC_CLINIT_LONG ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETSTATIC_LONG);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_GETSTATIC_CLINIT_CELL ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETSTATIC_CELL);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+\ patchers for resolving fields
+
PATCHER_PUTSTATIC_INT ( #aRef #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+PATCHER_PUTSTATIC_FLOAT ( #aRef #auf ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putstatic((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTSTATIC_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
PATCHER_PUTSTATIC_LONG ( #aRef #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+\ patchers for statically initializing classes
+
+PATCHER_PUTSTATIC_CLINIT_INT ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTSTATIC_INT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_PUTSTATIC_CLINIT_FLOAT ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTSTATIC_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_PUTSTATIC_CLINIT_LONG ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTSTATIC_LONG);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+PATCHER_PUTSTATIC_CLINIT_CELL ( #aRef #afi ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP);
+result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTSTATIC_CELL);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
+\ patchers for resolving fields
+
PATCHER_GETFIELD_INT ( #vOffset #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+PATCHER_GETFIELD_FLOAT ( #vOffset #auf ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putfield((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(GETFIELD_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
PATCHER_GETFIELD_LONG ( #vOffset #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+PATCHER_PUTFIELD_FLOAT ( #vOffset #auf ... -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = intrp_patcher_get_putfield((u1 *)(IP-3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+ THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(PUTFIELD_FLOAT);
+SET_IP(IP-3);
+patchersuper_rewrite(IP);
+
PATCHER_PUTFIELD_LONG ( #vOffset #auf ... -- )
stackframeinfo sfi;
bool result;
SET_IP(IP-3);
patchersuper_rewrite(IP);
+\ other patchers for lazy resolving
+
PATCHER_MULTIANEWARRAY ( #aClass #iSize #acr ... -- )
stackframeinfo sfi;
bool result;
SET_IP(ainstoldip);
{
Cell v = sp[0];
-u1 *fp = codegen_findmethod((u1 *) (IP - 1));
-methodinfo *m = ((methodinfo **) fp)[-1];
float f;
vm_Cell2f(v,f);
-builtin_displaymethodstop(m, (s8) v, f, f);
+#if !defined(NDEBUG)
+builtin_displaymethodstop(am, (s8) v, f, f);
+#endif
}
if (*exceptionptr)
THROW0;
PATCHER_NATIVECALL ( #am #af #addrcif ... -- )
-#if !defined(ENABLE_STATICVM)
+#if !defined(WITH_STATIC_CLASSPATH)
stackframeinfo sfi;
bool result;
global_sp = sp;
if (!result)
THROW0;
STORE_ORDER_BARRIER();
-IP[-4] = runverbose ? INST_ADDR(TRACENATIVECALL) : INST_ADDR(NATIVECALL);
+IP[-4] = opt_verbosecall ? INST_ADDR(TRACENATIVECALL) : INST_ADDR(NATIVECALL);
SET_IP(IP - 4);
patchersuper_rewrite(IP);
#else
assert(false);
#endif
-TRACECALL ( -- )
-u1 *f = codegen_findmethod((u1 *) (IP - 1));
-methodinfo *m = ((methodinfo **) f)[-1];
+TRACECALL ( #am -- )
+#if !defined(NDEBUG)
builtin_trace_args(
access_local_cell(0 * -SIZEOF_VOID_P),
access_local_cell(1 * -SIZEOF_VOID_P),
access_local_cell(6 * -SIZEOF_VOID_P),
access_local_cell(7 * -SIZEOF_VOID_P),
#endif
- m);
+ am);
+#endif /* !defined(NDEBUG) */
-TRACERETURN ( v -- v )
-u1 *fp = codegen_findmethod((u1 *) (IP - 1));
-methodinfo *m = ((methodinfo **) fp)[-1];
+TRACERETURN ( #am v -- v )
float f;
vm_Cell2f(v,f);
-builtin_displaymethodstop(m, (s8) v, f, f);
+#if !defined(NDEBUG)
+builtin_displaymethodstop(am, (s8) v, f, f);
+#endif
-TRACELRETURN ( l -- l )
-u1 *fp = codegen_findmethod((u1 *) (IP - 1));
-methodinfo *m = ((methodinfo **) fp)[-1];
+TRACELRETURN ( #am l -- l )
Double_Store ds;
ds.l = l;
-builtin_displaymethodstop(m, l, ds.d, ds.d);
+#if !defined(NDEBUG)
+builtin_displaymethodstop(am, l, ds.d, ds.d);
+#endif
END ( ... -- )
global_sp = sp;