[fpc-devel] Fatal: Internal error 200512115
Alexander Shishkin
alexvins at mail.ru
Thu Oct 27 16:49:46 CEST 2011
27.10.2011 18:36, Sven Barth пишет:
> Am 27.10.2011 16:19, schrieb Alexander Shishkin:
>> 27.10.2011 17:40, Jonas Maebe пишет:
>>>
>>> On 27 Oct 2011, at 15:26, Alexander Shishkin wrote:
>>>
>>>> I`ve got this with 2.5.1 & 2.7.1
>>>>
>>>> 1) unable to clean reproduce (real code is
>>>> https://github.com/alexvins/dwscript/tree/628669df8fd349968e7498ab1da617be6c4f3977)
>>>>
>>>>
>>>>
>>>> 2) error reported in the middle of EMPTY line.
>>>
>>> This internal error indicates that a problem occurred while generating
>>> code for a specialization of a generic. This code generation does not
>>> happen when the specialization is declared, but only after all the code
>>> in the unit has been compiled. That's why you get a bogus error
>>> location.
>>>
>>>> 3) no ideas how to to make workaround
>>>
>>> Me neither, except for not using generics at all (or disabling your
>>> specializations one by one to figure out which one triggers the
>>> problem).
>>>
>>>
>> I found problematic place. BTW the compiler internal error line&col
>> position was right, but unit name was wrong.
>
> It would be nice if you'd mention line, column, incorrect unitname and
> correct unitname. Then I might be able to help you ;)
>
> Regards,
> Sven
>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>
>
Wrong message:
...\Source\dwsSymbols.pas(264,20) Fatal: Internal error 200512115
Real place:
\Source\dwsUtils.pas(263,20)
Patch for workaround:
Source/dwsUtils.pas | 25 +++++++++++++++++++------
1 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/Source/dwsUtils.pas b/Source/dwsUtils.pas
index a733f57..89b7dbb 100644
--- a/Source/dwsUtils.pas
+++ b/Source/dwsUtils.pas
@@ -231,11 +231,17 @@ TSimpleHashBucket<T> = record
{: Minimalistic open-addressing hash, subclasses must override
SameItem and GetItemHashCode.
HashCodes *MUST* be non zero }
+
+ { TSimpleHash }
+
TSimpleHash<T> = class
{$IFDEF FPC}
private
type
THashBucket = TSimpleHashBucket<T>;
+ public
+ type
+ THashEnumProc = TSimpleHashProc<T>;
{$ENDIF}
private
{$IFDEF FPC}
@@ -260,7 +266,11 @@ TSimpleHash<T> = class
function Extract(const anItem : T) : Boolean; // true if
extracted
function Contains(const anItem : T) : Boolean;
function Match(var anItem : T) : Boolean;
+ {$IFDEF FPC}
+ procedure Enumerate(const callBack : THashEnumProc);
+ {$ELSE}
procedure Enumerate(const callBack : TSimpleHashProc<T>);
+ {$ENDIF}
procedure Clear;
property Count : Integer read FCount;
@@ -1535,24 +1545,27 @@ function TSimpleHash<T>.Match(var anItem : T) :
Boolean;
// Enumerate
//
-procedure TSimpleHash<T>.Enumerate(const callBack : TSimpleHashProc<T>);
+{$IFDEF FPC}
+procedure TSimpleHash<T>.Enumerate(const callBack: THashEnumProc);
var
i : Integer;
-{$IFDEF FPC}
_cb:TSimpleHashProc<T>; //TODO: remove ugly workaround
-{$ENDIF}
begin
- {$IFDEF FPC}
_cb := callBack;
for i:=0 to High(FBuckets) do
if FBuckets[i].HashCode<>0 then
_cb(FBuckets[i].Value);
- {$ELSE}
+end;
+{$ELSE}
+procedure TSimpleHash<T>.Enumerate(const callBack : TSimpleHashProc<T>);
+var
+ i : Integer;
+begin
for i:=0 to High(FBuckets) do
if FBuckets[i].HashCode<>0 then
callBack(FBuckets[i].Value);
- {$ENDIF}
end;
+{$ENDIF}
// Clear
//
More information about the fpc-devel
mailing list