Browse Source

less string allocations (use addSub)
fixed eof inside entity in not strict mode (eg Xml.parse("&"))

Nicolas Cannasse 10 years ago
parent
commit
75b42ae101
1 changed files with 17 additions and 5 deletions
  1. 17 5
      std/haxe/xml/Parser.hx

+ 17 - 5
std/haxe/xml/Parser.hx

@@ -112,7 +112,8 @@ class Parser
 				case S.PCDATA:
 					if (c == '<'.code)
 					{
-						var child = Xml.createPCData(buf.toString() + str.substr(start, p - start));
+						buf.addSub(str, start, p - start);
+						var child = Xml.createPCData(buf.toString());
 						buf = new StringBuf();
 						parent.addChild(child);
 						nsubs++;
@@ -246,7 +247,8 @@ class Parser
 							// HTML allows these in attributes values
 							throw "Invalid unescaped " + String.fromCharCode(c) + " in attribute value";
 						case _ if (c == attrValQuote):
-							var val = buf.toString() + str.substr(start, p - start);
+							buf.addSub(str, start, p - start);
+							var val = buf.toString();
 							buf = new StringBuf();
 							xml.set(aname, val);
 							state = S.IGNORE_SPACES;
@@ -353,7 +355,8 @@ class Parser
 					} else if (!isValidChar(c) && c != "#".code) {
 						if( strict )
 							throw 'Invalid character in entity: ' + String.fromCharCode(c);
-						buf.add("&" + str.substr(start, p - start));
+						buf.addChar("&".code);
+						buf.addSub(str, start, p - start);
 						p--;
 						start = p;
 						state = escapeNext;
@@ -370,8 +373,17 @@ class Parser
 
 		if (state == S.PCDATA)
 		{
-			if (p != start || nsubs == 0)
-				parent.addChild(Xml.createPCData(buf.toString() + str.substr(start, p - start)));
+			if (p != start || nsubs == 0) {
+				buf.addSub(str, start, p-start);
+				parent.addChild(Xml.createPCData(buf.toString()));
+			}
+			return p;
+		}
+
+		if( !strict && state == S.ESCAPE && escapeNext == S.PCDATA ) {
+			buf.addChar("&".code);
+			buf.addSub(str, start, p - start);
+			parent.addChild(Xml.createPCData(buf.toString()));
 			return p;
 		}