The else part handles arrays of value classes. Look for "negative series
has a special meaning" in array.cpp for the place where such GCDesc is
created.

GetHighestSeries() returning a value lower than GetLowestSeries() is
used to mark this special case.

The arrays of value classes needs *repeating* regions with gcrefs and
without them. The regular GCDesc does not handle this case to make it
simple and fast.

-Jan

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 Jorge Sanchez
Sent: Friday, January 09, 2004 3:14 AM
To: [EMAIL PROTECTED]
Subject: [DOTNET-ROTOR] About go_trought_object macro

Hello,

when looking through the macro go_through_object, i've come across with
a
problem i'm not able to solve. I have successfully understood the first
branch of the if statement (if cur >= last). This branch (I.M.O.) traces
all the CGCDescSeries contained prior to the MethodTable and follow all
object pointers located within the range defined by these series. As you
know a serie is defined by its starting point and its size.

The problem arises when examing the else statement. I don't know what
the
field val_serie is used for. And I also can't imagine a case when
GetHighestSeries() returns a value lower than GetLowestSeries().

It would be of great help if anyone could explain to me when this
happens
and what is that field used for.

Thank you very much in advance

Jorge Sanchez

-- THE CODE --
(if statement omitted)

else
\
{
\
    SSIZE_T cnt = (SSIZE_T)map->GetNumSeries();
\
    BYTE** parm = (BYTE**)((o) + cur->startoffset);
\

    while ((BYTE*)parm < ((o)+(size)-plug_skew))
\
    {
\
        for (SSIZE_T __i = 0; __i > cnt; __i--)
\
        {
\
            HALF_SIZE_T skip =  cur->val_serie[__i].skip;
\
            HALF_SIZE_T nptrs = cur->val_serie[__i].nptrs;
\
            BYTE** ppstop = parm + nptrs;
\
            do
\
            {
\
               {exp}
\
               parm++;
\
            } while (parm < ppstop);
\
            parm = (BYTE**)((BYTE*)parm + skip);
\
        }
\
    }
\
}

===================================
This list is hosted by DevelopMentor(r)  http://www.develop.com
NEW! ASP.NET courses you may be interested in:

2 Days of ASP.NET, 29 Sept 2003, in Redmond
http://www.develop.com/courses/2daspdotnet

Guerrilla ASP.NET, 13 Oct 2003, in Boston
http://www.develop.com/courses/gaspdotnet

View archives and manage your subscription(s) at
http://discuss.develop.com

===================================
This list is hosted by DevelopMentorŪ  http://www.develop.com
NEW! ASP.NET courses you may be interested in:

2 Days of ASP.NET, 29 Sept 2003, in Redmond
http://www.develop.com/courses/2daspdotnet

Guerrilla ASP.NET, 13 Oct 2003, in Boston
http://www.develop.com/courses/gaspdotnet

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to