瀏覽代碼

some fixes.

Nicolas Cannasse 19 年之前
父節點
當前提交
abd201977c
共有 1 個文件被更改,包括 15 次插入8 次删除
  1. 15 8
      std/haxe/Template.hx

+ 15 - 8
std/haxe/Template.hx

@@ -128,7 +128,7 @@ class Template {
 					throw "Unclosed 'else'";
 					throw "Unclosed 'else'";
 			} else { // elseif
 			} else { // elseif
 				t.p = t.p.substr(4,t.p.length - 4);
 				t.p = t.p.substr(4,t.p.length - 4);
-				eelse = parseBlock(tokens);
+				eelse = parse(tokens);
 			}
 			}
 			return OpIf(e,eif,eelse);
 			return OpIf(e,eif,eelse);
 		}
 		}
@@ -205,12 +205,16 @@ class Template {
 		return makePath(function() { return Reflect.field(e(),f); },l);
 		return makePath(function() { return Reflect.field(e(),f); },l);
 	}
 	}
 
 
-	function makeExpr( l : List<{ p : String, s : Bool }> ) : Void -> Dynamic {
+	function makeExpr( l ) {
+		return makePath(makeExpr2(l),l);
+	}
+
+	function makeExpr2( l : List<{ p : String, s : Bool }> ) : Void -> Dynamic {
 		var p = l.pop();
 		var p = l.pop();
 		if( p == null )
 		if( p == null )
 			throw "<eof>";
 			throw "<eof>";
 		if( p.s )
 		if( p.s )
-			return makePath(makeConst(p.p),l);
+			return makeConst(p.p);
 		switch( p.p ) {
 		switch( p.p ) {
 		case "(":
 		case "(":
 			var e1 = makeExpr(l);
 			var e1 = makeExpr(l);
@@ -270,12 +274,15 @@ class Template {
 				run(e);
 				run(e);
 		case OpForeach(e,loop):
 		case OpForeach(e,loop):
 			var v = e();
 			var v = e();
-			if( Reflect.hasField(v,"hasNext") ) {
-				// ok
-			} else if( Reflect.hasField(v,"iterator") )
-				v = v.iterator();
-			else
+			try {
+				if( v.hasNext == null ) {
+					var x = v.iterator();
+					if( x.hasNext == null ) throw null;
+					v = x;
+				}
+			} catch( e : Dynamic ) {
 				throw "Cannot iter on " + v;
 				throw "Cannot iter on " + v;
+			}
 			stack.push(context);
 			stack.push(context);
 			for( ctx in v ) {
 			for( ctx in v ) {
 				context = ctx;
 				context = ctx;