[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc.h en...
From: |
Klaus Treichel |
Subject: |
[dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc.h en... |
Date: |
Sun, 19 Feb 2006 18:31:11 +0000 |
CVSROOT: /cvsroot/dotgnu-pnet
Module name: pnet
Branch:
Changes by: Klaus Treichel <address@hidden> 06/02/19 18:31:11
Modified files:
. : ChangeLog
engine : jitc.c jitc.h jitc_branch.c jitc_call.c
jitc_obj.c jitc_ptr.c jitc_setup.c jitc_stack.c
lib_reflect.c
Log message:
2006-02-19 Klaus Treichel <address@hidden>
* engine/jitc.c: Add Function to emit code for throwing jit internal
exceptions. Add members in the ILJITLabel to record the labels
stackstate.
Add member in the jit coder to record the current switch value.
Implement
_ILJitGetCallingMethod.
* engine/jitc.h: Add prototype for _ILJitGetCallingMethod.
* engine/jitc_branch.c: Add changes to record the stack state for the
label.
Change the branch and switch functions so that the GetLabel function is
called when the stack is in the state after the branch.
* engine/jitc_call.c: Implement the ldftn and ldvirtftn opcodes.
* engine/jitc_obj.c: Add support for thread static members.
* engine/jitc_ptr.c: Add throwing of the IndexOutOfRange exceptinn.
* engine/jitc_setup.c: Add intialization and destruction of the label
stackstates MemStack.
* engine/jitc_stack.c: Duplicate the value on the dup instruction now
because the duplicated value might be modified and this must not affect
the original value.
* engine/lib_reflect.c: Set error to LoadError_OK in
Assemble_LoadFromName
when loading is successfull. Add support for the jit coder in
GetCallingAssembly and GetExecutingAssembly.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3288&tr2=1.3289&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.c.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.h.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_branch.c.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_call.c.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_obj.c.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_ptr.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_setup.c.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_stack.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/lib_reflect.c.diff?tr1=1.73&tr2=1.74&r1=text&r2=text
Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3288 pnet/ChangeLog:1.3289
--- pnet/ChangeLog:1.3288 Mon Feb 13 19:35:45 2006
+++ pnet/ChangeLog Sun Feb 19 18:31:10 2006
@@ -1,4 +1,34 @@
-2006-02-13 Klaus Treichel <address@hidden>
+2006-02-19 Klaus Treichel <address@hidden>
+
+ * engine/jitc.c: Add Function to emit code for throwing jit internal
+ exceptions. Add members in the ILJITLabel to record the labels
stackstate.
+ Add member in the jit coder to record the current switch value.
Implement
+ _ILJitGetCallingMethod.
+
+ * engine/jitc.h: Add prototype for _ILJitGetCallingMethod.
+
+ * engine/jitc_branch.c: Add changes to record the stack state for the
label.
+ Change the branch and switch functions so that the GetLabel function is
+ called when the stack is in the state after the branch.
+
+ * engine/jitc_call.c: Implement the ldftn and ldvirtftn opcodes.
+
+ * engine/jitc_obj.c: Add support for thread static members.
+
+ * engine/jitc_ptr.c: Add throwing of the IndexOutOfRange exceptinn.
+
+ * engine/jitc_setup.c: Add intialization and destruction of the label
+ stackstates MemStack.
+
+ * engine/jitc_stack.c: Duplicate the value on the dup instruction now
+ because the duplicated value might be modified and this must not affect
+ the original value.
+
+ * engine/lib_reflect.c: Set error to LoadError_OK in
Assemble_LoadFromName
+ when loading is successfull. Add support for the jit coder in
+ GetCallingAssembly and GetExecutingAssembly.
+
+2006-02-13 Klaus Treichel <address@hidden>
* engine/jitc_const.c: Fix a bug with negative small constants (> -128).
(Thanks krokas for finding this bug.)
Index: pnet/engine/jitc.c
diff -u pnet/engine/jitc.c:1.16 pnet/engine/jitc.c:1.17
--- pnet/engine/jitc.c:1.16 Sun Feb 5 16:20:28 2006
+++ pnet/engine/jitc.c Sun Feb 19 18:31:10 2006
@@ -132,6 +132,11 @@
static ILJitType _ILJitSignature_ILRuntimeGetThreadStatic = 0;
/*
+ * void jit_exception_builtin(int exception_type)
+ */
+static ILJitType _ILJitSignature_JitExceptionBuiltin = 0;
+
+/*
* Define offsetof macro if not present.
*/
#ifndef offsetof
@@ -155,6 +160,8 @@
jit_label_t label; /* the libjit label */
ILJITLabel *next; /* Next label block */
int labelType; /* type of the label. */
+ int stackSize; /* No. of elements on
the stack. */
+ ILJitValue *jitStack; /* Values on the stack. */
};
@@ -186,8 +193,10 @@
ILMemPool labelPool;
ILJITLabel *labelList;
int labelOutOfMemory;
+ ILMemStack stackStates;
/* Handle the switch table. */
+ ILJitValue switchValue;
int numSwitch;
int maxSwitch;
@@ -269,6 +278,21 @@
}
}
+/*
+ * Emit the code to throw a libjit internal exception.
+ */
+static void _ILJitThrowInternal(ILJitFunction func, int exception)
+{
+ ILJitValue value = jit_value_create_nint_constant(func,
+
_IL_JIT_TYPE_INT32,
+
(jit_nint)exception);
+
+ jit_insn_call_native(func, "jit_exception_builtin",
jit_exception_builtin,
+
_ILJitSignature_JitExceptionBuiltin, &value, 1,
+ JIT_CALL_NORETURN);
+}
+
+
#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS) &&
defined(_IL_JIT_ENABLE_DEBUG)
/*
* Get a complete methodname.
@@ -479,6 +503,53 @@
}
/*
+ * Get the ILMethod for the call frame up n slots.
+ * Returns 0 if the function at that slot is not a jitted function.
+ */
+ILMethod *_ILJitGetCallingMethod(ILExecThread *thread, ILUInt32 frames)
+{
+ void *returnAddress = 0;
+
+ fprintf(stdout, "CallingMethod \n");
+ if(frames > 0)
+ {
+ void *callFrame = jit_get_frame_address(frames);
+ if(callFrame)
+ {
+ returnAddress = jit_get_return_address(callFrame);
+ }
+ }
+ else
+ {
+ returnAddress = jit_get_current_return();
+ }
+ if(returnAddress)
+ {
+ ILExecProcess *process = _ILExecThreadProcess(thread);
+ ILJITCoder *jitCoder;
+ ILJitFunction jitFunction;
+ void *exceptionHandler = 0;
+
+ if(!process)
+ {
+ return 0;
+ }
+ if(!(jitCoder = _ILCoderToILJITCoder(process->coder)))
+ {
+ return 0;
+ }
+ if(!(jitFunction = jit_function_from_pc(jitCoder->context,
+
returnAddress,
+
&exceptionHandler)))
+ {
+ return 0;
+ }
+ return (ILMethod *)jit_function_get_meta(jitFunction,
IL_JIT_META_METHOD);
+ }
+ return 0;
+}
+
+/*
* Perform a class cast, taking arrays into account.
*/
ILInt32 ILRuntimeCanCastClass(ILExecThread *thread, ILObject *object, ILClass
*toClass)
@@ -909,6 +980,14 @@
return 0;
}
+ args[0] = _IL_JIT_TYPE_INT32;
+ returnType = _IL_JIT_TYPE_VOID;
+ if(!(_ILJitSignature_JitExceptionBuiltin =
+ jit_type_create_signature(IL_JIT_CALLCONV_CDECL, returnType,
args, 1, 1)))
+ {
+ return 0;
+ }
+
return 1;
}
/*
@@ -948,6 +1027,11 @@
coder->labelList = 0;
coder->labelOutOfMemory = 0;
+ /* Init the switch stuff. */
+ coder->switchValue = 0;
+ coder->numSwitch = 0;
+ coder->maxSwitch = 0;
+
/* Ready to go */
return &(coder->coder);
}
Index: pnet/engine/jitc.h
diff -u pnet/engine/jitc.h:1.8 pnet/engine/jitc.h:1.9
--- pnet/engine/jitc.h:1.8 Sun Feb 5 16:20:28 2006
+++ pnet/engine/jitc.h Sun Feb 19 18:31:11 2006
@@ -28,6 +28,7 @@
/*
* Map the native IL types to JIT types.
*/
+#define _IL_JIT_TYPE_VOID jit_type_void
#define _IL_JIT_TYPE_BYTE jit_type_ubyte
#define _IL_JIT_TYPE_CHAR jit_type_ushort
#define _IL_JIT_TYPE_DOUBLE jit_type_float64
@@ -149,6 +150,12 @@
void**jitArgs, void *result);
/*
+ * Get the ILMethod for the call frame up n slots.
+ * Returns 0 if the function at that slot is not a jitted function.
+ */
+ILMethod *_ILJitGetCallingMethod(ILExecThread *thread, ILUInt32 frames);
+
+/*
* Create the class/struct representation of a clr type for libjit.
* and store the type in classPrivate.
* Returns the jit type on success else 0
Index: pnet/engine/jitc_branch.c
diff -u pnet/engine/jitc_branch.c:1.6 pnet/engine/jitc_branch.c:1.7
--- pnet/engine/jitc_branch.c:1.6 Sat Jan 28 15:07:10 2006
+++ pnet/engine/jitc_branch.c Sun Feb 19 18:31:11 2006
@@ -21,6 +21,99 @@
#ifdef IL_JITC_CODE
/*
+ * Save the current jitStack status to the label.
+ * This is done when the label is referenced the first time.
+ */
+static int _ILJitLabelSaveStack(ILJITCoder *coder, ILJITLabel *label)
+{
+ if((label->labelType == _IL_JIT_LABEL_NORMAL) && (coder->stackTop > 0))
+ {
+ int current = 0;
+ ILJitValue *stack = ILMemStackAllocItem(&(coder->stackStates),
+
coder->stackTop * sizeof(ILJitValue));
+ if(!stack)
+ {
+ return 0;
+ }
+ /* Now save the current stack state. */
+ for(current = 0; current < coder->stackTop; current++)
+ {
+ ILJitValue value = coder->jitStack[current];
+
+ if(jit_value_is_constant(value))
+ {
+ /* We have to handle this case different. */
+ /* Create a local value of the type of the
constant. */
+ ILJitValue temp =
jit_value_create(coder->jitFunction,
+
jit_value_get_type(value));
+ /* and store the value o the constant in the
new temporary. */
+ jit_insn_store(coder->jitFunction, temp, value);
+ /* Now replace the constant with the new
temporary. */
+ coder->jitStack[current] = temp;
+ }
+ stack[current] = coder->jitStack[current];
+ }
+ label->jitStack = stack;
+ label->stackSize = coder->stackTop;
+ }
+ return 1;
+}
+
+/*
+ * Merge the current jitStack status with the one saved in the label.
+ */
+static int _ILJitLabelMergeStack(ILJITCoder *coder, ILJITLabel *label)
+{
+ if(label->labelType == _IL_JIT_LABEL_NORMAL)
+ {
+ /* Verify that the stack sizes match. */
+ if(coder->stackTop != label->stackSize)
+ {
+ fprintf(stdout, "Stack sizes don't match!\n");
+ /* return 0; */
+ }
+ if(coder->stackTop > 0)
+ {
+ int numItems = coder->stackTop > label->stackSize ?
+
label->stackSize : coder->stackTop;
+ int current = 0;
+
+ /* Now save the current stack state. */
+ for(current = 0; current < numItems; current++)
+ {
+ ILJitValue value = coder->jitStack[current];
+
+ if(value != label->jitStack[current])
+ {
+ /* store the changed value to the saved
stack. */
+ jit_insn_store(coder->jitFunction,
label->jitStack[current],
+ value);
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+/*
+ * Restore the stack from the label to the coder.
+ */
+static void _ILJitLabelRestoreStack(ILJITCoder *coder, ILJITLabel *label)
+{
+ if(label->stackSize > 0)
+ {
+ int current = 0;
+
+ /* Now restore the stack state. */
+ for(current = 0; current < label->stackSize; current++)
+ {
+ coder->jitStack[current] = label->jitStack[current];
+ }
+ }
+ coder->stackTop = label->stackSize;
+}
+
+/*
* Look for a label for a specific IL address. Create
* a new label if necessary.
*/
@@ -32,6 +125,12 @@
{
if(label->address == address)
{
+ if(!_ILJitLabelMergeStack(coder, label))
+ {
+ /* We have a stack size mismatch!!! */
+ coder->labelOutOfMemory = 1;
+ return 0;
+ }
return label;
}
label = label->next;
@@ -39,10 +138,17 @@
label = ILMemPoolAlloc(&(coder->labelPool), ILJITLabel);
if(label)
{
+ label->stackSize = 0;
+ label->jitStack = 0;
label->address = address;
label->label = jit_label_undefined;
- label->next = coder->labelList;
label->labelType = labelType;
+ if(!_ILJitLabelSaveStack(coder, label))
+ {
+ coder->labelOutOfMemory = 1;
+ return 0;
+ }
+ label->next = coder->labelList;
coder->labelList = label;
}
else
@@ -88,6 +194,7 @@
ILMutexUnlock(globalTraceMutex);
}
#endif
+ _ILJitLabelRestoreStack(jitCoder, label);
jit_insn_label(jitCoder->jitFunction, &(label->label));
}
}
@@ -345,8 +452,10 @@
ILEngineType type1,
ILEngineType type2)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
- ILJITLabel *label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
- ILJitValue temp;
+ ILJITLabel *label = 0;
+ ILJitValue value1 = 0;
+ ILJitValue value2 = 0;
+ ILJitValue temp = 0;
#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -367,6 +476,8 @@
case IL_OP_LEAVE_S:
{
/* Unconditional branch */
+ label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
+
jit_insn_branch(jitCoder->jitFunction, &(label->label));
}
break;
@@ -375,10 +486,11 @@
case IL_OP_BRTRUE:
{
/* Branch if the top-most stack item is true */
- jit_insn_branch_if(jitCoder->jitFunction,
-
jitCoder->jitStack[jitCoder->stackTop - 1],
-
&(label->label));
+ value1 = jitCoder->jitStack[jitCoder->stackTop - 1];
JITC_ADJUST(jitCoder, -1);
+ label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
+
+ jit_insn_branch_if(jitCoder->jitFunction, value1,
&(label->label));
}
break;
@@ -386,130 +498,129 @@
case IL_OP_BRFALSE:
{
/* Branch if the top-most stack item is false */
- jit_insn_branch_if_not(jitCoder->jitFunction,
-
jitCoder->jitStack[jitCoder->stackTop - 1],
-
&(label->label));
+ value1 = jitCoder->jitStack[jitCoder->stackTop - 1];
JITC_ADJUST(jitCoder, -1);
- }
- break;
+ label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
- case IL_OP_BEQ:
- case IL_OP_BEQ_S:
- {
- /* Equality testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BEQ,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BNE_UN:
- case IL_OP_BNE_UN_S:
- {
- /* Unsigned inequality testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BNE_UN,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BGT:
- case IL_OP_BGT_S:
- {
- /* Signed greater than testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BGT,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BGT_UN:
- case IL_OP_BGT_UN_S:
- {
- /* Unsigned greater than testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BGT_UN,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BGE:
- case IL_OP_BGE_S:
- {
- /* Signed greater than or equal testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BGE,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BGE_UN:
- case IL_OP_BGE_UN_S:
- {
- /* Unsigned greater than or equal testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BGE_UN,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BLT:
- case IL_OP_BLT_S:
- {
- /* Signed less than testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BLT,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
- }
- break;
-
- case IL_OP_BLT_UN:
- case IL_OP_BLT_UN_S:
- {
- /* Unsigned less than testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BLT_UN,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
+ jit_insn_branch_if_not(jitCoder->jitFunction, value1,
+
&(label->label));
}
break;
- case IL_OP_BLE:
- case IL_OP_BLE_S:
+ default:
{
- /* Signed less than or equal testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BLE,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
+ value1 = jitCoder->jitStack[jitCoder->stackTop - 2];
+ value2 = jitCoder->jitStack[jitCoder->stackTop - 1];
JITC_ADJUST(jitCoder, -2);
- }
- break;
+ label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
- case IL_OP_BLE_UN:
- case IL_OP_BLE_UN_S:
- {
- /* Unsigned less than or equal testing branch */
- temp = OutputCompare(jitCoder, IL_OP_BLE_UN,
-
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
-
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
- jit_insn_branch_if(jitCoder->jitFunction, temp,
&(label->label));
- JITC_ADJUST(jitCoder, -2);
+ switch(opcode)
+ {
+ case IL_OP_BEQ:
+ case IL_OP_BEQ_S:
+ {
+ /* Equality testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BEQ, &value1, &value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BNE_UN:
+ case IL_OP_BNE_UN_S:
+ {
+ /* Unsigned inequality testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BNE_UN, &value1,
+
&value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BGT:
+ case IL_OP_BGT_S:
+ {
+ /* Signed greater than testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BGT, &value1, &value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BGT_UN:
+ case IL_OP_BGT_UN_S:
+ {
+ /* Unsigned greater than testing branch
*/
+ temp = OutputCompare(jitCoder,
IL_OP_BGT_UN, &value1,
+
&value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BGE:
+ case IL_OP_BGE_S:
+ {
+ /* Signed greater than or equal testing
branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BGE, &value1, &value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BGE_UN:
+ case IL_OP_BGE_UN_S:
+ {
+ /* Unsigned greater than or equal
testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BGE_UN, &value1,
+
&value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BLT:
+ case IL_OP_BLT_S:
+ {
+ /* Signed less than testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BLT, &value1, &value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BLT_UN:
+ case IL_OP_BLT_UN_S:
+ {
+ /* Unsigned less than testing branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BLT_UN, &value1,
+
&value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BLE:
+ case IL_OP_BLE_S:
+ {
+ /* Signed less than or equal testing
branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BLE, &value1, &value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+
+ case IL_OP_BLE_UN:
+ case IL_OP_BLE_UN_S:
+ {
+ /* Unsigned less than or equal testing
branch */
+ temp = OutputCompare(jitCoder,
IL_OP_BLE_UN, &value1,
+
&value2);
+
jit_insn_branch_if(jitCoder->jitFunction, temp,
+
&(label->label));
+ }
+ break;
+ }
}
break;
}
@@ -525,6 +636,8 @@
jitCoder->numSwitch = 0;
jitCoder->maxSwitch = numEntries;
+ jitCoder->switchValue = jitCoder->jitStack[jitCoder->stackTop - 1];
+ JITC_ADJUST(jitCoder, -1);
}
/*
@@ -535,21 +648,17 @@
ILJITCoder *jitCoder = _ILCoderToILJITCoder(_coder);
ILJITLabel *label = GetLabel(jitCoder, dest, _IL_JIT_LABEL_NORMAL);
- jit_value_t constant =
jit_value_create_nint_constant(jitCoder->jitFunction,
-
jit_type_nint,
-
jitCoder->numSwitch);
-
- jit_value_t temp = jit_insn_eq(jitCoder->jitFunction,
- jitCoder->jitStack[jitCoder->stackTop -
1],
- constant);
+ ILJitValue constant =
jit_value_create_nint_constant(jitCoder->jitFunction,
+
jit_type_nint,
+
jitCoder->numSwitch);
+
+ ILJitValue temp = jit_insn_eq(jitCoder->jitFunction,
+
jitCoder->switchValue,
+ constant);
jit_insn_branch_if(jitCoder->jitFunction, temp, &(label->label));
++jitCoder->numSwitch;
- if(jitCoder->numSwitch==jitCoder->maxSwitch)
- {
- JITC_ADJUST(jitCoder, -1);
- }
}
/*
Index: pnet/engine/jitc_call.c
diff -u pnet/engine/jitc_call.c:1.8 pnet/engine/jitc_call.c:1.9
--- pnet/engine/jitc_call.c:1.8 Sun Feb 5 16:20:28 2006
+++ pnet/engine/jitc_call.c Sun Feb 19 18:31:11 2006
@@ -38,6 +38,59 @@
}
/*
+ * Get the vtable pointer for an interface function from an object.
+ */
+static ILJitValue _ILJitGetInterfaceFunction(ILJitFunction func,
+
ILJitValue object,
+
ILClass *interface,
+
int index)
+{
+ ILJitValue classPrivate;
+ ILJitValue interfaceClass;
+ ILJitValue methodIndex;
+ ILJitValue args[3];
+
+ jit_insn_check_null(func, object);
+ classPrivate = _ILJitGetObjectClassPrivate(func, object);
+ interfaceClass = jit_value_create_nint_constant(func,
+
_IL_JIT_TYPE_VPTR,
+
(jit_nint)interface);
+ methodIndex = jit_value_create_nint_constant(func,
+
_IL_JIT_TYPE_UINT32,
+
(jit_nint)index);
+ args[0] = classPrivate;
+ args[1] = interfaceClass;
+ args[2] = methodIndex;
+ return jit_insn_call_native(func,
+
"_ILRuntimeLookupInterfaceMethod",
+
_ILRuntimeLookupInterfaceMethod,
+
_ILJitSignature_ILRuntimeLookupInterfaceMethod,
+ args, 3,
JIT_CALL_NOTHROW);
+}
+
+/*
+ * Get the vtable pointer for a virtual function from an object.
+ */
+static ILJitValue _ILJitGetVirtualFunction(ILJitFunction func,
+
ILJitValue object,
+
int index)
+{
+ ILJitValue classPrivate;
+ ILJitValue vtable;
+ ILJitValue vtableIndex;
+
+ jit_insn_check_null(func, object);
+ classPrivate = _ILJitGetObjectClassPrivate(func, object);
+ vtable = jit_insn_load_relative(func, classPrivate,
+
offsetof(ILClassPrivate, jitVtable),
+
_IL_JIT_TYPE_VPTR);
+ vtableIndex = jit_value_create_nint_constant(func,
+
_IL_JIT_TYPE_INT32,
+
(jit_nint)index);
+ return jit_insn_load_elem(func, vtable, vtableIndex, _IL_JIT_TYPE_VPTR);
+}
+
+/*
* Create a new object and push it on the stack.
*/
static void _ILJitNewObj(ILJITCoder *coder, ILClass *info, ILJitValue *newArg)
@@ -329,9 +382,6 @@
ILJitType signature;
ILJitValue jitParams[argCount + 1];
ILJitValue returnValue;
- ILJitValue classPrivate;
- ILJitValue vtable;
- ILJitValue vtableIndex;
ILJitValue jitFunction;
#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
@@ -381,16 +431,9 @@
_ILJitFillArguments(jitCoder, &(jitParams[1]), info);
/* TODO: handle varargs here and create a call signature. */
- jit_insn_check_null(jitCoder->jitFunction, jitParams[1]);
- classPrivate = _ILJitGetObjectClassPrivate(jitCoder->jitFunction,
jitParams[1]);
- vtable = jit_insn_load_relative(jitCoder->jitFunction, classPrivate,
-
offsetof(ILClassPrivate, jitVtable),
-
_IL_JIT_TYPE_VPTR);
- vtableIndex = jit_value_create_nint_constant(jitCoder->jitFunction,
-
_IL_JIT_TYPE_INT32,
-
(jit_nint)methodInfo->index);
- jitFunction = jit_insn_load_elem(jitCoder->jitFunction, vtable,
-
vtableIndex, _IL_JIT_TYPE_VPTR);
+ jitFunction = _ILJitGetVirtualFunction(jitCoder->jitFunction,
+
jitParams[1],
+
methodInfo->index);
if(info->tailCall == 1)
{
returnValue =
jit_insn_call_indirect_vtable(jitCoder->jitFunction,
@@ -427,11 +470,7 @@
ILJitType signature;
ILJitValue jitParams[argCount + 1];
ILJitValue returnValue;
- ILJitValue classPrivate;
ILJitValue jitFunction;
- ILJitValue interfaceClass;
- ILJitValue methodIndex;
- ILJitValue args[3];
jit_label_t label = jit_label_undefined;
if(!func)
@@ -470,22 +509,10 @@
_ILJitFillArguments(jitCoder, &(jitParams[1]), info);
/* TODO: handle varargs here and create a call signature. */
- jit_insn_check_null(jitCoder->jitFunction, jitParams[1]);
- classPrivate = _ILJitGetObjectClassPrivate(jitCoder->jitFunction,
jitParams[1]);
- interfaceClass = jit_value_create_nint_constant(jitCoder->jitFunction,
-
_IL_JIT_TYPE_VPTR,
-
(jit_nint)methodInfo->member.owner);
- methodIndex = jit_value_create_nint_constant(jitCoder->jitFunction,
-
_IL_JIT_TYPE_UINT32,
-
(jit_nint)methodInfo->index);
- args[0] = classPrivate;
- args[1] = interfaceClass;
- args[2] = methodIndex;
- jitFunction = jit_insn_call_native(jitCoder->jitFunction,
-
"_ILRuntimeLookupInterfaceMethod",
-
_ILRuntimeLookupInterfaceMethod,
-
_ILJitSignature_ILRuntimeLookupInterfaceMethod,
-
args, 3, JIT_CALL_NOTHROW);
+ jitFunction = _ILJitGetInterfaceFunction(jitCoder->jitFunction,
+
jitParams[1],
+
methodInfo->member.owner,
+
methodInfo->index);
jit_insn_branch_if(jitCoder->jitFunction, jitFunction, &label);
/* TODO: raise a MissingMethodException here. */
@@ -555,14 +582,93 @@
static void JITCoder_LoadFuncAddr(ILCoder *coder, ILMethod *methodInfo)
{
+ ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+ ILJitFunction jitFunction = ILJitFunctionFromILMethod(methodInfo);
+ void *function; /* vtable pointer for the function. */
+ ILJitValue functionPtr; /* jt value containing the vtable pointer. */
+
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadFuncAddr: %s.%s\n",
+ ILClass_Name(ILMethod_Owner(methodInfo)),
+ ILMethod_Name(methodInfo));
+ ILMutexUnlock(globalTraceMutex);
+ }
+#endif
+ if(!jitFunction)
+ {
+ /* We need to layout the class first. */
+ if(!_LayoutClass(ILExecThreadCurrent(),
ILMethod_Owner(methodInfo)))
+ {
+ return;
+ }
+ jitFunction = ILJitFunctionFromILMethod(methodInfo);
+ }
+ /* Get the vtable pointer for the function. */
+ function = jit_function_to_vtable_pointer(jitFunction);
+ functionPtr = jit_value_create_nint_constant(jitCoder->jitFunction,
+
_IL_JIT_TYPE_VPTR,
+
(jit_nint)function);
+
+ /* Push the function pointer on the stack. */
+ jitCoder->jitStack[jitCoder->stackTop] = functionPtr;
+ JITC_ADJUST(jitCoder, 1);
}
static void JITCoder_LoadVirtualAddr(ILCoder *coder, ILMethod *methodInfo)
{
+ ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+ ILJitValue object = jitCoder->jitStack[jitCoder->stackTop - 1];
+ ILJitValue jitFunction;
+
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadVirtualAddr: %s.%s at slot %i\n",
+ ILClass_Name(ILMethod_Owner(methodInfo)),
+ ILMethod_Name(methodInfo),
+ methodInfo->index);
+ ILMutexUnlock(globalTraceMutex);
+ }
+#endif
+
+ jitFunction = _ILJitGetVirtualFunction(jitCoder->jitFunction,
+
object,
+
methodInfo->index);
+ /* Push the function pointer on the stack. */
+ jitCoder->jitStack[jitCoder->stackTop - 1] = jitFunction;
}
static void JITCoder_LoadInterfaceAddr(ILCoder *coder, ILMethod *methodInfo)
{
+ ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+ ILJitValue object = jitCoder->jitStack[jitCoder->stackTop - 1];
+ ILJitValue jitFunction;
+
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadInterfaceAddr: %s.%s at slot %i\n",
+ ILClass_Name(ILMethod_Owner(methodInfo)),
+ ILMethod_Name(methodInfo),
+ methodInfo->index);
+ ILMutexUnlock(globalTraceMutex);
+ }
+#endif
+
+ jitFunction = _ILJitGetInterfaceFunction(jitCoder->jitFunction,
+
object,
+
methodInfo->member.owner,
+
methodInfo->index);
+ /* Push the function pointer on the stack. */
+ jitCoder->jitStack[jitCoder->stackTop - 1] = jitFunction;
}
#endif /* IL_JITC_CODE */
Index: pnet/engine/jitc_obj.c
diff -u pnet/engine/jitc_obj.c:1.10 pnet/engine/jitc_obj.c:1.11
--- pnet/engine/jitc_obj.c:1.10 Sun Feb 5 16:20:28 2006
+++ pnet/engine/jitc_obj.c Sun Feb 19 18:31:11 2006
@@ -60,6 +60,34 @@
}
/*
+ * Get an ILJitValue with a pointer to the thread static slot.
+ */
+static ILJitValue _ILJitGetThreadStaticSlot(ILJITCoder *jitCoder,
+
ILField *field)
+{
+ ILJitValue args[3];
+ ILJitValue slot;
+ jit_label_t label = jit_label_undefined;
+
+ args[0] = jit_value_get_param(jitCoder->jitFunction, 0);
+ args[1] = jit_value_create_nint_constant(jitCoder->jitFunction,
+
_IL_JIT_TYPE_UINT32,
+
(jit_nint)field->offset);
+ args[2] = jit_value_create_nint_constant(jitCoder->jitFunction,
+
_IL_JIT_TYPE_UINT32,
+
(jit_nint)field->nativeOffset);
+ slot = jit_insn_call_native(jitCoder->jitFunction,
+
"ILRuntimeGetThreadStatic",
+
ILRuntimeGetThreadStatic,
+
_ILJitSignature_ILRuntimeGetThreadStatic,
+ args, 3,
JIT_CALL_NOTHROW);
+ jit_insn_branch_if(jitCoder->jitFunction, slot, &label);
+ _ILJitThrowCurrentException(jitCoder);
+ jit_insn_label(jitCoder->jitFunction, &label);
+ return slot;
+}
+
+/*
* Get the value pointer from a typed reference.
* A check is made if the type of typed reference matches the given classInfo.
* If they don't match an InvalidCastEWxception is thrown.
@@ -163,20 +191,22 @@
/* We are casting to an interface */
args[0] = object;
args[1] = classTo;
- returnValue = jit_insn_call_native(jitCoder->jitFunction, 0,
+ returnValue = jit_insn_call_native(jitCoder->jitFunction,
+
"ILRuntimeClassImplements",
ILRuntimeClassImplements,
_ILJitSignature_ILRuntimeClassImplements,
-
args, 2, 0);
+
args, 2, JIT_CALL_NOTHROW);
}
else
{
args[0] = jit_value_get_param(jitCoder->jitFunction, 0);
args[1] = object;
args[2] = classTo;
- returnValue = jit_insn_call_native(jitCoder->jitFunction, 0,
+ returnValue = jit_insn_call_native(jitCoder->jitFunction,
+
"ILRuntimeCanCastClass",
ILRuntimeCanCastClass,
_ILJitSignature_ILRuntimeCanCastClass,
-
args, 3, 0);
+
args, 3, JIT_CALL_NOTHROW);
}
if(throwException)
{
@@ -254,25 +284,49 @@
ILType
*fieldType)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
- ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
-
field);
-#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
- if (jitCoder->flags & IL_CODER_FLAG_STATS)
- {
- ILMutexLock(globalTraceMutex);
- fprintf(stdout,
- "LoadStaticField: %s.%s at offset %i\n",
- ILClass_Name(ILField_Owner(field)),
- ILField_Name(field),
- field->offset);
- ILMutexUnlock(globalTraceMutex);
- }
-#endif
+
/* Output a call to the static constructor */
_ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
- jitCoder->jitStack[jitCoder->stackTop] =
- _ILJitLoadField(jitCoder, ptr, fieldType, field->offset, 0);
+ /* Regular or thread-static field? */
+ if(!ILFieldIsThreadStatic(field))
+ {
+ ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+
field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadStaticField: %s.%s at offset %i\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field),
+ field->offset);
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ jitCoder->jitStack[jitCoder->stackTop] =
+ _ILJitLoadField(jitCoder, ptr, fieldType,
field->offset, 0);
+ }
+ else
+ {
+ ILJitValue ptr = _ILJitGetThreadStaticSlot(jitCoder, field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadThreadStaticField: %s.%s\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field));
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ jitCoder->jitStack[jitCoder->stackTop] =
+ _ILJitLoadField(jitCoder, ptr, fieldType, 0, 0);
+ }
JITC_ADJUST(jitCoder, 1);
}
@@ -303,26 +357,49 @@
ILType *fieldType)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
- ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
-
field);
-#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
- if (jitCoder->flags & IL_CODER_FLAG_STATS)
- {
- ILMutexLock(globalTraceMutex);
- fprintf(stdout,
- "LoadStaticFieldAddr: %s.%s at offset %i\n",
- ILClass_Name(ILField_Owner(field)),
- ILField_Name(field),
- field->offset);
- ILMutexUnlock(globalTraceMutex);
- }
-#endif
/* Output a call to the static constructor */
_ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
- jitCoder->jitStack[jitCoder->stackTop] =
- _ILJitLoadFieldAddress(jitCoder, ptr, field->offset, 0);
+ /* Regular or thread-static field? */
+ if(!ILFieldIsThreadStatic(field))
+ {
+ ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+
field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadStaticFieldAddr: %s.%s at offset %i\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field),
+ field->offset);
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ jitCoder->jitStack[jitCoder->stackTop] =
+ _ILJitLoadFieldAddress(jitCoder, ptr, field->offset, 0);
+ }
+ else
+ {
+ ILJitValue ptr = _ILJitGetThreadStaticSlot(jitCoder, field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "LoadThreadStaticFieldAddr: %s.%s\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field));
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ jitCoder->jitStack[jitCoder->stackTop] =
+ _ILJitLoadFieldAddress(jitCoder, ptr, 0, 0);
+ }
JITC_ADJUST(jitCoder, 1);
}
@@ -354,26 +431,48 @@
ILType *fieldType, ILEngineType valueType)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
- ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
-
field);
ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
-#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
- if (jitCoder->flags & IL_CODER_FLAG_STATS)
- {
- ILMutexLock(globalTraceMutex);
- fprintf(stdout,
- "StoreStaticField: %s.%s at offset %i\n",
- ILClass_Name(ILField_Owner(field)),
- ILField_Name(field),
- field->offset);
- ILMutexUnlock(globalTraceMutex);
- }
-#endif
/* Output a call to the static constructor */
_ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
- _ILJitStoreField(jitCoder, ptr, value, fieldType, field->offset, 1);
+ /* Regular or thread-static field? */
+ if(!ILFieldIsThreadStatic(field))
+ {
+ ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+
field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "StoreStaticField: %s.%s at offset %i\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field),
+ field->offset);
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ _ILJitStoreField(jitCoder, ptr, value, fieldType,
field->offset, 1);
+ }
+ else
+ {
+ ILJitValue ptr = _ILJitGetThreadStaticSlot(jitCoder, field);
+
+ #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "StoreThreadStaticField: %s.%s\n",
+ ILClass_Name(ILField_Owner(field)),
+ ILField_Name(field));
+ ILMutexUnlock(globalTraceMutex);
+ }
+ #endif
+ _ILJitStoreField(jitCoder, ptr, value, fieldType, 0, 0);
+ }
JITC_ADJUST(jitCoder, -1);
}
Index: pnet/engine/jitc_ptr.c
diff -u pnet/engine/jitc_ptr.c:1.4 pnet/engine/jitc_ptr.c:1.5
--- pnet/engine/jitc_ptr.c:1.4 Fri Jan 6 11:01:30 2006
+++ pnet/engine/jitc_ptr.c Sun Feb 19 18:31:11 2006
@@ -65,8 +65,8 @@
temp = jit_insn_lt(coder->jitFunction, index, length);
jit_insn_branch_if(coder->jitFunction, temp, &label2);
jit_insn_label(coder->jitFunction, &label1);
- /* TODO throw the System.IndexOutOfRange exception here. */
-
+ /* throw the System.IndexOutOfRange exception. */
+ _ILJitThrowInternal(coder->jitFunction, JIT_RESULT_OUT_OF_BOUNDS);
jit_insn_label(coder->jitFunction, &label2);
Index: pnet/engine/jitc_setup.c
diff -u pnet/engine/jitc_setup.c:1.9 pnet/engine/jitc_setup.c:1.10
--- pnet/engine/jitc_setup.c:1.9 Sun Feb 5 16:20:28 2006
+++ pnet/engine/jitc_setup.c Sun Feb 19 18:31:11 2006
@@ -111,6 +111,9 @@
ILMutexUnlock(globalTraceMutex);
}
#endif
+ /* Initialize the mem stack for the label stackstates. */
+ ILMemStackInit(&(coder->stackStates), 0);
+
/* Create the local variables. */
if(!_JITCreateLocals(coder, code->localVarSig))
{
@@ -203,6 +206,9 @@
char *methodName = _ILJitFunctionGetMethodName(jitCoder->jitFunction);
#endif
+ /* Destroy the mem stack for the label stackstates. */
+ ILMemStackDestroy(&(jitCoder->stackStates));
+
/* Clear the label pool */
ILMemPoolClear(&(jitCoder->labelPool));
jitCoder->labelList = 0;
Index: pnet/engine/jitc_stack.c
diff -u pnet/engine/jitc_stack.c:1.3 pnet/engine/jitc_stack.c:1.4
--- pnet/engine/jitc_stack.c:1.3 Mon Jan 2 11:39:23 2006
+++ pnet/engine/jitc_stack.c Sun Feb 19 18:31:11 2006
@@ -28,6 +28,16 @@
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+ if (jitCoder->flags & IL_CODER_FLAG_STATS)
+ {
+ ILMutexLock(globalTraceMutex);
+ fprintf(stdout,
+ "StackRefresh: %i\n",
+ stackSize);
+ ILMutexUnlock(globalTraceMutex);
+ }
+#endif
jitCoder->stackTop = stackSize;
}
@@ -39,7 +49,8 @@
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
jitCoder->jitStack[jitCoder->stackTop] =
- jitCoder->jitStack[jitCoder->stackTop - 1];
+ jit_insn_dup(jitCoder->jitFunction,
+ jitCoder->jitStack[jitCoder->stackTop
- 1]);
JITC_ADJUST(jitCoder, 1);
}
Index: pnet/engine/lib_reflect.c
diff -u pnet/engine/lib_reflect.c:1.73 pnet/engine/lib_reflect.c:1.74
--- pnet/engine/lib_reflect.c:1.73 Sat Oct 29 18:24:30 2005
+++ pnet/engine/lib_reflect.c Sun Feb 19 18:31:11 2006
@@ -861,11 +861,19 @@
*/
ILObject *_IL_Assembly_GetCallingAssembly(ILExecThread *thread)
{
+#ifdef IL_USE_JIT
+ ILMethod *method = _ILJitGetCallingMethod(thread, 2);
+ if(method)
+ {
+ return ImageToAssembly(thread, ILProgramItem_Image(method));
+ }
+#else
ILCallFrame *frame = _ILGetCallFrame(thread, 1);
if(frame && frame->method)
{
return ImageToAssembly(thread,
ILProgramItem_Image(frame->method));
}
+#endif
else
{
return 0;
@@ -893,11 +901,19 @@
*/
ILObject *_IL_Assembly_GetExecutingAssembly(ILExecThread *thread)
{
+#ifdef IL_USE_JIT
+ ILMethod *method = _ILJitGetCallingMethod(thread, 1);
+ if(method)
+ {
+ return ImageToAssembly(thread, ILProgramItem_Image(method));
+ }
+#else
ILCallFrame *frame = _ILGetCallFrame(thread, 0);
if(frame && frame->method)
{
return ImageToAssembly(thread,
ILProgramItem_Image(frame->method));
}
+#endif
else
{
return 0;
@@ -1446,6 +1462,7 @@
image, &newImage);
if(loadError == 0)
{
+ *error = LoadError_OK;
return ImageToAssembly(thread, newImage);
}
else if(loadError == -1)