Информация об изменениях

Сообщение Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет? от 14.09.2021 11:52

Изменено 14.09.2021 18:18 vdimas

Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

S>Выводы

S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)

И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.

Т.е., оно выглядит так:
class Object {
    private RuntimeType _type;

    public Type GetType() => _type;

    public virtual void ToString() = _type.ToString();

    ...
}

unsafe class RuntimeType {
    ...

    // по смещению 0x40 в AMDx64 ссылка на VMT (или TypeDesc)
    private IntPtr* _vmt;

    ...
}


Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
IntPtr * funcAddr = obj->_type->_vmt[4];


В плюсах путь короче:
IntPtr * funcAddr = obj->_vmt[4];


Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))
Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

S>Выводы

S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)

И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.

Т.е., оно выглядит так:
class Object {
    private RuntimeType _type;

    public Type GetType() => _type;

    public virtual void ToString() = _type.ToString();

    ...
}

unsafe class RuntimeType {
    ...

    // по смещению 0x40 в AMDx64 ссылка на VMT (или TypeDesc)
    private IntPtr* _vmt;

    ...
}


Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
IntPtr funcAddr = obj->_type->_vmt[4];


В плюсах путь короче:
IntPtr funcAddr = obj->_vmt[4];


Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))