Browse Source

[php] optimize Type.enum* methods

Aleksandr Kuzmenko 5 years ago
parent
commit
91e72e05a4
2 changed files with 20 additions and 10 deletions
  1. 10 0
      std/php/Boot.hx
  2. 10 10
      std/php/_std/Type.hx

+ 10 - 0
std/php/Boot.hx

@@ -299,6 +299,13 @@ class Boot {
 		return cast cls;
 		return cast cls;
 	}
 	}
 
 
+	/**
+		Unsafe cast to HxEnum
+	**/
+	public static inline function castEnumValue(enm:EnumValue):HxEnum {
+		return cast enm;
+	}
+
 	/**
 	/**
 		Returns `Class<T>` for `HxClosure`
 		Returns `Class<T>` for `HxClosure`
 	**/
 	**/
@@ -688,6 +695,7 @@ private class HxClass {
 @:keep
 @:keep
 @:dox(hide)
 @:dox(hide)
 @:allow(php.Boot.stringify)
 @:allow(php.Boot.stringify)
+@:allow(Type)
 private class HxEnum {
 private class HxEnum {
 	final tag:String;
 	final tag:String;
 	final index:Int;
 	final index:Int;
@@ -713,6 +721,8 @@ private class HxEnum {
 	public function __toString():String {
 	public function __toString():String {
 		return Boot.stringify(this);
 		return Boot.stringify(this);
 	}
 	}
+
+	extern public static function __hx__list():Array<String>;
 }
 }
 
 
 /**
 /**

+ 10 - 10
std/php/_std/Type.hx

@@ -256,7 +256,7 @@ enum ValueType {
 	public static function getEnumConstructs(e:Enum<Dynamic>):Array<String> {
 	public static function getEnumConstructs(e:Enum<Dynamic>):Array<String> {
 		if (e == null)
 		if (e == null)
 			return null;
 			return null;
-		return @:privateAccess Array.wrap(untyped e.__hx__list());
+		return @:privateAccess Array.wrap(Syntax.call(e, '__hx__list'));
 	}
 	}
 
 
 	public static function typeof(v:Dynamic):ValueType {
 	public static function typeof(v:Dynamic):ValueType {
@@ -290,19 +290,19 @@ enum ValueType {
 	}
 	}
 
 
 	public static function enumEq<T:EnumValue>(a:T, b:T):Bool {
 	public static function enumEq<T:EnumValue>(a:T, b:T):Bool {
-		if (a == b)
+		if (Syntax.strictEqual(a, b))
 			return true;
 			return true;
 		if (a == null || b == null)
 		if (a == null || b == null)
 			return false;
 			return false;
 
 
 		try {
 		try {
-			if (Global.get_class(cast a) != Global.get_class(cast b))
+			if (Syntax.strictNotEqual(Global.get_class(cast a), Global.get_class(cast b)))
 				return false;
 				return false;
 			if (enumIndex(a) != enumIndex(b))
 			if (enumIndex(a) != enumIndex(b))
 				return false;
 				return false;
 
 
-			var aParams:NativeIndexedArray<Dynamic> = untyped a.params;
-			var bParams:NativeIndexedArray<Dynamic> = untyped b.params;
+			var aParams:NativeIndexedArray<Dynamic> = Boot.castEnumValue(a).params;
+			var bParams:NativeIndexedArray<Dynamic> = Boot.castEnumValue(b).params;
 			for (i in 0...Global.count(aParams)) {
 			for (i in 0...Global.count(aParams)) {
 				// enums
 				// enums
 				if (Boot.isEnumValue(aParams[i])) {
 				if (Boot.isEnumValue(aParams[i])) {
@@ -319,7 +319,7 @@ enum ValueType {
 					continue;
 					continue;
 				}
 				}
 				// everything else
 				// everything else
-				if (aParams[i] != bParams[i]) {
+				if (!inline Boot.equal(aParams[i], bParams[i])) {
 					return false;
 					return false;
 				}
 				}
 			}
 			}
@@ -330,16 +330,16 @@ enum ValueType {
 		}
 		}
 	}
 	}
 
 
-	public static function enumConstructor(e:EnumValue):String {
-		return untyped e.tag;
+	public inline static function enumConstructor(e:EnumValue):String {
+		return Boot.castEnumValue(e).tag;
 	}
 	}
 
 
 	public inline static function enumParameters(e:EnumValue):Array<Dynamic> {
 	public inline static function enumParameters(e:EnumValue):Array<Dynamic> {
-		return @:privateAccess Array.wrap(untyped e.params);
+		return @:privateAccess Array.wrap(Boot.castEnumValue(e).params);
 	}
 	}
 
 
 	public inline static function enumIndex(e:EnumValue):Int {
 	public inline static function enumIndex(e:EnumValue):Int {
-		return untyped e.index;
+		return Boot.castEnumValue(e).index;
 	}
 	}
 
 
 	public static function allEnums<T>(e:Enum<T>):Array<T> {
 	public static function allEnums<T>(e:Enum<T>):Array<T> {