Формат .ppu файлов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Как узнать что следует использовать? id или symid?
Еще есть не совсем понятные теги - undefined и formal. На них ссылаются некоторые типы. Как их интерпретировать?
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Если ссылка идет по id, то и искать нужно по id. С symid аналогично.
undefined и formal - это нужно смотреть конкретное объявление в исходнике. Насколько я поню, formal это переменная без указания типа procedure Func(const Param).
undefined - не могу сходу сказать.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Просто пока не встречал ссылок с symid.
undefined и formal первыми идут в system.ppu.

Код: Выделить всё

<interface>
    <undefined>
      <name>$undefined</name>
      <id>0</id>
      <symid>101</symid>
      <pos>
        <file>3</file>
        <line>87</line>
        <col>1</col>
      </pos>
    </undefined>
    <formal>
      <name>$formal</name>
      <id>1</id>
      <symid>102</symid>
      <pos>
        <file>3</file>
        <line>87</line>
        <col>1</col>
      </pos>
      <istyped>0</istyped>
    </formal>
    <formal>
      <name>$typedformal</name>
      <id>2</id>
      <symid>103</symid>
      <pos>
        <file>3</file>
        <line>87</line>
        <col>1</col>
      </pos>
      <istyped>1</istyped>
    </formal>
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

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

Сообщение Mirage »

Есть свойство:

Код: Выделить всё

property Items[Index: Integer]: Pointer read Get write Put; default;

В XML:

Код: Выделить всё

<prop>
          <name>Items</name>
          <symid>136</symid>
          <pos>
            <line>84</line>
            <col>14</col>
          </pos>
          <proptype>
            <unit>1</unit>
            <id>34</id>
          </proptype>
          <getter>
            <id>6</id>
          </getter>
          <setter>
            <id>10</id>
          </setter>
          <params>
            <param>
              <name>Index</name>
              <symid>137</symid>
              <pos>
                <line>84</line>
                <col>20</col>
              </pos>
              <vartype>
                <unit>1</unit>
                <id>9</id>
              </vartype>
            </param>
          </params>
        </prop>

Как узнать, что оно default?

Добавлено спустя 12 минут 44 секунды:
Еще модуль System заканчивается так:

Код: Выделить всё

<prop>
            <name>cmdline</name>
            <symid>3937</symid>
            <pos>
                <line>37</line>
                <col>10</col>
            </pos>
            <proptype>
                <id>57</id>
            </proptype>
            <getter>
                <id>1398</id>
            </getter>
            <setter></setter>
        </prop>
    </interface>
</unit>

Объявление свойства не в классе разве может быть?
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

default поправлю.

Да, в FPC можно объявлять проперти вне классов. Что и сделано в модуле system для cmdline.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

ppudump при попытке обработать файл units/i386-linux/rtl/unicodedata.ppu вместо XML выдает такое много раз:
!! Error: Deref len < 1
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Еще пару багов нашёл.
Код:

Код: Выделить всё

type r1 = record
            r1: array[0..444] of record r1: set of char; end;
        end;

XML:

Код: Выделить всё

<rec>
      <name>r1</name>
      <id>5</id>
      <symid>6</symid>
      <pos>
        <line>12</line>
        <col>14</col>
      </pos>
      <size>14240</size>
      <fields>
        <array>
          <id>6</id>
          <eltype>
            <id>7</id>
          </eltype>
          <rangetype>
            <unit>0</unit>
            <id>7</id>
          </rangetype>
          <low>0</low>
          <high>444</high>
        </array>
        <field>
          <name>r1</name>
          <symid>7</symid>
          <pos>
            <line>13</line>
            <col>13</col>
          </pos>
          <vartype>
            <id>6</id>
          </vartype>
        </field>
      </fields>
    </rec>

При этом тега с <id>7</id>, на который ссылается eltype в XML нет.
Проблема похожа на ту, что выше, только проявляется с еще одним уровнем вложенности.
еще:

Код: Выделить всё

procedure pa(a1: array of Byte);

XML:

Код: Выделить всё

<proc>
      <name>pa</name>
      <id>9</id>
      <symid>9</symid>
      <pos>
        <line>16</line>
        <col>15</col>
      </pos>
      <options>
        <value>procedure</value>
      </options>
      <rettype>
        <unit>0</unit>
        <id>3</id>
      </rettype>
      <params>
        <array>
          <id>10</id>
          <eltype>
            <unit>0</unit>
            <id>4</id>
          </eltype>
          <rangetype>
            <unit>0</unit>
            <id>9</id>
          </rangetype>
          <low>0</low>
          <high>-1</high>
        </array>
        <param>
          <name>a1</name>
          <symid>10</symid>
          <pos>
            <line>16</line>
            <col>18</col>
          </pos>
          <vartype>
            <id>10</id>
          </vartype>
        </param>
      </params>
    </proc>

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

ppudump из SVN ревизии 26014.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В последнем примере используется не динамический, а открытый массив ("обычный" массив с диапазоном 0..-1). У них одинаковый синтаксис, что вечно вызывает путаницу. Тем не менее, ppu правильный.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Я понимаю разницу, но все же определять это по тому, что верхний предел -1 мне кажется не правильным. Тем более, что у динамических массивов этот предел тоже -1. Но есть еще тег option/dynamic. Тут тоже не помешал бы такой тег. Например option/open.
Консистентности выходному формату ppudump сильно не достаёт. Парсить сложно. Особенно SAX'ом.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Модуль Classes, класс TFPList. Есть функция:
function IndexOfItem(Item: Pointer; Direction: TDirection): Integer;
В XML выглядит так:

Код: Выделить всё

<proc>
          <name>IndexOfItem</name>
          <id>89</id>
          <symid>298</symid>
          <pos>
            <file>1</file>
            <line>257</line>
            <col>14</col>
          </pos>
          <options>
            <value>function</value>
          </options>
          <rettype>
            <unit>0</unit>
            <id>9</id>
          </rettype>
          <params>
            <param>
              <name>Item</name>
              <symid>299</symid>
              <pos>
                <file>1</file>
                <line>257</line>
                <col>26</col>
              </pos>
              <vartype>
                <unit>0</unit>
                <id>34</id>
              </vartype>
            </param>
            <param>
              <name>Direction</name>
              <symid>300</symid>
              <pos>
                <file>1</file>
                <line>257</line>
                <col>41</col>
              </pos>
              <vartype>
                <id>75</id>
              </vartype>
            </param>
          </params>
        </proc>

Т.е. ссылается на TDirection как на id=75.
Объявление TDirection выглядит так:

Код: Выделить всё

<type>
          <name>TDirection</name>
          <symid>259</symid>
          <pos>
            <file>1</file>
            <line>244</line>
            <col>20</col>
          </pos>
          <ref>
            <id>75</id>
          </ref>
        </type>

У него id не 75.
Объявление с id=75 есть, оно выглядит так:

Код: Выделить всё

<enum>
      <id>75</id>
      <symid>259</symid>
      <low>0</low>
      <high>1</high>
      <size>4</size>
      <elements>
        <const>
          <name>FromBeginning</name>
          <symid>260</symid>
          <pos>
            <file>1</file>
            <line>244</line>
            <col>21</col>
          </pos>
          <valtype>int</valtype>
          <value>0</value>
        </const>
        <const>
          <name>FromEnd</name>
          <symid>262</symid>
          <pos>
            <file>1</file>
            <line>244</line>
            <col>36</col>
          </pos>
          <valtype>int</valtype>
          <value>1</value>
        </const>
      </elements>
    </enum>

По идее, параметр функции должен ссылаться на объявление типа TDirection, а не на сам тип, на который ссылается объявление TDirection.
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Mirage,
поправил default,
поправил !! Error: Deref len < 1
поправил TDirection

Добавлено спустя 21 час 35 минут 20 секунд:
Испавил и этот случай:

Код: Выделить всё

type r1 = record
            r1: array[0..444] of record r1: set of char; end;
        end;
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Спасибо.
Изменения доступны пока в SVN только? В какой ревизии?
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Да, изменения только в svn. r26277.
Ответить