Refactoring, no functional changes

xmlread.pp:
* Moved assignment of TXMLFileInputSource.SystemID into TXMLInputFileSource.Create.
* Eliminated nested procedure in TXMLReader.ProcessDefaultAttributes, it was redundant since
  r12026.

xpath.pp:
* Moved predicate evaluation code, which is common for filter and step nodes, into
  TXPathExprNode.EvalPredicate().

git-svn-id: trunk@13056 -
This commit is contained in:
sergei 2009-04-28 19:35:07 +00:00
parent efcccbf895
commit 841625e3dd
2 changed files with 32 additions and 46 deletions

View File

@ -409,7 +409,7 @@ type
procedure ParseElementDecl; procedure ParseElementDecl;
procedure ParseNotationDecl; procedure ParseNotationDecl;
function ResolveEntity(const SystemID, PublicID: WideString; out Source: TXMLCharSource): Boolean; function ResolveEntity(const SystemID, PublicID: WideString; out Source: TXMLCharSource): Boolean;
procedure ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef); procedure ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
procedure PushVC(aElDef: TDOMElementDef); procedure PushVC(aElDef: TDOMElementDef);
procedure PopVC; procedure PopVC;
@ -1097,6 +1097,7 @@ end;
constructor TXMLFileInputSource.Create(var AFile: Text); constructor TXMLFileInputSource.Create(var AFile: Text);
begin begin
FFile := @AFile; FFile := @AFile;
SystemID := FilenameToURI(TTextRec(AFile).Name);
FetchData; FetchData;
end; end;
@ -2888,7 +2889,8 @@ begin
end; end;
ExpectChar('>'); ExpectChar('>');
ProcessDefaultAttributes(NewElem, ElDef); if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
ProcessDefaultAttributes(NewElem, ElDef.FAttributes);
PushVC(ElDef); // this increases FNesting PushVC(ElDef); // this increases FNesting
// SAX: ContentHandler.StartElement(...) // SAX: ContentHandler.StartElement(...)
@ -3035,18 +3037,12 @@ begin
ClearRefs(FIDRefs); ClearRefs(FIDRefs);
end; end;
procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef); procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
var
Map: TDOMNamedNodeMap;
Attr: TDOMAttr;
procedure DoDefaulting;
var var
I: Integer; I: Integer;
AttDef: TDOMAttrDef; AttDef: TDOMAttrDef;
Attr: TDOMAttr;
begin begin
Map := ElDef.FAttributes;
for I := 0 to Map.Length-1 do for I := 0 to Map.Length-1 do
begin begin
AttDef := Map[I] as TDOMAttrDef; AttDef := Map[I] as TDOMAttrDef;
@ -3067,11 +3063,6 @@ begin
end; end;
end; end;
begin
if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
DoDefaulting;
end;
function TXMLReader.ParseExternalID(out SysID, PubID: WideString; // [75] function TXMLReader.ParseExternalID(out SysID, PubID: WideString; // [75]
SysIdOptional: Boolean): Boolean; SysIdOptional: Boolean): Boolean;
begin begin
@ -3511,7 +3502,6 @@ var
begin begin
ADoc := nil; ADoc := nil;
Src := TXMLFileInputSource.Create(f); Src := TXMLFileInputSource.Create(f);
Src.SystemID := FilenameToURI(TTextRec(f).Name);
Reader := TXMLReader.Create; Reader := TXMLReader.Create;
try try
Reader.ProcessXML(Src); Reader.ProcessXML(Src);

View File

@ -100,6 +100,9 @@ type
{ XPath expression parse tree } { XPath expression parse tree }
TXPathExprNode = class TXPathExprNode = class
protected
function EvalPredicate(AContext: TXPathContext;
AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
public public
function Evaluate(AContext: TXPathContext; function Evaluate(AContext: TXPathContext;
AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract; AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract;
@ -567,6 +570,22 @@ end;
{ XPath parse tree classes } { XPath parse tree classes }
function TXPathExprNode.EvalPredicate(AContext: TXPathContext;
AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
var
resvar: TXPathVariable;
begin
resvar := Evaluate(AContext, AEnvironment);
try
if resvar.InheritsFrom(TXPathNumberVariable) then
Result := resvar.AsNumber = APosition + 1 // TODO: trunc/round?
else
Result := resvar.AsBoolean;
finally
resvar.Release;
end;
end;
constructor TXPathConstantNode.Create(AValue: TXPathVariable); constructor TXPathConstantNode.Create(AValue: TXPathVariable);
begin begin
inherited Create; inherited Create;
@ -973,7 +992,7 @@ end;
function TXPathFilterNode.Evaluate(AContext: TXPathContext; function TXPathFilterNode.Evaluate(AContext: TXPathContext;
AEnvironment: TXPathEnvironment): TXPathVariable; AEnvironment: TXPathEnvironment): TXPathVariable;
var var
ExprResult, PredicateResult: TXPathVariable; ExprResult: TXPathVariable;
NodeSet, NewNodeSet: TNodeSet; NodeSet, NewNodeSet: TNodeSet;
i, j: Integer; i, j: Integer;
CurContextNode: TDOMNode; CurContextNode: TDOMNode;
@ -995,24 +1014,10 @@ begin
DoAdd := True; DoAdd := True;
for j := 0 to FPredicates.Count - 1 do for j := 0 to FPredicates.Count - 1 do
begin begin
PredicateResult := TXPathExprNode(FPredicates[j]).Evaluate(NewContext, DoAdd := TXPathExprNode(FPredicates[j]).EvalPredicate(NewContext,
AEnvironment); AEnvironment, i);
try if not DoAdd then
if PredicateResult.InheritsFrom(TXPathNumberVariable) then Break;
begin
if PredicateResult.AsNumber <> i + 1 then
begin
DoAdd := False;
break;
end;
end else if not PredicateResult.AsBoolean then
begin
DoAdd := False;
break;
end;
finally
PredicateResult.Release;
end;
end; end;
if DoAdd then if DoAdd then
NewNodeSet.Add(CurContextNode); NewNodeSet.Add(CurContextNode);
@ -1108,7 +1113,6 @@ var
NewContext: TXPathContext; NewContext: TXPathContext;
NewStepNodes: TNodeSet; NewStepNodes: TNodeSet;
Predicate: TXPathExprNode; Predicate: TXPathExprNode;
PredicateResult: TXPathVariable;
TempList: TList; TempList: TList;
begin begin
@ -1241,16 +1245,8 @@ var
Node := TDOMNode(StepNodes[j]); Node := TDOMNode(StepNodes[j]);
NewContext.ContextNode := Node; NewContext.ContextNode := Node;
Inc(NewContext.ContextPosition); Inc(NewContext.ContextPosition);
PredicateResult := Predicate.Evaluate(NewContext, AEnvironment); if Predicate.EvalPredicate(NewContext, AEnvironment, j) then
try NewStepNodes.Add(Node);
if (PredicateResult.InheritsFrom(TXPathNumberVariable) and
(PredicateResult.AsNumber = j + 1)) or
(not PredicateResult.InheritsFrom(TXPathNumberVariable) and
PredicateResult.AsBoolean) then
NewStepNodes.Add(Node);
finally
PredicateResult.Release;
end;
end; end;
finally finally
NewContext.Free; NewContext.Free;