Yuan,

Rotor always uses JIT_NewFast to allocate objects. There is a mechanism
to allow for use of highly tuned per platforms allocators via use of
getNewHelper(...), but it is not used in Rotor for portability reasons.

Here is x86 dissasembly for the following IL:

IL_0000:  newobj     instance void MainApp::.ctor()
IL_0005:  stloc.0

03457bb1 b8b844d700       mov     eax,0xd744b8   // MT for MainApp
03457bb6 50               push    eax
03457bb7 b83a4c9500       mov     eax,0x954c3a   // Address of
JIT_NewFast
03457bbc ffd0             call    eax
03457bbe 83c404           add     esp,0x4

03457bc1 8bf0             mov     esi,eax        // Save the pointer to
the 
03457bc3 8bc8             mov     ecx,eax        // blank object in esi
03457bc5 51               push    ecx
03457bc6 b8fc44d700       mov     eax,0xd744fc
03457bcb ff10             call    dword ptr [eax]// Call the constructor
03457bcd 83c404           add     esp,0x4
03457bd0 8bc6             mov     eax,esi        // Get the object ref
from  
03457bd2 be00000000       mov     esi,0x0        // esi and store it in
a 
03457bd7 8945f0           mov     [ebp-0x10],eax // local 

(Note esi is set to NULL because it is in the root set for the GC)

The code paths for allocating valuetypes and arrays are different. Let
me know which one you are interested in.

Thanks,

Vladimir

This posting is provided "AS IS" with no warranties, and confers no
rights.

-----Original Message-----
From: Discussion of the Rotor Shared Source CLI implementation
[mailto:[EMAIL PROTECTED] On Behalf Of Yuan Yu
Sent: Friday, August 01, 2003 6:12 PM
To: [EMAIL PROTECTED]
Subject: [DOTNET-ROTOR] How does FJit::compileCEE_NEWOBJ work?

I have been trying to understand how the newobj instruction is jitted.
For
a simple class like

   class Foo { int x = 5; }

and an instruction

   newobj     instance void Foo

Rotor calls FJit::compileCEE_NEWOBJ, and goes to the "allocate normal
object" case where the first line is

  helper_ftn = jitInfo->getHelperFtn(jitInfo->getNewHelper(targetClass,
methodHandle));

The value of jitInfo->getNewHelper(targetClass, methodHandle) appears to
be CORINFO_HELP_NEWSFAST, and, according to the table hlpFuncTable, it
seems to map to JIT_NewFast. So, I thought the helper function
helper_ftn
must have been JIT_NewFast. However, it does not seem to be the case.
So,
what is the value of helper_ftn?

Thanks,
-Yuan

Reply via email to