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

View File

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