Организация VMT

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

Организация VMT

Сообщение XProger » 02.09.2008 13:33:04

Доброго времени суток.
Интересует такие вопросы:
1) В чём различия VMT object'а и class'a?
2) Вытекающий из предыдущего, возможно ли имея экземпляр класса, преобразовать его в object?
3) Существуют ли различия в строении VMT в FPC относительно Delphi?
4) Структура VMT классов в C++?
5) Очень, очень, очень хотелось бы почитать литературу по данной теме.

Задача породившая все эти вопросы - импорт C++ классов из dll в FPC/Delphi.
Чувствую, что без должного понимания кишок у меня ничего не выйдет...
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Организация VMT

Сообщение v-t-l » 02.09.2008 15:32:37

Прямой доступ к VMT от чужого компилятора имеет смысл, если VMT стандартизирован. Иначе придется подстраиваться под разные компиляторы, или даже их версии. А сейчас используется такой подход: ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf http://wiki.lazarus.freepascal.org/Crea ... _libraries
v-t-l
энтузиаст
 
Сообщения: 728
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Организация VMT

Сообщение XProger » 02.09.2008 16:28:27

Врапперы и изменение dll мою задачу никак не удовлетворяют :\

Путём научного тыка научился переводить Delphi class'ы в object'ы. Узнал, что поля класса (переменные) должны находиться после всех методов объекта.
Код: Выделить всё
program Test;

{$APPTYPE CONSOLE}

type
  TMyClass = class
    x : Integer;
    procedure Test; virtual;
  end;

  PMyObject = ^TMyObject;
  TMyObject = object
    procedure Test; virtual; abstract;
  public
    x : Integer;
  end;

function Init: Pointer;
begin
  Result := TMyClass.Create;
end;

procedure TMyClass.Test;
begin
  writeln(x);
end;

var
  MyObj : PMyObject;
begin
  MyObj := Init;
  MyObj^.Test;
  MyObj^.x := 123;
  MyObj^.Test;
  readln;
end.

Данный метод отлично работает в Delphi, но вылетает с ошибкой в FPC. Возможно в Delphi он работает опираясь на багу... :\
Не знаю с какой стороны подступиться...
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Организация VMT

Сообщение Sergei I. Gorelkin » 02.09.2008 17:47:45

Структуру VMT class-a можно увидеть в файле rtl/inc/objpash.inc (запись TVmt). Дельфи отличается тем, что у него нет первых двух полей (с размером) и поля vMsgStrPtr. Кроме того, в Дельфи указатель на VMT (тот, что находится в первом поле объекта) указывает на первый виртуальный метод (т.е. поле vDestroy), а обращение ко всему, что до него, идет с отрицательными смещениями.
В строение VMT object-a я особо не вникал, но в любом случае в ней нет первой половины с class-специфичной информацией. И потом, не является ли она частью собственно данных объекта?
В С++ все еще интереснее, учитывая поддержку языком множественного наследования...

Короче говоря, люди пишут врапперы отнюдь не из-за отсутствия морали.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Организация VMT

Сообщение FedeX » 02.09.2008 18:09:05

Забавно что назад (обьект -> класс) преобразовать таким способом не удасться... Вообще дело это не благодарное, в плане того что доков по этому делу просто нет.
Ещё про внутреннее устройство классов Делфи можно найти в справке по самой Делфи:
A class-type value is stored as a 32-bit pointer to an instance of the class, which is called an object. The internal data format of an object resembles that of a record. The object’s fields are stored in order of declaration as a sequence of contiguous variables. Fields are always aligned, corresponding to an unpacked record type. Any fields inherited from an ancestor class are stored before the new fields defined in the descendant class.
The first 4-byte field of every object is a pointer to the virtual method table (VMT) of the class. There is exactly one VMT per class (not one per object); distinct class types, no matter how similar, never share a VMT. VMTs are built automatically by the compiler, and are never directly manipulated by a program. Pointers to VMTs, which are automatically stored by constructor methods in the objects they create, are also never directly manipulated by a program.

The layout of a VMT is shown in the following table. At positive offsets, a VMT consists of a list of 32-bit method pointers—one per user-defined virtual method in the class type—in order of declaration. Each slot contains the address of the corresponding virtual method’s entry point. This layout is compatible with a C++ v-table and with COM. At negative offsets, a VMT contains a number of fields that are internal to Object Pascal’s implementation. Applications should use the methods defined in TObject to query this information, since the layout is likely to change in future implementations of Object Pascal.

    Offset Type Description
    –76 Pointer pointer to virtual method table (or nil)
    –72 Pointer pointer to interface table (or nil)
    –68 Pointer pointer to Automation information table (or nil)
    –64 Pointer pointer to instance initialization table (or nil)
    –60 Pointer pointer to type information table (or nil)
    –56 Pointer pointer to field definition table (or nil)
    –52 Pointer pointer to method definition table (or nil)
    –48 Pointer pointer to dynamic method table (or nil)
    –44 Pointer pointer to short string containing class name
    –40 Cardinal instance size in bytes
    –36 Pointer pointer to a pointer to ancestor class (or nil)
    –32 Pointer pointer to entry point of SafecallException method (or nil)
    –28 Pointer entry point of AfterConstruction method
    –24 Pointer entry point of BeforeDestruction method
    –20 Pointer entry point of Dispatch method
    –16 Pointer entry point of DefaultHandler method
    –12 Pointer entry point of NewInstance method
    –8 Pointer entry point of FreeInstance method
    –4 Pointer entry point of Destroy destructor
    0 Pointer entry point of first user-defined virtual method
    4 Pointer entry point of second user-defined virtual method
...но вот про "устаревший" object лично я ничего не нашол. У самого FPC доков по этому делу 99,9% вероятности что нет, хорошо хоть исходники открыты - можно покопаться, если сильно надо. Про устройство сишных классов, надо спрашивать в доках к сишным компиляторам, хотя я слышал что у них дела немного получше и есть кой какой стандарт, хотя впрочем Visual Studio его вроде уже не соблюдает (слышал что раньше там переменные полей в классе хранились как и в Делфи в порядке обьявьления, потом - по алфавиту) :roll:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Организация VMT

Сообщение zub » 02.09.2008 23:03:33

>>...но вот про "устаревший" object лично я ничего не нашол
там все просто, идут поля в порядке определения с учетом выравнивания, ссылка на vmt появляется при первом виртуальном методе
в делфи адреса виртуальных методов идут с начала vmt, в фпц в первых 12 байтах vmt служебная инфа, дальше адреса методов в порядке определения.

без учета выравнивания полей и 12байт начала vmt, objectы в delphi и fpc одинаковые

edit:
еще отличие - если нужно руками запустиь конструктор:
в фпц просто запускаем, в делфи нужно чтоб перед запуском в edx лежал адрес vmt конструируемого object`а
Последний раз редактировалось zub 02.09.2008 23:11:21, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Организация VMT

Сообщение XProger » 02.09.2008 23:07:10

zub, ооо, пасиб за подробности! )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Организация VMT

Сообщение zub » 02.09.2008 23:25:34

незачто)
в этих 12 байтах если не изменяет память: размер полей объекта, -размер полей объекта, адрес VMT родителя
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26


Re: Организация VMT

Сообщение *vmr » 29.10.2008 00:46:59

Об использовании в Delphi классов, созданных в MS VC++
(Экспорт открытых методов чужого класса в свою программу)

http://www.citforum.ru/programming/delp ... in_delphi/
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: Организация VMT

Сообщение XProger » 29.10.2008 03:05:52

Информация не полна, т.к. MSVC++ помимо всего прочего меняет порядок следования overload методов, чего gcc, кстати, не делает )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Организация VMT

Сообщение *vmr » 29.10.2008 10:00:36

Конечно не полна....
Это я так, в общую копилку :)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев


Вернуться в Компилятор / язык программирования

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron