You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by bu...@apache.org on 2004/01/05 11:20:11 UTC
DO NOT REPLY [Bug 25897] New: -
SchemaGrammar::getElemDecl(elemid) throws Exception if ElemDecl not found instead of doing a GroupElemDecl lookup
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25897>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25897
SchemaGrammar::getElemDecl(elemid) throws Exception if ElemDecl not found instead of doing a GroupElemDecl lookup
Summary: SchemaGrammar::getElemDecl(elemid) throws Exception if
ElemDecl not found instead of doing a GroupElemDecl
lookup
Product: Xerces-C++
Version: 2.4.0
Platform: All
OS/Version: All
Status: NEW
Severity: Normal
Priority: Other
Component: Validating Parser (Schema) (Xerces 1.5 or up only)
AssignedTo: xerces-c-dev@xml.apache.org
ReportedBy: ts@edvwl.de
validators/schema/SchemaGrammar.hpp (line 654):
inline const XMLElementDecl* SchemaGrammar::getElemDecl(const unsigned int
elemId) const
{
// Look up this element decl by id
const SchemaElementDecl* decl = fElemDeclPool->getById(elemId);
if (!decl)
decl = fGroupElemDeclPool->getById(elemId);
return decl;
}
utils/RefHash3KeysIdPool.c (line 314):
template <class TVal> TVal*
RefHash3KeysIdPool<TVal>::getById(const unsigned int elemId)
{
// If its either zero or beyond our current id, its an error
if (!elemId || (elemId > fIdCounter))
ThrowXMLwithMemMgr(IllegalArgumentException,
XMLExcepts::Pool_InvalidId, fMemoryManager);
return fIdPtrs[elemId];
}
the getElemDecl() code tries to find the ElemDecl by Id in the ElemDecl Pool.
the !decl check introduces a GroupElemDecl lookup if the first lookup failed,
but the group lookup never gets executed, because fElemDeclPool is a
RefHash3KeysIdPool and RefHash3KeysIdPool::getById() throws an
IllegalArgumentException if the Id is not found, instead of returning a zero-
pointer.
fix:
inline const XMLElementDecl* SchemaGrammar::getElemDecl(const unsigned int
elemId)
{
const SchemaElementDecl* decl = 0;
// Look up this element decl by id
try
{
decl = fElemDeclPool->getById(elemId);
}
catch(const IllegalArgumentException&)
{
decl = fGroupElemDeclPool->getById(elemId);
}
return decl;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org