![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
В некоторых случаях, высакивает ошибка, если быть точнее, то после исправления кода в датамодуле первый раз компилируется нормально, при повторной компиляции высакивает ошибка типа Access violation..
Код:
procedure _LStrArrayClr(var StrArray; cnt: longint);
{$IFDEF PUREPASCAL}
var
P: Pointer;
begin
P := @StrArray;
while cnt > 0 do
begin
_LStrClr(P^);
Dec(cnt);
Inc(Integer(P), sizeof(Pointer));
end;
end;
{$ELSE}
asm
{ -> EAX pointer to str }
{ EDX cnt }
PUSH EBX
PUSH ESI
MOV EBX,EAX
MOV ESI,EDX
@@loop:
MOV EDX,[EBX] { fetch str }
TEST EDX,EDX { if nil, nothing to do }
JE @@doneEntry
MOV dword ptr [EBX],0 { clear str }
MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt }
DEC ECX { if < 0: literal str }
JL @@doneEntry
LOCK DEC [EDX-skew].StrRec.refCnt { threadsafe dec refCount }
JNE @@doneEntry
LEA EAX,[EDX-skew].StrRec.refCnt { if refCnt now zero, deallocate}
CALL _FreeMem
@@doneEntry:
ADD EBX,4
DEC ESI
JNE @@loop
POP ESI
POP EBX
end;Код:
MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt }Последний раз редактировалось Asinkrit, 22.01.2010 в 21:28. |
|
#2
|
|||
|
|||
|
Хм... это очистка AnsiString, похоже.
Вот почему у тебя компилятор на этом ругается - это вопрос. У тебя случаем не подменный этот модуль? Обычно System.pas берется готовый скомпилированный из библиотеки. Нафига он у тебя пересобирается??? |
|
#3
|
||||
|
||||
|
Ты уверен что по адресу [EDX-skew] есть какие то данные???
Ибо если сделать Dec ECX, а он (регистр) равен нулю, то все возможно... имхо... |