mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 17:49:14 +02:00
codetools: h2p: workaround for fpc var/const string bug
git-svn-id: trunk@14682 -
This commit is contained in:
parent
f0bbffbdde
commit
a31259b22c
@ -164,6 +164,7 @@ static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
|
||||
}
|
||||
|
||||
typedef unsigned short sa_family_t;
|
||||
int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -263,9 +263,11 @@ type
|
||||
InsertAsPreLast: boolean = false): TH2PNode;
|
||||
function CreateAutoGeneratedH2PNode(var PascalName: string; CNode: TCodeTreeNode;
|
||||
PascalDesc: TCodeTreeNodeDesc; const PascalCode: string;
|
||||
ParentNode: TH2PNode = nil; IsGlobal: boolean = true): TH2PNode;
|
||||
ParentNode: TH2PNode; IsGlobal: boolean;
|
||||
InsertAsPreLast: boolean): TH2PNode;
|
||||
function GetH2PNodeForComplexType(CNode: TCodeTreeNode;
|
||||
CreateIfNotExists: boolean = true): TH2PNode;
|
||||
CreateIfNotExists: boolean;
|
||||
InsertAsPreLast: boolean): TH2PNode;
|
||||
function CreatePascalNameFromCCode(const CCode: string;
|
||||
StartPos: integer = 1;
|
||||
EndPos: integer = -1): string;
|
||||
@ -510,6 +512,7 @@ procedure TH2PasTool.ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode);
|
||||
var
|
||||
CurName: String;
|
||||
TypeH2PNode: TH2PNode;
|
||||
CurCName: String;
|
||||
begin
|
||||
CurName:=CTool.ExtractStructName(CNode);
|
||||
if CurName='' then begin
|
||||
@ -518,7 +521,8 @@ begin
|
||||
end else begin
|
||||
// this struct has a name
|
||||
// create a type
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'',
|
||||
CurCName:=CurName;
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'',
|
||||
nil,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.ConvertStruct ADDED ',TypeH2PNode.DescAsString(CTool)]);
|
||||
// build recursively
|
||||
@ -535,6 +539,7 @@ var
|
||||
SimpleType: String;
|
||||
H2PNode: TH2PNode;
|
||||
SubTypeName: String;
|
||||
CurCName: String;
|
||||
begin
|
||||
if (CNode.FirstChild<>nil) and (CNode.FirstChild.Desc=ccnUnion)
|
||||
then begin
|
||||
@ -542,7 +547,8 @@ begin
|
||||
if (ParentNode<>nil) and (ParentNode.PascalDesc=ctnRecordType)
|
||||
then begin
|
||||
// create a pascal 'record case'
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordCase,'',
|
||||
CurCName:=CurName;
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordCase,'',
|
||||
ParentNode,false);
|
||||
DebugLn(['TH2PasTool.ConvertVariable added record case for nested union']);
|
||||
// build recursively the record cases
|
||||
@ -560,7 +566,8 @@ begin
|
||||
BuildH2PTree(TypeH2PNode,CNode.FirstChild.FirstChild);
|
||||
// create variable
|
||||
CurName:=CTool.ExtractUnionName(CNode);
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,
|
||||
TypeH2PNode.PascalName,
|
||||
nil,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.ConvertVariable added variable for union: ',H2PNode.DescAsString(CTool)]);
|
||||
@ -573,13 +580,15 @@ begin
|
||||
SimpleType:=GetSimplePascalTypeOfCVar(CNode);
|
||||
if SimpleType='' then begin
|
||||
// this variable has a complex type
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
|
||||
if TypeH2PNode<>nil then
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end;
|
||||
if SimpleType<>'' then begin
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SimpleType,
|
||||
ParentNode,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.ConvertVariable CurName=',CurName,' ',H2PNode.PascalName]);
|
||||
DebugLn(['TH2PasTool.ConvertVariable added: ',H2PNode.DescAsString(CTool)]);
|
||||
end else begin
|
||||
DebugLn(['TH2PasTool.ConvertVariable SKIPPING Variable Name="',CurName,'" Type="',CurType,'"']);
|
||||
@ -594,17 +603,19 @@ var
|
||||
TypeH2PNode: TH2PNode;
|
||||
CurValue: String;
|
||||
H2PNode: TH2PNode;
|
||||
CurCName: String;
|
||||
begin
|
||||
CurName:=CTool.ExtractEnumBlockName(CNode);
|
||||
if CurName='' then begin
|
||||
// this is an anonymous enum block => auto generate a name
|
||||
CurName:=CreatePascalNameFromCCode(CTool.Src,CNode.StartPos,CNode.EndPos);
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnEnumerationType,'',
|
||||
nil,ParentNode=nil);
|
||||
nil,true,false);
|
||||
end else begin
|
||||
// this enum block has a name
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumerationType,'',
|
||||
nil,ParentNode=nil);
|
||||
CurCName:=CurName;
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnEnumerationType,'',
|
||||
nil,true);
|
||||
end;
|
||||
DebugLn(['TH2PasTool.ConvertEnumBlock added: ',TypeH2PNode.DescAsString(CTool)]);
|
||||
|
||||
@ -613,8 +624,9 @@ begin
|
||||
if CNode.Desc=ccnEnumID then begin
|
||||
CurName:=CTool.ExtractEnumIDName(CNode);
|
||||
CurValue:=CTool.ExtractEnumIDValue(CNode);
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumIdentifier,CurValue,
|
||||
TypeH2PNode,ParentNode=nil);
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnEnumIdentifier,CurValue,
|
||||
TypeH2PNode,true);
|
||||
DebugLn(['TH2PasTool.ConvertEnumBlock added: ',H2PNode.DescAsString(CTool)]);
|
||||
end;
|
||||
CNode:=CNode.NextBrother;
|
||||
@ -634,6 +646,7 @@ var
|
||||
H2PNode: TH2PNode;
|
||||
SubTypeName: String;
|
||||
ParamsNode: TCodeTreeNode;
|
||||
CurCName: String;
|
||||
begin
|
||||
CurName:=CTool.ExtractFunctionName(CNode);
|
||||
CurType:=CTool.ExtractFunctionResultType(CNode);
|
||||
@ -650,7 +663,7 @@ begin
|
||||
end;
|
||||
if Ok and (SimpleType='') then begin
|
||||
// this function has a complex result type
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
|
||||
if TypeH2PNode<>nil then begin
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end else
|
||||
@ -662,11 +675,12 @@ begin
|
||||
// create proc type
|
||||
ParamsNode:=CTool.GetFunctionParamListNode(CNode);
|
||||
SubTypeName:=CreatePascalNameFromCCode(CurName+CTool.ExtractFunctionParamList(CNode));
|
||||
TypeH2PNode:=CreateH2PNode(SubTypeName,'',ParamsNode,ctnProcedureType,SimpleType,
|
||||
nil,true);
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(SubTypeName,ParamsNode,
|
||||
ctnProcedureType,SimpleType,nil,true,false);
|
||||
DebugLn(['TH2PasTool.ConvertFunction function type added: ',TypeH2PNode.DescAsString(CTool)]);
|
||||
// create variable
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SubTypeName,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SubTypeName,
|
||||
ParentNode,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.ConvertFunction variable added: ',H2PNode.DescAsString(CTool)]);
|
||||
// build parameters recursively
|
||||
@ -674,11 +688,13 @@ begin
|
||||
BuildH2PTree(TypeH2PNode,ParamsNode.FirstChild);
|
||||
end else begin
|
||||
// create proc
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnProcedure,SimpleType,
|
||||
nil,false);
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnProcedure,SimpleType,
|
||||
nil,true);
|
||||
DebugLn(['TH2PasTool.ConvertFunction function added: ',H2PNode.DescAsString(CTool)]);
|
||||
// build parameters recursively
|
||||
BuildH2PTree(H2PNode);
|
||||
if CNode.FirstChild<>nil then
|
||||
BuildH2PTree(H2PNode);
|
||||
end;
|
||||
end else begin
|
||||
DebugLn(['TH2PasTool.ConvertFunction SKIPPING Function Name="',CurName,'" Type="',CurType,'" at ',CTool.CleanPosToStr(CNode.StartPos)]);
|
||||
@ -693,6 +709,7 @@ var
|
||||
SimpleType: String;
|
||||
TypeH2PNode: TH2PNode;
|
||||
H2PNode: TH2PNode;
|
||||
CurCName: String;
|
||||
begin
|
||||
CurName:=CTool.ExtractParameterName(CNode);
|
||||
CurType:=CTool.ExtractParameterType(CNode);
|
||||
@ -700,12 +717,13 @@ begin
|
||||
DebugLn(['TH2PasTool.ConvertFuncParameter Parameter: Name="',CurName,'" Type="',CurType,'" SimpleType="',SimpleType,'"']);
|
||||
if SimpleType='' then begin
|
||||
// this variable has a complex type
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
|
||||
if TypeH2PNode<>nil then
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end;
|
||||
if SimpleType<>'' then begin
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SimpleType,
|
||||
ParentNode,false);
|
||||
DebugLn(['TH2PasTool.ConvertFuncParameter added: ',H2PNode.DescAsString(CTool)]);
|
||||
end else begin
|
||||
@ -723,6 +741,7 @@ var
|
||||
IsPointerToFunction: Boolean;
|
||||
SimpleType: String;
|
||||
H2PNode: TH2PNode;
|
||||
CurCName: String;
|
||||
begin
|
||||
if CNode.FirstChild=nil then begin
|
||||
exit;
|
||||
@ -739,12 +758,13 @@ begin
|
||||
SimpleType:=GetSimplePascalTypeOfCVar(ChildNode);
|
||||
if SimpleType='' then begin
|
||||
// this variable has a complex type
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode);
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode,true,false);
|
||||
if TypeH2PNode<>nil then
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end;
|
||||
if SimpleType<>'' then begin
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnTypeDefinition,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnTypeDefinition,
|
||||
SimpleType,nil,true);
|
||||
DebugLn(['TH2PasTool.ConvertTypedef added: ',H2PNode.DescAsString(CTool)]);
|
||||
end else begin
|
||||
@ -759,11 +779,13 @@ begin
|
||||
and (ChildNode.Desc=ccnStructAlias) then begin
|
||||
// this is a struct alias
|
||||
CurType:=GetIdentifier(@CTool.Src[ChildNode.StartPos]);
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,
|
||||
CurCName:=CurName;
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,
|
||||
ctnTypeDefinition,CurType);
|
||||
end else begin
|
||||
// this is a new struct
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'');
|
||||
CurCName:=CurName;
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'');
|
||||
DebugLn(['TH2PasTool.ConvertTypedef added record: ',TypeH2PNode.DescAsString(CTool)]);
|
||||
// build recursively
|
||||
if ChildNode<>nil then
|
||||
@ -779,12 +801,13 @@ begin
|
||||
SimpleType:=GetSimplePascalResultTypeOfCFunction(ChildNode);
|
||||
if IsPointerToFunction and (SimpleType='') then begin
|
||||
// this function has a complex result type
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode);
|
||||
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode,true,false);
|
||||
if TypeH2PNode<>nil then
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end;
|
||||
if IsPointerToFunction and (SimpleType<>'') then begin
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnProcedureType,SimpleType,
|
||||
CurCName:=CurName;
|
||||
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnProcedureType,SimpleType,
|
||||
nil,true);
|
||||
DebugLn(['TH2PasTool.ConvertTypedef function type added: ',H2PNode.DescAsString(CTool)]);
|
||||
// build the param list
|
||||
@ -2231,13 +2254,14 @@ function TH2PasTool.CreateAutoGeneratedH2PNode(var PascalName: string;
|
||||
CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc;
|
||||
const PascalCode: string;
|
||||
ParentNode: TH2PNode;
|
||||
IsGlobal: boolean): TH2PNode;
|
||||
IsGlobal: boolean; InsertAsPreLast: boolean): TH2PNode;
|
||||
|
||||
function Check(TestName: string; out Node: TH2PNode): boolean;
|
||||
begin
|
||||
Node:=FindH2PNodeWithPascalName(TestName);
|
||||
if (Node=nil) then begin
|
||||
Node:=CreateH2PNode(TestName,'',CNode,PascalDesc,PascalCode,nil,true,true);
|
||||
Node:=CreateH2PNode(TestName,'',CNode,PascalDesc,PascalCode,nil,
|
||||
true,InsertAsPreLast);
|
||||
Result:=true;
|
||||
end else if ((Node.CNode=CNode) and (Node.PascalDesc=PascalDesc)
|
||||
and (Node.PascalCode=PascalCode)
|
||||
@ -2261,7 +2285,7 @@ begin
|
||||
end;
|
||||
|
||||
function TH2PasTool.GetH2PNodeForComplexType(CNode: TCodeTreeNode;
|
||||
CreateIfNotExists: boolean): TH2PNode;
|
||||
CreateIfNotExists: boolean; InsertAsPreLast: boolean): TH2PNode;
|
||||
var
|
||||
CCode: String;
|
||||
PascalName: String;
|
||||
@ -2339,7 +2363,8 @@ begin
|
||||
// a new pointer type is needed
|
||||
NewBasePascalType:='P'+BasePascalType;
|
||||
SubH2PNode:=CreateAutoGeneratedH2PNode(NewBasePascalType,nil,
|
||||
ctnTypeDefinition,'^'+BasePascalType);
|
||||
ctnTypeDefinition,'^'+BasePascalType,
|
||||
nil,true,InsertAsPreLast);
|
||||
DebugLn(['TH2PasTool.GetH2PNodeForComplexType added new pointer type: ',SubH2PNode.DescAsString(CTool)]);
|
||||
NewBasePascalType:=SubH2PNode.PascalName;
|
||||
end;
|
||||
@ -2402,7 +2427,8 @@ begin
|
||||
if NeedH2PNode then begin
|
||||
PascalName:='T'+PascalName;
|
||||
PascalName:=copy(PascalName,1,DefaultMaxPascalIdentLen);
|
||||
SubH2PNode:=CreateAutoGeneratedH2PNode(PascalName,nil,ctnTypeDefinition,PascalCode);
|
||||
SubH2PNode:=CreateAutoGeneratedH2PNode(PascalName,nil,ctnTypeDefinition,
|
||||
PascalCode,nil,true,InsertAsPreLast);
|
||||
end;
|
||||
|
||||
// check if the whole declaration was translated
|
||||
@ -2743,6 +2769,7 @@ end;
|
||||
procedure TH2PTree.Unbind(Node: TH2PBaseNode);
|
||||
begin
|
||||
if Node=Root then Root:=Root.NextBrother;
|
||||
if Node=LastRoot then LastRoot:=LastRoot.PriorBrother;
|
||||
with Node do begin
|
||||
if (Parent<>nil) then begin
|
||||
if (Parent.FirstChild=Node) then
|
||||
@ -2856,6 +2883,7 @@ begin
|
||||
ANode.PriorBrother.NextBrother:=ANode.FirstChild;
|
||||
end;
|
||||
ANode.PriorBrother:=ANode.LastChild;
|
||||
if Root=ANode then Root:=ANode.FirstChild;
|
||||
ChildNode:=ANode.FirstChild;
|
||||
while ChildNode<>nil do begin
|
||||
ChildNode.Parent:=ANode.Parent;
|
||||
|
Loading…
Reference in New Issue
Block a user