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_FLOAT ( #addr #auf -- fResult ) opt
+GETSTATIC_FLOAT ( #addr #afi -- fResult ) opt
{
fResult = *(float *)addr;
}
-GETSTATIC_LONG ( #addr #auf -- lResult ) opt
+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_FLOAT ( #addr #auf fValue -- ) opt
+PUTSTATIC_FLOAT ( #addr #afi fValue -- ) opt
{
*((float *) addr) = fValue;
}
-PUTSTATIC_LONG ( #addr #auf lValue -- ) opt
+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_FLOAT ( #vOffset #auf aRef -- fResult ) opt
+GETFIELD_FLOAT ( #vOffset #afi aRef -- fResult ) opt
{
CHECK_NULL_PTR(aRef);
fResult = *((float *) (((u1 *) aRef) + vOffset));
}
-GETFIELD_LONG ( #vOffset #auf aRef -- lResult ) opt
+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_FLOAT ( #vOffset #auf aRef fValue -- ) opt
+PUTFIELD_FLOAT ( #vOffset #afi aRef fValue -- ) opt
{
CHECK_NULL_PTR(aRef);
*((float *) (((u1 *)aRef) + vOffset)) = fValue;
}
-PUTFIELD_LONG ( #vOffset #auf aRef lValue -- ) opt
+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);
+\ 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);
+\ 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);
+\ other patchers for lazy resolving
+
PATCHER_MULTIANEWARRAY ( #aClass #iSize #acr ... -- )
stackframeinfo sfi;
bool result;
Cell v = sp[0];
float f;
vm_Cell2f(v,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
#endif
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(7 * -SIZEOF_VOID_P),
#endif
am);
+#endif /* !defined(NDEBUG) */
TRACERETURN ( #am v -- v )
float f;
vm_Cell2f(v,f);
+#if !defined(NDEBUG)
builtin_displaymethodstop(am, (s8) v, f, f);
+#endif
TRACELRETURN ( #am l -- l )
Double_Store ds;
ds.l = l;
+#if !defined(NDEBUG)
builtin_displaymethodstop(am, l, ds.d, ds.d);
+#endif
END ( ... -- )
global_sp = sp;