Browse Source

simplified class & enum implementation.

Nicolas Cannasse 19 năm trước cách đây
mục cha
commit
b4b9cb2bb6
1 tập tin đã thay đổi với 14 bổ sung48 xóa
  1. 14 48
      std/haxe/Unserializer.hx

+ 14 - 48
std/haxe/Unserializer.hx

@@ -211,73 +211,39 @@ class Unserializer {
  		case 120: // x
 			throw unserialize();
 		case 99: // c
-	 		var o = Reflect.empty();
-	 		cache.push(o);
-			var a : Array<String> = unserialize();
-            if( !Std.is(a,Array) )
-				throw "Invalid class name";
-			for(s in a)
-				if( !Std.is(s,String) )
-					throw "Invalid class name";
-			var cl = resolver.resolveClass(a.join("."));
+	 		var name = unserialize();
+			var cl = resolver.resolveClass(name);
 			if( cl == null )
-				throw "Class not found " + a.join(".");
+				throw "Class not found " + name;
+			var o = Type.createEmptyInstance(cl);
+			cache.push(o);
 			unserializeObject(o);
-			Type.setClass(o,cl);
 			return o;
 		case 119: // w
-			#if neko
-			var e : Dynamic = {
-				tag : null,
-				__string : function() { return untyped neko.Boot.__enum_str(this); },
-				__enum__ : null
-			};
-			#else true
-			var e : Array<Dynamic> = new Array();
-			#end
-			var cpos = cache.length;
-			cache.push(e);
-			var a : Array<String> = unserialize();
-            if( !Std.is(a,Array) )
-				throw "Invalid enum name";
-			for(s in a)
-				if( !Std.is(s,String) )
-					throw "Invalid enum name";
-			var edecl = resolver.resolveEnum(a.join("."));
+			var name = unserialize();
+			var edecl = resolver.resolveEnum(name);
 			if( edecl == null )
-				throw "Enum not found " + a.join(".");
-			untyped e.__enum__ = edecl;
+				throw "Enum not found " + name;
 			var tag : String = unserialize();
 			if( !Std.is(tag,String) )
 				throw "Invalid enum tag";
-			#if neko
-			e.tag = untyped tag.__s;
-			#else true
-			e.push(tag);
-			#end
 			var constr = Reflect.field(edecl,tag);
 			if( constr == null )
-				throw "Unknown enum tag "+a.join(".")+"."+tag;
+				throw "Unknown enum tag "+name+"."+tag;
 			if( buf.charCodeAt(pos++) != 58 ) // ':'
 				throw "Invalid enum format";
 			var nargs = readDigits();
 			if( nargs == 0 ) {
-				cache[cpos] = constr;
+				cache.push(constr);
 				return constr;
 			}
-			#if neko
-			var i = 0;
-			e.args = untyped __dollar__amake(nargs);
-			#end
+			var args = new Array();
 			while( nargs > 0 ) {
-				#if neko
-				e.args[i] = unserialize();
-				i += 1;
-				#else true
-				e.push(unserialize());
-				#end
+				args.push(unserialize());
 				nargs -= 1;
 			}
+			var e = Reflect.callMethod(edecl,constr,args);
+			cache.push(e);
 			return e;
  		default:
  		}