Моя перзистентная система

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

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

Ваше мнение:

Мне как раз такой и не хватало!
2
8%
Полезная вещь.
11
44%
Для меня, увы, неприменима.
10
40%
Бесполезна.
2
8%
 
Всего голосов : 25

Сообщение Mirage » 26.02.2007 11:13:14

При этом неизвестные классы загружаются как их известные предки.


Хмм... Правильно я понимаю что встречая имя неизвестного класса, система по этому имени находит ближайший известный предок?
А как это делается в общих чертах, если не секрет?
Mirage
энтузиаст
 
Сообщения: 748
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение Cheb » 26.02.2007 19:25:43

При сохранении в заголовок файла для каждого класса пишется цепочка имён его предков (составляемая один раз, при запуске программы и регистрации классов).
Наткнувшись при чтении на незнакомое имя класса, парсер начинает "спускаться" по этой цепочке вниз, пока не найдёт имя, известное текущей версии программы. Дальше включается стандартный механизм сверки списка полей и преобразования по необходимости.

Конечно, недостатки тоже имеются - например, пока нет проверки соответствия получаемого типа типу поля в котором он хранится -- если попадётся класс, у которого совсем нет известных предков, то его низведут до корневого предка, TTrulyPersistent, и программа, скорее всего, грохнется потом при обращении к такому объекту, ожидая что-то иное.

Но в разумных пределах совместимость "вперёд" может оказаться очень и очень полезна.

P.S. Ну что, юзверь-мануал на русский переводить, или не нужно?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение cranium » 26.02.2007 20:24:52

Переводи конечно, зачем терять часть русскоязычной аудитории, не владеющую английским:)
cranium
постоялец
 
Сообщения: 143
Зарегистрирован: 08.05.2005 03:59:45
Откуда: Санкт-Петербург

Сообщение Cheb » 26.02.2007 21:15:08

Ооо-кей :twisted: [закатывает рукава, и подступает к мануалу. Мануал скулит и пятится.]
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 27.02.2007 00:20:39

Ловите, вот она!
http://host-17-99.imsys.net/_share/_001 ... ta_ru.html
Ну не могуч лия, ну не богатырь ли? 8)

...так, ладно, пора с собаками гулять и ещё узнать надо, как Лину Инверс в мазоку превратиться угораздило... :roll:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 27.02.2007 15:26:48

Версия 0.7.0 вышла:

https://sourceforge.net/projects/chepersy/

Пришлось потра...:oops: Поковыряться с Дельфи: редиска, оказывается, не знает типа QWord.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение zub » 27.02.2007 17:31:20

делаю подобную штуку. но регистрация типов осуществляется парсеньем исходников программы
zub
долгожитель
 
Сообщения: 2137
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Cheb » 27.02.2007 20:06:26

но регистрация типов осуществляется парсеньем исходников программы

Я тоже сначала так хотел. Но потом понял, что не осилю. Да и, в конце-то концов... Типов в любой программе используется весьма немного, поля теперь регистрируются достаточно удобно... Для большинства применений хватит.

делаю подобную штуку.

плохо, что каждый из нас вечно свой велосипед изобретает. :(
Но, с другой стороны, разнообразие...

Мне, к сожалению, ничей, чужой велосипед не подойдёт: уж больно архитектура у CGE извратная. Даже модуль opengl пришлось сильно под себя переделывать.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 12.05.2007 23:14:11

Выложил 0.7.1.
Багофиксы, реорганизация.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 01.06.2007 01:26:00

Над душой нависла версия 0.8 8)

Код: Выделить всё
  Type converter "SINGLE" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 0041329Ch
  Type converter "SHORTINT,SMALLINT,LONGINT,INT64" -> "SINGLE": 004135D8h
  Type converter "BYTE,WORD,LONGWORD,QWORD" -> "SINGLE": 00413850h
  Type converter "DOUBLE" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 00413380h
  Type converter "EXTENDED" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 004134A0h

.......

Class "TTESTDATANEXT": field "B:LONGINT": Converting from "SINGLE".


Плюс, в ней по умолчанию компилируется код без надругательств над VMT: обходной путь медленнее, но безопаснее.

Плюс, возможность писать в любой TStream, а не только в файл.

К субботе надеюсь довести до съедобного вида и выложить :D
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 02.06.2007 19:52:40

Напоролся на один забавный баг с динамическими массивами. Кое-что переделываю. Результат будет только завтра.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 03.06.2007 15:54:38

Версия 0.8 вышла.

https://sourceforge.net/projects/chepersy/

-- Исправлен фатальный баг с многомерными динамическими массивами (не работали в Дельфи)

-- Найден обход для хака с VMT, код стал безопаснее (хотя и медленнее). Старый вариант можно включить, раскомментировав дефайн в mo_globaldefs.h

-- Добавлена поддержка записи/чтения в любой TStream (включая TMemoryStream) а не только в файл на диске.

-- Создан механизм преобразования типов (было у вас поле integer, а стало double, например). Встроена поддержка всех числовых типов, включая дин. массивы из оных любой размерности. Единственный минус - оба типа должны быть известны текущей версии программы.

-- Улучшена регистрация динамических массивов, для регистрации многомерных массивов больше не нужно объявлять и регистрировать все промежуточные типы. Добавлены RegTypeDynArray2d() и RegTypeDynArrayNd(). (см. документацию)

-- процедура RegTypeDynArray() переименована в RegTypeDynArray1d()

-- Добавлена проверка, чтобы нельзя было зарегистрировать несколько полей с одним именем.

-- Добавлена проверка на совместимость с используемым компилятором (способы размещения данных в памяти, и прочая).

-- Слегка подновлены доки (хотя там ещё конь не валялся).

-- Исправлен нечитаемый куск текста в русской документации.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 28.02.2008 02:12:30

27 февраля 2008: при первой же попытке практического прменения выявила фатальный ляп (даже два ляпа):

Самое главное - динамические массивы используют другой аллокатор, а не тот, что в GetMem/FreeMem. ПРи размерах <500 байт размер выделенного под массив куска меняется резкими ступенями вроде 12 - 44-108-230-488.

Заплатка пока я не выпущу 0.8.2:
(замените этим соостветствующую процедуру)

Код: Выделить всё
type TArrayOfByte = array of byte;
Procedure NewDynArray(parray: pointer; Len, BaseTypeInd: integer);
var
  p: pointer;
begin
  pointer(parray^):= nil;
  SetLength(TArrayOfByte(parray^), Len * Types[BaseTypeInd].Size);
  if Len > 0 then  //high value in FreePascal, length  in Delphi
  {$ifdef fpc}
    dword((pointer(parray^) - 4)^):= Len - 1;
  {$else}
    dword(pointer(cardinal(parray^) - 4)^):= Len;
  {$endif}
end;   
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 03.03.2008 21:34:20

МАТЬ!!!! :evil:
Какой дебильнейший ляп я посадил... :oops:
0.8.0 и 0.8.1 вовсю запарывают кучу, а тест этого не выявил.

0.8.2 уже готова и работает, погодите денёк пока выложу.

P.S.
надо:
Код: Выделить всё
  procedure ReadUnaligned(p: pointer; NumBytes: integer);
  var
    i: integer;
    w: dword{$ifdef fpc} = 0{$endif};
  begin
    {$ifndef fpc}
      w:=0;
    {$endif}
    i:= NumBytes div 4;
    if i > 0 then begin
      ReadBin(p, i); //оперирует 32-битными словами
      Inc(cardinal(p), i * 4);
    end;
    i:=NumBytes - i*4;
    if i > 0 then begin
      ReadDword(@w);
      move(w, p^, i);
    end;
  end;

было:
Код: Выделить всё
procedure ReadUnaligned(p: pointer; NumBytes: integer);
  var
    i: integer;
    w: dword{$ifdef fpc} = 0{$endif};
  begin
    {$ifndef fpc}
      w:=0;
    {$endif}
    i:= 1 + ((NumBytes - 1) div 4);
    if i > 0 then begin
      ReadBin(p, i);
      Inc(cardinal(p), i * 4);
    end;
    i:=NumBytes - i*4;
    if i > 0 then begin
      ReadDword(@w);
      move(w, p^, i);
    end;
  end;


Остаётся только заползти под какой-нибудь камень и сдохнуть от стыда :oops:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 05.03.2008 01:33:47

Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

Вернуться в Разное

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 1

Рейтинг@Mail.ru