dotgnu-pnet-commits
[Top][All Lists]
Advanced

[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)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]