2
0
Эх сурвалжийг харах

optimized : use Type.typeof

Nicolas Cannasse 19 жил өмнө
parent
commit
2b35f81fb5
1 өөрчлөгдсөн 84 нэмэгдсэн , 104 устгасан
  1. 84 104
      std/haxe/Serializer.hx

+ 84 - 104
std/haxe/Serializer.hx

@@ -30,10 +30,12 @@ class Serializer {
 	var cache : Array<Dynamic>;
 	var shash : Hash<Int>;
 	var scount : Int;
+	var useCache : Bool;
 
 	public function new() {
 		buf = new StringBuf();
 		cache = new Array();
+		useCache = true;
 		shash = new Hash();
 		scount = 0;
 	}
@@ -45,7 +47,7 @@ class Serializer {
 		serialization.
 	**/
 	public function dontUseCache() {
-		cache = null;
+		useCache = false;
 	}
 
 	public function toString() {
@@ -98,8 +100,6 @@ class Serializer {
 	}
 
 	function serializeRef(v) {
-		if( cache == null )
-			return false;
 		#if js
 		var vt = untyped __js__("typeof")(v);
 		#end
@@ -119,45 +119,29 @@ class Serializer {
 		return false;
 	}
 
-	function serializeEnum(v : Dynamic) {
-		buf.add("w");
-		serialize(v.__enum__.__ename__);
-		#if neko
-		serializeString(new String(v.tag));
-		buf.add(":");
-		if( v.args == null )
-			buf.add(0);
-		else {
-			var l : Int = untyped __dollar__asize(v.args);
-			buf.add(l);
-			for( i in 0...l )
-				serialize(v.args[i]);
-		}
-		#else true
-		serializeString(v[0]);
-		buf.add(":");
-		var l = v[untyped "length"];
-		buf.add(l - 1);
-		for( i in 1...l )
-			serialize(v[i]);
+	function serializeFields(v) {
+		#if flash9
+		throw "TODO";
 		#end
+		for( f in Reflect.fields(v) ) {
+			serializeString(f);
+			serialize(Reflect.field(v,f));
+		}
+		buf.add("g");
 	}
 
 	public function serialize( v : Dynamic ) {
-		if( v == null ) {
+		switch( Type.typeof(v) ) {
+		case TNull:
 			buf.add("n");
-			return;
-		}
-		if( Std.is(v,Int) ) {
+		case TInt:
 			if( v == 0 ) {
 				buf.add("z");
 				return;
 			}
 			buf.add("i");
 			buf.add(Std.string(v));
-			return;
-		}
-		if( Std.is(v,Float) ) {
+		case TFloat:
 			if( Math.isNaN(v) )
 				buf.add("k");
 			else if( !Math.isFinite(v) )
@@ -166,88 +150,84 @@ class Serializer {
 				buf.add("d");
 				buf.add(Std.string(v));
 			}
-			return;
-		}
-		#if neko
-		var t = untyped __dollar__typeof(v);
-		if( t == untyped __dollar__tstring )
-			v = new String(v);
-		#end
-		if( Std.is(v,String) ) {
-			serializeString(v);
-			return;
-		}
-		#if neko
-		if( t == untyped __dollar__tarray )
-			v = untyped Array.new1(v,__dollar__asize(v));
-		#end
-		if( Std.is(v,Array) ) {
-			if( serializeRef(v) )
+		case TBool:
+			buf.add(if( v ) "t" else "f");
+		case TClass(c):
+			if( c == cast String ) {
+				serializeString(v);
+				return;
+			}
+			if( useCache && serializeRef(v) )
 				return;
-			var ucount = 0;
-			buf.add("a");
-			var l = #if neko v.length #else true v[untyped "length"] #end;
-			for( i in 0...l ) {
-				if( v[i] == null )
-					ucount++;
-				else {
-					if( ucount > 0 ) {
-						if( ucount == 1 )
-							buf.add("n");
-						else {
-							buf.add("u");
-							buf.add(ucount);
+			switch( c ) {
+			case cast Array:
+				var ucount = 0;
+				buf.add("a");
+				var l = #if neko v.length #else true v[untyped "length"] #end;
+				for( i in 0...l ) {
+					if( v[i] == null )
+						ucount++;
+					else {
+						if( ucount > 0 ) {
+							if( ucount == 1 )
+								buf.add("n");
+							else {
+								buf.add("u");
+								buf.add(ucount);
+							}
+							ucount = 0;
 						}
-						ucount = 0;
+						serialize(v[i]);
 					}
-					serialize(v[i]);
 				}
-			}
-			if( ucount > 0 ) {
-				if( ucount == 1 )
-					buf.add("n");
-				else {
-					buf.add("u");
-					buf.add(ucount);
+				if( ucount > 0 ) {
+					if( ucount == 1 )
+						buf.add("n");
+					else {
+						buf.add("u");
+						buf.add(ucount);
+					}
 				}
+				buf.add("h");
+			default:
+				buf.add("c");
+				serialize(Type.getClassName(c).split("."));
+				serializeFields(v);
 			}
-			buf.add("h");
-			return;
-		}
-		if( v == true ) {
-			buf.add("t");
-			return;
-		}
-		if( v == false ) {
-			buf.add("f");
-			return;
-		}
-		if( serializeRef(v) )
-			return;
-		if( Reflect.isFunction(v) )
-			throw "Cannot serialize function";
-		#if neko
-		if( t == untyped __dollar__tabstract )
-			throw "Cannot serialize abstract";
-		#end
-		var c : Dynamic = v.__class__;
-		if( c != null && c.__name__ != null ) {
-			buf.add("c");
-			serialize(c.__name__);
-		} else {
-			var e : Dynamic = v.__enum__;
-			if( e != null && e.__ename__ != null ) {
-				serializeEnum(v);
+		case TObject:
+			if( useCache && serializeRef(v) )
 				return;
-			}
 			buf.add("o");
+			serializeFields(v);
+		case TEnum(e):
+			if( useCache && serializeRef(v) )
+				return;
+			buf.add("w");
+			serialize(Type.getEnumName(e).split("."));
+			#if neko
+			serializeString(new String(v.tag));
+			buf.add(":");
+			if( v.args == null )
+				buf.add(0);
+			else {
+				var l : Int = untyped __dollar__asize(v.args);
+				buf.add(l);
+				for( i in 0...l )
+					serialize(v.args[i]);
+			}
+			#else true
+			serializeString(v[0]);
+			buf.add(":");
+			var l = v[untyped "length"];
+			buf.add(l - 1);
+			for( i in 1...l )
+				serialize(v[i]);
+			#end
+		case TFunction:
+			throw "Cannot serialize function";
+		default:
+			throw "Cannot serialize "+Std.string(v);
 		}
-		var fl = Reflect.fields(v);
-		for( f in fl ) {
-			serializeString(f);
-			serialize(Reflect.field(v,f));
-		}
-		buf.add("g");
 	}
 
 	public function serializeException( e : Dynamic ) {