Skip to content

Commit

Permalink
Pre-parse character classes to reduce indexOf overhead
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacs committed Dec 29, 2011
1 parent 810b42c commit 1444b13
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions lib/sax.js
Expand Up @@ -234,14 +234,37 @@ var whitespace = "\r\n\t "
, nameBody = nameStart+number+"-."
, quote = "'\""
, entity = number+letter+"#"
, attribEnd = whitespace + ">"
, CDATA = "[CDATA["
, DOCTYPE = "DOCTYPE"
, XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
, XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
, rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

function is (charclass, c) { return charclass.indexOf(c) !== -1 }
function not (charclass, c) { return !is(charclass, c) }
// turn all the string character sets into character class objects.
whitespace = charClass(whitespace)
number = charClass(number)
letter = charClass(letter)
nameStart = charClass(nameStart)
nameBody = charClass(nameBody)
quote = charClass(quote)
entity = charClass(entity)
attribEnd = charClass(attribEnd)

function charClass (str) {
return str.split("").reduce(function (s, c) {
s[c] = true
return s
}, {})
}

function is (charclass, c) {
return charclass[c]
}

function not (charclass, c) {
return !charclass[c]
}

var S = 0
sax.STATE =
Expand Down Expand Up @@ -905,7 +928,7 @@ function write (chunk) {
continue

case S.ATTRIB_VALUE_UNQUOTED:
if (not(whitespace+">",c)) {
if (not(attribEnd,c)) {
if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
else parser.attribValue += c
continue
Expand Down

0 comments on commit 1444b13

Please sign in to comment.