richter 00/07/07 03:07:59
Modified: . Tag: Embperl2 epcomp.c epdom.c epparse.c
Log:
Embperl 2 - Memory Management
Revision Changes Path
No revision
No revision
1.1.2.41 +53 -31 embperl/Attic/epcomp.c
Index: epcomp.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epcomp.c,v
retrieving revision 1.1.2.40
retrieving revision 1.1.2.41
diff -u -r1.1.2.40 -r1.1.2.41
--- epcomp.c 2000/07/05 11:50:40 1.1.2.40
+++ epcomp.c 2000/07/07 10:07:57 1.1.2.41
@@ -691,6 +691,50 @@
/* ------------------------------------------------------------------------ */
/* */
+/* embperl_CompileCleanupSpaces */
+/* */
+/* remove any following spaces */
+/* */
+/* ------------------------------------------------------------------------ */
+
+
+static int embperl_CompileCleanupSpaces (/*in*/ tReq * r,
+ /*in*/ tDomTree * pDomTree,
+ /*in*/ tNodeData * pNode,
+ /*i/o*/ tEmbperlCmd * pCmd)
+
+
+ {
+ if ((pCmd -> bRemoveNode & 6) && (r -> bOptions & optKeepSpaces) == 0)
+ {
+ tNodeData * pNextNode = Node_selfFirstChild (pDomTree, pNode) ;
+ if ((pCmd -> bRemoveNode & 1) || !pCmd -> bCompileChilds || pNextNode == NULL
|| (pNextNode -> nType != ntypText && pNextNode -> nType != ntypCDATA))
+ pNextNode = Node_selfNextSibling (pDomTree, pNode) ;
+ if (pNextNode)
+ {
+ const char * sText = Node_selfNodeName (pNextNode) ;
+ const char * p = sText ;
+
+ while (*p && isspace (*p))
+ p++;
+ if (p > sText && (pCmd -> bRemoveNode & 4))
+ p-- ;
+
+ if (p > sText)
+ { /* remove spaces */
+ if (*p)
+ Node_replaceChildWithCDATA(pDomTree, -1, pNextNode -> xNdx, p,
strlen (p), -1, 0) ;
+ else
+ Node_selfRemoveChild(pDomTree, -1, pNextNode) ;
+ }
+
+ }
+ }
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* */
/* embperl_CompileNode */
/* */
/* Compile one node and his childs */
@@ -698,9 +742,10 @@
/* ------------------------------------------------------------------------ */
-int embperl_CompileNode (/*in*/ tDomTree * pDomTree,
- /*in*/ tNode xNode,
- /*i/o*/ int * bCheckpointPending)
+int embperl_CompileNode (/*in*/ tReq * r,
+ /*in*/ tDomTree * pDomTree,
+ /*in*/ tNode xNode,
+ /*i/o*/ int * bCheckpointPending)
{
@@ -768,7 +813,7 @@
while (pChild)
{
- embperl_CompileNode (pDomTree, pChild -> xNdx,
bCheckpointPending) ;
+ embperl_CompileNode (r, pDomTree, pChild -> xNdx,
bCheckpointPending) ;
pChild = Node_selfNextSibling (pDomTree, pChild) ;
}
}
@@ -835,31 +880,8 @@
}
}
- if (pCmd -> bRemoveNode & 6)
- {
- tNodeData * pNextNode = Node_selfFirstChild (pDomTree, pNode) ;
- if (pNextNode == NULL || (pNextNode -> nType != ntypText && pNextNode ->
nType != ntypCDATA))
- pNextNode = Node_selfNextSibling (pDomTree, pNode) ;
- if (pNextNode)
- {
- const char * sText = Node_selfNodeName (pNextNode) ;
- const char * p = sText ;
-
- while (*p && isspace (*p))
- p++;
- if (p > sText && (pCmd -> bRemoveNode & 4))
- p-- ;
-
- if (p > sText)
- { /* remove spaces */
- if (*p)
- Node_replaceChildWithCDATA(pDomTree, -1, pNextNode -> xNdx, p,
strlen (p), -1, 0) ;
- else
- Node_selfRemoveChild(pDomTree, -1, pNextNode) ;
- }
-
- }
- }
+ embperl_CompileCleanupSpaces (r, pDomTree, pNode, pCmd) ;
+
if (pCmd -> sMayJump)
if (embperl_CompileToPerlCode (pDomTree, pNode, pCmd -> sMayJump,
&sStackValue))
{
@@ -927,7 +949,7 @@
while (xChildNode)
{
- if ((rc = embperl_CompileNode (pDomTree, xChildNode, bCheckpointPending))
!= ok)
+ if ((rc = embperl_CompileNode (r, pDomTree, xChildNode,
bCheckpointPending)) != ok)
return rc ;
xChildNode = Node_nextSibling (pDomTree, xChildNode) ;
@@ -1090,7 +1112,7 @@
pDomTree -> pSV = (SV *)newHV () ;
nLabelCnt = 1 ;
- if ((rc = embperl_CompileNode (pDomTree, r -> xDocument, &bCheckpointPending))
!= ok)
+ if ((rc = embperl_CompileNode (r, pDomTree, r -> xDocument,
&bCheckpointPending)) != ok)
{
*ppSV = newSVpvf ("%s\t%s", r -> errdat1, r -> errdat2) ;
SvUPGRADE (*ppSV, SVt_PVIV) ;
1.1.2.49 +88 -31 embperl/Attic/epdom.c
Index: epdom.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epdom.c,v
retrieving revision 1.1.2.48
retrieving revision 1.1.2.49
diff -u -r1.1.2.48 -r1.1.2.49
--- epdom.c 2000/07/06 06:17:37 1.1.2.48
+++ epdom.c 2000/07/07 10:07:57 1.1.2.49
@@ -17,6 +17,7 @@
HV * pStringTableHash ; /* Hash to translate strings to index number */
HE * * pStringTableArray ; /* Array with pointers to strings */
+tStringIndex * pFreeStringsNdx ; /* List of freed string indexes */
tDomTree * pDomTrees ;
@@ -394,7 +395,11 @@
/* new string */
- nNdx = ArrayAdd (&pStringTableArray, 1) ;
+ nNdx = ArraySub (&pFreeStringsNdx, 1) ;
+ if (nNdx != (tIndex)(-1))
+ nNdx = pFreeStringsNdx[nNdx] ;
+ else
+ nNdx = ArrayAdd (&pStringTableArray, 1) ;
pSVNdx = newSViv (nNdx) ;
SvTAINTED_off (pSVNdx) ;
@@ -429,12 +434,21 @@
SvREFCNT_dec (pSVNdx) ;
+ /*
+ if (nNdx == 3)
+ lprintf (pCurrReq, "free string %s (#%d) refcnt=%d\n", Ndx2String (nNdx),
nNdx, SvREFCNT(pSVNdx)) ;
+ */
+
if (SvREFCNT(pSVNdx) == 1)
{
+ int n ;
+
lprintf (pCurrReq, "delete string %s (#%d)\n", Ndx2String (nNdx), nNdx) ;
hv_delete (pStringTableHash, HeKEY (pHE), HeKLEN(pHE), 0) ;
pStringTableArray[nNdx] = NULL ;
-
+ n = ArrayAdd (&pFreeStringsNdx, 1) ;
+ pFreeStringsNdx[n] = nNdx ;
+
numStr-- ;
}
}
@@ -458,7 +472,8 @@
pStringTableHash = newHV () ;
- ArrayNew (&pStringTableArray, 128, sizeof (HE *)) ;
+ ArrayNew (&pStringTableArray, 256, sizeof (HE *)) ;
+ ArrayNew (&pFreeStringsNdx, 256, sizeof (tStringIndex *)) ;
ArrayAdd (&pStringTableArray, 2) ;
/* NULL */
@@ -606,10 +621,13 @@
while (n--)
{
pDomTree -> pLookup[pAttr -> xNdx] = NULL ;
- if (pAttr -> xName)
- NdxStringFree (pAttr -> xName) ;
- if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
- NdxStringFree (pAttr -> xValue) ;
+ if (pAttr -> bFlags)
+ {
+ if (pAttr -> xName)
+ NdxStringFree (pAttr -> xName) ;
+ if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
+ NdxStringFree (pAttr -> xValue) ;
+ }
pAttr++ ;
}
lprintf (pCurrReq, "delete typ=%d Node xNdx=%d\n", pNode -> nType,
pNode -> xNdx) ;
@@ -1508,6 +1526,8 @@
int len = sizeof (tNodeData) + pNode -> numAttr * sizeof (tAttrData) ;
int numAttr = pOldChild -> numAttr ;
int nOffset ;
+ tAttrData * pAttr ;
+ int n ;
if (pNode -> numAttr > pOldChild -> numAttr)
{
@@ -1530,29 +1550,59 @@
nOffset = pOldChild -> nPadOffset ;
xOldChild = pOldChild -> xNdx ;
+
+ if (pOldChild -> nText)
+ NdxStringFree (pOldChild -> nText) ;
+
+ pAttr = ((struct tAttrData * )(pOldChild + 1)) ;
+ n = pOldChild -> numAttr ;
+
+ while (n > 0)
+ {
+ if (pAttr -> xName)
+ NdxStringFree (pAttr -> xName) ;
+ if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
+ NdxStringFree (pAttr -> xValue) ;
+ n-- ;
+ pAttr++ ;
+ }
+
memcpy (pOldChild, pNode, len) ;
+
+ if (pOldChild -> nText)
+ NdxStringRefcntInc (pOldChild -> nText) ;
pOldChild -> nPadOffset = nOffset ;
pOldChild -> xNdx = xOldChild ;
pOldChild -> bFlags |= bFlags ;
- if (numAttr > pNode -> numAttr)
+ pAttr = ((struct tAttrData * )(pOldChild + 1)) ;
+ n = pNode -> numAttr ;
+
+ while (n > 0)
{
- tAttrData * pAttr = ((struct tAttrData * )(pOldChild + 1)) + pOldChild ->
numAttr ;
- int n = numAttr - pNode -> numAttr ;
+ if (pAttr -> xName)
+ NdxStringRefcntInc (pAttr -> xName) ;
+ if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
+ NdxStringRefcntInc (pAttr -> xValue) ;
+ n-- ;
+ pAttr++ ;
+ }
+
+ pAttr = ((struct tAttrData * )(pOldChild + 1)) + pOldChild -> numAttr ;
+ n = numAttr - pNode -> numAttr ;
- while (n > 0)
- {
- pAttr -> bFlags = nflgDeleted ;
- if (pAttr -> xName)
- NdxStringFree (pAttr -> xName) ;
- if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
- NdxStringFree (pAttr -> xValue) ;
- n-- ;
- pAttr++ ;
- }
- }
+ while (n > 0)
+ {
+ pAttr -> bFlags = nflgDeleted ;
+ if (pAttr -> xName)
+ NdxStringFree (pAttr -> xName) ;
+ if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
+ NdxStringFree (pAttr -> xValue) ;
+ n-- ;
+ pAttr++ ;
+ }
}
if (pOldChild -> nType == ntypDocumentFraq)
@@ -1962,18 +2012,25 @@
while (pOrder[i].xFromNode != pNode -> xNdx && i < n)
i++ ;
- if ((xNextNode = pOrder[i].xToNode) != pNode -> xNdx && xNextNode)
- {
- if (pCurrReq -> bDebug & dbgParse)
- lprintf (r, "[%d]toString: Replace Node=%d with Node=%d\n", r ->
nPid, pNode -> xNdx, xNextNode) ;
- pSavedNode = pNode ;
- pNode = Node_self (pDomTree, xNextNode) ;
- pSavedNodeFrom = pNode ;
+ if (i < n)
+ {
+ if ((xNextNode = pOrder[i].xToNode) != pNode -> xNdx && xNextNode)
+ {
+ if (pCurrReq -> bDebug & dbgParse)
+ lprintf (r, "[%d]toString: Replace Node=%d with Node=%d\n", r
-> nPid, pNode -> xNdx, xNextNode) ;
+ pSavedNode = pNode ;
+ pNode = Node_self (pDomTree, xNextNode) ;
+ pSavedNodeFrom = pNode ;
+ }
+ if (i == nOrderNdx)
+ nOrderNdx++, nOrderIndexNode = -1 ;
+ else
+ nOrderIndexNode = i ;
}
- if (i == nOrderNdx)
- nOrderNdx++, nOrderIndexNode = -1 ;
else
- nOrderIndexNode = i ;
+ {
+ mydie ("Internal Error: Orderindex out of range") ;
+ }
}
1.1.2.30 +1 -1 embperl/Attic/epparse.c
Index: epparse.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epparse.c,v
retrieving revision 1.1.2.29
retrieving revision 1.1.2.30
diff -u -r1.1.2.29 -r1.1.2.30
--- epparse.c 2000/07/06 06:17:41 1.1.2.29
+++ epparse.c 2000/07/07 10:07:58 1.1.2.30
@@ -612,7 +612,7 @@
}
if (pInside = pToken -> pInside)
{ /* parse for further tokens inside of this token */
- ParseTokens (r, &pCurr, pEnd, pInside, pToken -> sEndText,
pToken -> pContains, pToken -> nCDataType == -1?ntypAttrValue:pToken -> nCDataType, 0,
pToken -> bUnescape, pNodeName, xNewNode, level+1) ;
+ ParseTokens (r, &pCurr, pEnd, pInside, pToken -> sEndText,
pToken -> pContains, pToken -> nCDataType == ntypCDATA?ntypAttrValue:pToken ->
nCDataType, 0, pToken -> bUnescape, pNodeName, xNewNode, level+1) ;
}
else
{ /* nothing more inside of this token allowed, so search for
the end of the token */
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]