|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка в модуле System,
В некоторых случаях, высакивает ошибка, если быть точнее, то после исправления кода в датамодуле первый раз компилируется нормально, при повторной компиляции высакивает ошибка типа 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, а он (регистр) равен нулю, то все возможно... имхо... В начале был Бит, потом Байт и только потом появилось Слово... |