mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 23:09:08 +02:00
* fcl-xml, reduced DOM memory requirements by getting rid of TDOMNode_WithChildren.FLastChild field (storing the last child in FFirstChild.FPreviousSibling instead).
git-svn-id: trunk@20539 -
This commit is contained in:
parent
60fe15b01a
commit
5618efc7a4
@ -188,7 +188,8 @@ type
|
|||||||
nfLevel2,
|
nfLevel2,
|
||||||
nfIgnorableWS,
|
nfIgnorableWS,
|
||||||
nfSpecified,
|
nfSpecified,
|
||||||
nfDestroying
|
nfDestroying,
|
||||||
|
nfFirstChild
|
||||||
);
|
);
|
||||||
TNodeFlags = set of TNodeFlagEnum;
|
TNodeFlags = set of TNodeFlagEnum;
|
||||||
|
|
||||||
@ -206,6 +207,7 @@ type
|
|||||||
procedure SetNodeValue(const AValue: DOMString); virtual;
|
procedure SetNodeValue(const AValue: DOMString); virtual;
|
||||||
function GetFirstChild: TDOMNode; virtual;
|
function GetFirstChild: TDOMNode; virtual;
|
||||||
function GetLastChild: TDOMNode; virtual;
|
function GetLastChild: TDOMNode; virtual;
|
||||||
|
function GetPreviousSibling: TDOMNode; virtual;
|
||||||
function GetAttributes: TDOMNamedNodeMap; virtual;
|
function GetAttributes: TDOMNamedNodeMap; virtual;
|
||||||
function GetRevision: Integer;
|
function GetRevision: Integer;
|
||||||
function GetNodeType: Integer; virtual; abstract;
|
function GetNodeType: Integer; virtual; abstract;
|
||||||
@ -233,7 +235,7 @@ type
|
|||||||
property FirstChild: TDOMNode read GetFirstChild;
|
property FirstChild: TDOMNode read GetFirstChild;
|
||||||
property LastChild: TDOMNode read GetLastChild;
|
property LastChild: TDOMNode read GetLastChild;
|
||||||
property ChildNodes: TDOMNodeList read GetChildNodes;
|
property ChildNodes: TDOMNodeList read GetChildNodes;
|
||||||
property PreviousSibling: TDOMNode read FPreviousSibling;
|
property PreviousSibling: TDOMNode read GetPreviousSibling;
|
||||||
property NextSibling: TDOMNode read FNextSibling;
|
property NextSibling: TDOMNode read FNextSibling;
|
||||||
property Attributes: TDOMNamedNodeMap read GetAttributes;
|
property Attributes: TDOMNamedNodeMap read GetAttributes;
|
||||||
property OwnerDocument: TDOMDocument read GetOwnerDocument;
|
property OwnerDocument: TDOMDocument read GetOwnerDocument;
|
||||||
@ -275,7 +277,7 @@ type
|
|||||||
|
|
||||||
TDOMNode_WithChildren = class(TDOMNode)
|
TDOMNode_WithChildren = class(TDOMNode)
|
||||||
protected
|
protected
|
||||||
FFirstChild, FLastChild: TDOMNode;
|
FFirstChild: TDOMNode;
|
||||||
FChildNodes: TDOMNodeList;
|
FChildNodes: TDOMNodeList;
|
||||||
function GetFirstChild: TDOMNode; override;
|
function GetFirstChild: TDOMNode; override;
|
||||||
function GetLastChild: TDOMNode; override;
|
function GetLastChild: TDOMNode; override;
|
||||||
@ -932,6 +934,14 @@ begin
|
|||||||
Result := nil;
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TDOMNode.GetPreviousSibling: TDOMNode;
|
||||||
|
begin
|
||||||
|
if nfFirstChild in FFlags then
|
||||||
|
Result := nil
|
||||||
|
else
|
||||||
|
Result := FPreviousSibling;
|
||||||
|
end;
|
||||||
|
|
||||||
function TDOMNode.GetAttributes: TDOMNamedNodeMap;
|
function TDOMNode.GetAttributes: TDOMNamedNodeMap;
|
||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
@ -1279,7 +1289,10 @@ end;
|
|||||||
|
|
||||||
function TDOMNode_WithChildren.GetLastChild: TDOMNode;
|
function TDOMNode_WithChildren.GetLastChild: TDOMNode;
|
||||||
begin
|
begin
|
||||||
Result := FLastChild;
|
if FFirstChild = nil then
|
||||||
|
Result := nil
|
||||||
|
else
|
||||||
|
Result := FFirstChild.FPreviousSibling;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TDOMNode_WithChildren.Destroy;
|
destructor TDOMNode_WithChildren.Destroy;
|
||||||
@ -1354,21 +1367,28 @@ begin
|
|||||||
begin
|
begin
|
||||||
if Assigned(FFirstChild) then
|
if Assigned(FFirstChild) then
|
||||||
begin
|
begin
|
||||||
FLastChild.FNextSibling := NewChild;
|
Tmp := FFirstChild.FPreviousSibling; { our last child }
|
||||||
NewChild.FPreviousSibling := FLastChild;
|
Tmp.FNextSibling := NewChild;
|
||||||
end else
|
NewChild.FPreviousSibling := Tmp;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
FFirstChild := NewChild;
|
FFirstChild := NewChild;
|
||||||
FLastChild := NewChild;
|
Include(NewChild.FFlags, nfFirstChild);
|
||||||
|
end;
|
||||||
|
FFirstChild.FPreviousSibling := NewChild; { becomes our last child }
|
||||||
end
|
end
|
||||||
else // insert before RefChild
|
else // insert before RefChild
|
||||||
begin
|
begin
|
||||||
|
NewChild.FPreviousSibling := RefChild.FPreviousSibling;
|
||||||
if RefChild = FFirstChild then
|
if RefChild = FFirstChild then
|
||||||
FFirstChild := NewChild
|
|
||||||
else
|
|
||||||
begin
|
begin
|
||||||
|
Exclude(RefChild.FFlags, nfFirstChild);
|
||||||
|
FFirstChild := NewChild;
|
||||||
|
Include(NewChild.FFlags, nfFirstChild);
|
||||||
|
end
|
||||||
|
else
|
||||||
RefChild.FPreviousSibling.FNextSibling := NewChild;
|
RefChild.FPreviousSibling.FNextSibling := NewChild;
|
||||||
NewChild.FPreviousSibling := RefChild.FPreviousSibling;
|
|
||||||
end;
|
|
||||||
RefChild.FPreviousSibling := NewChild;
|
RefChild.FPreviousSibling := NewChild;
|
||||||
end;
|
end;
|
||||||
NewChild.FParentNode := Self;
|
NewChild.FParentNode := Self;
|
||||||
@ -1384,6 +1404,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function TDOMNode_WithChildren.DetachChild(OldChild: TDOMNode): TDOMNode;
|
function TDOMNode_WithChildren.DetachChild(OldChild: TDOMNode): TDOMNode;
|
||||||
|
var
|
||||||
|
prev, next: TDOMNode;
|
||||||
begin
|
begin
|
||||||
Changing;
|
Changing;
|
||||||
|
|
||||||
@ -1393,15 +1415,26 @@ begin
|
|||||||
Inc(FOwnerDocument.FRevision); // invalidate nodelists
|
Inc(FOwnerDocument.FRevision); // invalidate nodelists
|
||||||
|
|
||||||
if OldChild = FFirstChild then
|
if OldChild = FFirstChild then
|
||||||
FFirstChild := FFirstChild.FNextSibling
|
begin
|
||||||
|
Exclude(OldChild.FFlags, nfFirstChild);
|
||||||
|
FFirstChild := FFirstChild.FNextSibling;
|
||||||
|
if Assigned(FFirstChild) then
|
||||||
|
begin
|
||||||
|
{ maintain lastChild }
|
||||||
|
Include(FFirstChild.FFlags, nfFirstChild);
|
||||||
|
FFirstChild.FPreviousSibling := OldChild.FPreviousSibling;
|
||||||
|
end;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
OldChild.FPreviousSibling.FNextSibling := OldChild.FNextSibling;
|
begin
|
||||||
|
prev := OldChild.FPreviousSibling;
|
||||||
if OldChild = FLastChild then
|
next := OldChild.FNextSibling;
|
||||||
FLastChild := FLastChild.FPreviousSibling
|
prev.FNextSibling := next;
|
||||||
else
|
if Assigned(next) then { removing node in the middle }
|
||||||
OldChild.FNextSibling.FPreviousSibling := OldChild.FPreviousSibling;
|
next.FPreviousSibling := prev
|
||||||
|
else { removing the last child }
|
||||||
|
FFirstChild.FPreviousSibling := prev;
|
||||||
|
end;
|
||||||
// Make sure removed child does not contain references to nowhere
|
// Make sure removed child does not contain references to nowhere
|
||||||
OldChild.FPreviousSibling := nil;
|
OldChild.FPreviousSibling := nil;
|
||||||
OldChild.FNextSibling := nil;
|
OldChild.FNextSibling := nil;
|
||||||
@ -1410,14 +1443,21 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TDOMNode_WithChildren.InternalAppend(NewChild: TDOMNode);
|
procedure TDOMNode_WithChildren.InternalAppend(NewChild: TDOMNode);
|
||||||
|
var
|
||||||
|
Tmp: TDOMNode;
|
||||||
begin
|
begin
|
||||||
if Assigned(FFirstChild) then
|
if Assigned(FFirstChild) then
|
||||||
begin
|
begin
|
||||||
FLastChild.FNextSibling := NewChild;
|
Tmp := FFirstChild.FPreviousSibling; { our last child }
|
||||||
NewChild.FPreviousSibling := FLastChild;
|
Tmp.FNextSibling := NewChild;
|
||||||
end else
|
NewChild.FPreviousSibling := Tmp;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
FFirstChild := NewChild;
|
FFirstChild := NewChild;
|
||||||
FLastChild := NewChild;
|
Include(NewChild.FFlags, nfFirstChild);
|
||||||
|
end;
|
||||||
|
FFirstChild.FPreviousSibling := NewChild; { becomes our last child }
|
||||||
NewChild.FParentNode := Self;
|
NewChild.FParentNode := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1465,7 +1505,6 @@ begin
|
|||||||
child := next;
|
child := next;
|
||||||
end;
|
end;
|
||||||
FFirstChild := nil;
|
FFirstChild := nil;
|
||||||
FLastChild := nil;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDOMNode_WithChildren.GetTextContent: DOMString;
|
function TDOMNode_WithChildren.GetTextContent: DOMString;
|
||||||
|
Loading…
Reference in New Issue
Block a user