mbeckerle closed pull request #100: Moved pushDiscriminator to fix separators
bug.
URL: https://github.com/apache/incubator-daffodil/pull/100
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDelimiters.scala
b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDelimiters.scala
index 9aaf5f30d..ac3f387c2 100644
---
a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDelimiters.scala
+++
b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDelimiters.scala
@@ -80,57 +80,6 @@ abstract class Text(es: Term, e: Term, guard: Boolean)
extends StringDelimBase(e
""
}
}
-
- def getMatchedDelimiterInfo(remoteDelimRegex: Set[(String, String)],
foundDelimiter: String,
- delimiters: List[(List[String], String, String)]) = {
- val matchedDelim = remoteDelimRegex.find {
- case (delimRegex, _) => {
- foundDelimiter.matches("(?s)^(" + delimRegex + ")$")
- }
- } match {
- case Some((_, theValue)) => theValue
- case None => Assert.impossibleCase()
- }
-
- val (remoteDelimValue, remoteElemName, remoteElemPath, _) =
- {
- val findResult = delimiters.map {
- case (delimValueList, elemName, elemPath) => {
- delimValueList.find(delim => delim == matchedDelim) match {
- case Some(d) => (d, elemName, elemPath, true)
- case None => (delimValueList.mkString(","), elemName, elemPath,
false)
- }
- }
- }.toSet.filter { x => x._4 == true }
-
- if (findResult.size == 0) Assert.impossibleCase()
- findResult.head
- }
- (remoteDelimValue, remoteElemName, remoteElemPath)
- }
-
- def getMatchedDelimiterInfo(
- originalDelimRep: String,
- delimiters: List[(List[String], String, String)]) = {
-
- val (remoteDelimValue, remoteElemName, remoteElemPath, _) =
- {
- val findResult = delimiters.map {
- case (delimValueList, elemName, elemPath) => {
- val res = delimValueList.find(delim => delim == originalDelimRep)
match {
- case Some(d) => (d, elemName, elemPath, true)
- case None => (delimValueList.mkString(","), elemName, elemPath,
false)
- }
- res
- }
- }.toSet.filter { x => x._4 == true }
-
- if (findResult.size == 0) Assert.impossibleCase()
- findResult.head
- }
- (remoteDelimValue, remoteElemName, remoteElemPath)
- }
-
}
// NOTE: LiteralNil still uses this as it can only be Static/Constant
diff --git
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SeparatedSequenceParsers.scala
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SeparatedSequenceParsers.scala
index 889e5dda3..38e39cafd 100644
---
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SeparatedSequenceParsers.scala
+++
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SeparatedSequenceParsers.scala
@@ -299,6 +299,15 @@ final class OrderedSeparatedSequenceParser(
val bitPosBeforeSeparator = pstate.bitPos0b
+ //
+ // Note: Performance. All this conditional branch logic could in
principle be hoisted
+ // out and decided at schema compile time, as what is being tested here
is statically known.
+ //
+ // However, that's trading a few conditional branches for a virtual
function call, and that
+ // might or might not be an improvement worth making. Not worth
bothering with unless
+ // some profiling makes it look like this could help.
+ //
+
// parse prefix sep if any
val prefixSepSuccessful =
if (spos eq SeparatorPosition.Prefix) {
@@ -342,8 +351,6 @@ final class OrderedSeparatedSequenceParser(
//
val prevBitPosBeforeChild = pstate.bitPos0b
- pstate.pushDiscriminator
-
if (pstate.dataProc.isDefined)
pstate.dataProc.get.beforeRepetition(pstate, this)
parser.parse1(pstate)
@@ -496,7 +503,6 @@ final class OrderedSeparatedSequenceParser(
result
} // end if child success/fail
} // end val res
- pstate.popDiscriminator
res
} // end if postfix
} // end if infix
diff --git
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SequenceParserBases.scala
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SequenceParserBases.scala
index 541137a92..4de4a99c6 100644
---
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SequenceParserBases.scala
+++
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/SequenceParserBases.scala
@@ -118,13 +118,6 @@ abstract class OrderedSequenceParserBase(
// different, or OCK=parsed.
//
- //
- // The beforeArrayState will be assigned the priorState before
the whole array
- // This is the same object as the priorState before the first
- // occurrence.
- //
- var beforeArrayState: PState.Mark = null
-
var resultOfTry: ParseAttemptStatus =
ParseAttemptStatus.Uninitialized
var ais: ArrayIndexStatus = null
@@ -155,8 +148,7 @@ abstract class OrderedSequenceParserBase(
//
val priorState =
if (isFirstIteration) {
- beforeArrayState = pstate.mark("before all occurrences")
- beforeArrayState
+ pstate.mark("before all occurrences")
} else {
pstate.mark("before second/subsequent occurrence")
}
@@ -166,9 +158,11 @@ abstract class OrderedSequenceParserBase(
var markLeakCausedByException = false
var wasThrow = true
try {
+ pstate.pushDiscriminator
resultOfTry =
parseOneWithPoU(parser, erd, pstate, priorState, goAIS,
isBounded)
wasThrow = false
+ pstate.popDiscriminator
//
// Now we handle the result of the parse attempt.
//
@@ -231,7 +225,6 @@ abstract class OrderedSequenceParserBase(
// discarded.
//
if (!isFirstIteration) pstate.discard(priorState)
- pstate.reset(beforeArrayState)
pstate.setFailed(cause)
resultOfTry = ParseAttemptStatus.Failed_EntireArray
}
@@ -284,7 +277,7 @@ abstract class OrderedSequenceParserBase(
}
}
// if it wasn't reset, we discard priorState here.
- if (!isFirstIteration && pstate.isInUse(priorState)) {
+ if (pstate.isInUse(priorState)) {
pstate.discard(priorState)
}
@@ -300,11 +293,6 @@ abstract class OrderedSequenceParserBase(
} // end while for each repeat
- // if it wasn't reset or discarded, discard here.
- if (pstate.isInUse(beforeArrayState)) {
- pstate.discard(beforeArrayState)
- }
-
} // end match case hasPoU = true
case false => {
diff --git
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/UnseparatedSequenceParsers.scala
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/UnseparatedSequenceParsers.scala
index 3210f7dcd..8ea27fe14 100644
---
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/UnseparatedSequenceParsers.scala
+++
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/UnseparatedSequenceParsers.scala
@@ -118,8 +118,6 @@ class OrderedUnseparatedSequenceParser(rd:
SequenceRuntimeData, childParsersArg:
Assert.invariant(erd.isArray || erd.isOptional) // not a PoU otherwise.
- pstate.pushDiscriminator
-
if (pstate.dataProc.isDefined)
pstate.dataProc.get.beforeRepetition(pstate, this)
val posBefore = pstate.bitPos0b
@@ -160,7 +158,6 @@ class OrderedUnseparatedSequenceParser(rd:
SequenceRuntimeData, childParsersArg:
}
}
}
- pstate.popDiscriminator
res
}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services