Procházet zdrojové kódy

[js] add js.Syntax and use that instead of untyped (thus becoming analyzer-friendly \o/)

Dan Korostelev před 8 roky
rodič
revize
917102e9d7

+ 66 - 34
src/generators/genjs.ml

@@ -336,6 +336,9 @@ let gen_constant ctx p = function
 	| TThis -> spr ctx (this ctx)
 	| TSuper -> assert false
 
+let print_deprecation_message com msg p =
+	com.warning msg p
+
 let rec gen_call ctx e el in_value =
 	match e.eexpr , el with
 	| TConst TSuper , params ->
@@ -362,46 +365,29 @@ let rec gen_call ctx e el in_value =
 		spr ctx "(";
 		concat ctx "," (gen_value ctx) el;
 		spr ctx ")";
-	| TIdent "__new__", { eexpr = TConst (TString cl) } :: params ->
-		print ctx "new %s(" cl;
-		concat ctx "," (gen_value ctx) params;
-		spr ctx ")";
-	| TIdent "__new__", e :: params ->
-		spr ctx "new ";
-		gen_value ctx e;
-		spr ctx "(";
-		concat ctx "," (gen_value ctx) params;
-		spr ctx ")";
+	| TField (_, FStatic ({ cl_path = ["js"],"Syntax" }, { cf_name = meth })), args ->
+		gen_syntax ctx meth args e.epos
+	| TIdent "__new__", args ->
+		print_deprecation_message ctx.com "__new__ is deprecated, use js.Syntax.new_ instead" e.epos;
+		gen_syntax ctx "new_" args e.epos
 	| TIdent "__js__", [{ eexpr = TConst (TString "this") }] ->
 		spr ctx (this ctx)
 	| TIdent "__js__", [{ eexpr = TConst (TString code) }] ->
 		spr ctx (String.concat "\n" (ExtString.String.nsplit code "\r\n"))
 	| TIdent "__js__", { eexpr = TConst (TString code); epos = p } :: tl ->
 		Codegen.interpolate_code ctx.com code tl (spr ctx) (gen_expr ctx) p
-	| TIdent "__instanceof__",  [o;t] ->
-		spr ctx "(";
-		gen_value ctx o;
-		print ctx " instanceof ";
-		gen_value ctx t;
-		spr ctx ")";
-	| TIdent "__typeof__",  [o] ->
-		spr ctx "typeof(";
-		gen_value ctx o;
-		spr ctx ")";
-	| TIdent "__strict_eq__" , [x;y] ->
-		(* add extra parenthesis here because of operator precedence *)
-		spr ctx "((";
-		gen_value ctx x;
-		spr ctx ") === ";
-		gen_value ctx y;
-		spr ctx ")";
-	| TIdent "__strict_neq__" , [x;y] ->
-		(* add extra parenthesis here because of operator precedence *)
-		spr ctx "((";
-		gen_value ctx x;
-		spr ctx ") !== ";
-		gen_value ctx y;
-		spr ctx ")";
+	| TIdent "__instanceof__",  args ->
+		print_deprecation_message ctx.com "__instanceof__ is deprecated, use js.Syntax.instanceof instead" e.epos;
+		gen_syntax ctx "instanceof" args e.epos
+	| TIdent "__typeof__",  args ->
+		print_deprecation_message ctx.com "__typeof__ is deprecated, use js.Syntax.typeof instead" e.epos;
+		gen_syntax ctx "typeof" args e.epos
+	| TIdent "__strict_eq__" , args ->
+		print_deprecation_message ctx.com "__strict_eq__ is deprecated, use js.Syntax.strictEq instead" e.epos;
+		gen_syntax ctx "strictEq" args e.epos
+	| TIdent "__strict_neq__" , args ->
+		print_deprecation_message ctx.com "__strict_neq__ is deprecated, use js.Syntax.strictNeq instead" e.epos;
+		gen_syntax ctx "strictNeq" args e.epos
 	| TIdent "__define_feature__", [_;e] ->
 		gen_expr ctx e
 	| TIdent "__feature__", { eexpr = TConst (TString f) } :: eif :: eelse ->
@@ -990,6 +976,52 @@ and gen_value ctx e =
 		v());
 	Option.may (fun smap -> smap.current_expr <- None) ctx.smap
 
+and gen_syntax ctx meth args pos =
+	match meth, args with
+	| "new_", cl :: params ->
+		spr ctx "new ";
+		begin
+			match cl.eexpr with
+			| TConst (TString cl) ->
+				spr ctx cl
+			| _ ->
+				gen_value ctx cl
+		end;
+		spr ctx "(";
+		concat ctx "," (gen_value ctx) params;
+		spr ctx ")"
+	| "instanceof", [o;t] ->
+		spr ctx "(";
+		gen_value ctx o;
+		print ctx " instanceof ";
+		gen_value ctx t;
+		spr ctx ")"
+	| "typeof", [o] ->
+		spr ctx "typeof(";
+		gen_value ctx o;
+		spr ctx ")"
+	| "strictEq" , [x;y] ->
+		(* add extra parenthesis here because of operator precedence *)
+		spr ctx "((";
+		gen_value ctx x;
+		spr ctx ") === ";
+		gen_value ctx y;
+		spr ctx ")";
+	| "strictNeq" , [x;y] ->
+		(* add extra parenthesis here because of operator precedence *)
+		spr ctx "((";
+		gen_value ctx x;
+		spr ctx ") !== ";
+		gen_value ctx y;
+		spr ctx ")";
+	| "delete" , [o;f] ->
+		spr ctx "delete(";
+		gen_value ctx o;
+		spr ctx "[";
+		gen_value ctx f;
+		spr ctx "]";
+		spr ctx ")";
+	| _ -> abort (Printf.sprintf "Unknown js.Syntax method %s with %d arguments" meth (List.length args)) pos
 
 let generate_package_create ctx (p,_) =
 	let rec loop acc = function

+ 11 - 8
src/optimization/optimizer.ml

@@ -130,12 +130,18 @@ let api_inline2 com c field params p =
 
 let api_inline ctx c field params p = match c.cl_path, field, params with
 	| ([],"Std"),"is",[o;t] | (["js"],"Boot"),"__instanceof",[o;t] when ctx.com.platform = Js ->
-		let mk_local ctx n t pos = mk (TIdent n) t pos in
-
 		let tstring = ctx.com.basic.tstring in
 		let tbool = ctx.com.basic.tbool in
 		let tint = ctx.com.basic.tint in
 
+		let esyntax =
+			let m = Hashtbl.find ctx.g.modules (["js"],"Syntax") in
+			ExtList.List.find_map (function
+				| TClassDecl ({ cl_path = ["js"],"Syntax" } as cl) -> Some (make_static_this cl p)
+				| _ -> None
+			) m.m_types
+		in
+
 		let is_trivial e =
 			match e.eexpr with
 			| TConst _ | TLocal _ -> true
@@ -143,8 +149,7 @@ let api_inline ctx c field params p = match c.cl_path, field, params with
 		in
 
 		let typeof t =
-			let tof = mk (TIdent "__typeof__") (tfun [o.etype] tstring) p in
-			let tof = mk (TCall (tof, [o])) tstring p in
+			let tof = Texpr.Builder.fcall esyntax "typeof" [o] tstring p in
 			mk (TBinop (Ast.OpEq, tof, (mk (TConst (TString t)) tstring p))) tbool p
 		in
 
@@ -155,14 +160,12 @@ let api_inline ctx c field params p = match c.cl_path, field, params with
 		| TTypeExpr (TAbstractDecl ({ a_path = [],"Float" })) -> Some (typeof "number")
 		| TTypeExpr (TAbstractDecl ({ a_path = [],"Int" })) when is_trivial o ->
 			(* generate typeof(o) == "number" && (o|0) === o check *)
-			let teq = mk_local ctx "__strict_eq__" (tfun [tint; tint] tbool) p in
 			let lhs = mk (TBinop (Ast.OpOr, o, mk (TConst (TInt Int32.zero)) tint p)) tint p in
-			let jscheck = mk (TCall (teq, [lhs; o])) tbool p in
+			let jscheck = Texpr.Builder.fcall esyntax "strictEq" [lhs;o] tbool p in
 			Some(mk (TBinop (Ast.OpBoolAnd, typeof "number", jscheck)) tbool p)
 		| TTypeExpr (TClassDecl ({ cl_path = [],"Array" })) ->
 			(* generate (o instanceof Array) && o.__enum__ == null check *)
-			let iof = mk_local ctx "__instanceof__" (tfun [o.etype;t.etype] tbool) p in
-			let iof = mk (TCall (iof, [o; t])) tbool p in
+			let iof = Texpr.Builder.fcall esyntax "instanceof" [o;t] tbool p in
 			let enum = mk (TField (o, FDynamic "__enum__")) (mk_mono()) p in
 			let null = mk (TConst TNull) (mk_mono()) p in
 			let not_enum = mk (TBinop (Ast.OpEq, enum, null)) tbool p in

+ 1 - 1
std/haxe/CallStack.hx

@@ -322,7 +322,7 @@ class CallStack {
 		#elseif js
 			if (s == null) {
 				return [];
-			} else if (js.Lib.typeof(s) == "string") {
+			} else if (js.Syntax.typeof(s) == "string") {
 				// Return the raw lines in browsers that don't support prepareStackTrace
 				var stack : Array<String> = s.split("\n");
 				if( stack[0] == "Error" ) stack.shift();

+ 3 - 3
std/haxe/Serializer.hx

@@ -172,12 +172,12 @@ class Serializer {
 
 	function serializeRef(v:Dynamic) {
 		#if js
-		var vt = js.Lib.typeof(v);
+		var vt = js.Syntax.typeof(v);
 		#end
 		for( i in 0...cache.length ) {
 			#if js
 			var ci = cache[i];
-			if( js.Lib.typeof(ci) == vt && ci == v ) {
+			if( js.Syntax.typeof(ci) == vt && ci == v ) {
 			#else
 			if( cache[i] == v ) {
 			#end
@@ -537,7 +537,7 @@ class Serializer {
 		}
 	}
 
-	@:extern inline function __getField(o:Dynamic, f:String):Dynamic return untyped o[f];
+	@:extern inline function __getField(o:Dynamic, f:String):Dynamic return o[cast f];
 
 	public function serializeException( e : Dynamic ) {
 		buf.add("x");

+ 1 - 1
std/haxe/ds/Vector.hx

@@ -65,7 +65,7 @@ abstract Vector<T>(VectorData<T>) {
 		#elseif neko
 			this = untyped __dollar__amake(length);
 		#elseif js
-			this = untyped __new__(Array, length);
+			this = js.Syntax.new_(Array, length);
 		#elseif cs
 			this = new cs.NativeArray(length);
 		#elseif java

+ 11 - 9
std/js/Boot.hx

@@ -21,6 +21,8 @@
  */
 package js;
 
+import js.Syntax; // import it here so it's always available in the compiler
+
 private class HaxeError extends js.Error {
 
 	var val:Dynamic;
@@ -33,7 +35,7 @@ private class HaxeError extends js.Error {
 	}
 
 	public static function wrap(val:Dynamic):Dynamic untyped {
-		return if (__instanceof__(val, js.Error)) val else new HaxeError(val);
+		return if (js.Syntax.instanceof(val, js.Error)) val else new HaxeError(val);
 	}
 }
 
@@ -69,7 +71,7 @@ class Boot {
 			    return "null";
 			if( s.length >= 5 )
 				return "<...>"; // too much deep recursion
-			var t = js.Lib.typeof(o);
+			var t = js.Syntax.typeof(o);
 			if( t == "function" && (isClass(o) || isEnum(o)) )
 				t = "object";
 			switch( t ) {
@@ -120,7 +122,7 @@ class Boot {
 					// strange error on IE
 					return "???";
 				}
-				if( tostr != null && tostr != __js__("Object.toString") && js.Lib.typeof(tostr) == "function" ) {
+				if( tostr != null && tostr != __js__("Object.toString") && js.Syntax.typeof(tostr) == "function" ) {
 					var s2 = o.toString();
 					if( s2 != "[object Object]")
 						return s2;
@@ -171,13 +173,13 @@ class Boot {
 			return false;
 		switch( cl ) {
 		case Int:
-			return js.Lib.typeof(o) == "number" && untyped __js__("(o|0) === o");
+			return js.Syntax.typeof(o) == "number" && untyped __js__("(o|0) === o");
 		case Float:
-			return js.Lib.typeof(o) == "number";
+			return js.Syntax.typeof(o) == "number";
 		case Bool:
-			return js.Lib.typeof(o) == "boolean";
+			return js.Syntax.typeof(o) == "boolean";
 		case String:
-			return js.Lib.typeof(o) == "string";
+			return js.Syntax.typeof(o) == "string";
 		case Array:
 			return (untyped __js__("(o instanceof Array)")) && o.__enum__ == null;
 		case Dynamic:
@@ -185,13 +187,13 @@ class Boot {
 		default:
 			if( o != null ) {
 				// Check if o is an instance of a Haxe class or a native JS object
-				if( js.Lib.typeof(cl) == "function" ) {
+				if( js.Syntax.typeof(cl) == "function" ) {
 					if( untyped __js__("o instanceof cl") )
 						return true;
 					if( __interfLoop(getClass(o),cl) )
 						return true;
 				}
-				else if ( js.Lib.typeof(cl) == "object" && __isNativeObj(cl) ) {
+				else if ( js.Syntax.typeof(cl) == "object" && __isNativeObj(cl) ) {
 					if( untyped __js__("o instanceof cl") )
 						return true;
 				}

+ 2 - 2
std/js/Browser.hx

@@ -52,7 +52,7 @@ class Browser {
 	 * environment such as node.js.
 	 */
 	public static var supported(get, never):Bool;
-	inline static function get_supported() return untyped __typeof__(window) != "undefined";
+	inline static function get_supported() return js.Syntax.typeof(window) != "undefined";
 
 	/**
 	 * Safely gets the browser's local storage, or returns null if localStorage is unsupported or
@@ -104,7 +104,7 @@ class Browser {
 			return new XMLHttpRequest();
 		}
 		if( untyped __js__("typeof ActiveXObject") != "undefined" ) {
-			return untyped __new__("ActiveXObject","Microsoft.XMLHTTP");
+			return js.Syntax.new_("ActiveXObject","Microsoft.XMLHTTP");
 		}
 		throw "Unable to create XMLHttpRequest object.";
 	}

+ 2 - 2
std/js/Lib.hx

@@ -93,8 +93,8 @@ class Lib {
 
 		Read more at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
 	**/
-	@:pure @:extern public static inline function typeof(o:Dynamic):String {
-		return untyped __typeof__(o);
+	@:extern public static inline function typeof(o:Dynamic):String {
+		return js.Syntax.typeof(o);
 	}
 
 	/**

+ 17 - 0
std/js/Syntax.hx

@@ -0,0 +1,17 @@
+package js;
+
+import haxe.extern.Rest;
+
+extern class Syntax {
+	@:overload(function(cl:String, args:Rest<Dynamic>):Dynamic {})
+	static function new_<T>(cl:Class<T>, args:Rest<Dynamic>):T;
+
+	@:pure static function instanceof(v:Dynamic, cl:Class<Dynamic>):Bool;
+
+	@:pure static function typeof(o:Dynamic):String;
+
+	@:pure static function strictEq(a:Dynamic, b:Dynamic):Bool;
+	@:pure static function strictNeq(a:Dynamic, b:Dynamic):Bool;
+
+	static function delete(o:Dynamic, f:String):Void;
+}

+ 2 - 2
std/js/_std/Date.hx

@@ -36,11 +36,11 @@
 	}
 
 	@:pure static inline function now() : Date {
-		return untyped __new__(Date);
+		return js.Syntax.new_(Date);
 	}
 
 	@:pure static inline function fromTime( t : Float ) : Date {
-		return untyped __new__(Date, t);
+		return js.Syntax.new_(Date, t);
 	}
 
 	@:pure static inline function fromString( s : String ) : Date {

+ 9 - 9
std/js/_std/HxOverrides.hx

@@ -40,20 +40,20 @@ class HxOverrides {
 		switch( s.length ) {
 		case 8: // hh:mm:ss
 			var k = s.split(":");
-			var d : Date = untyped __new__(Date);
-			untyped d["setTime"](0);
-			untyped d["setUTCHours"](k[0]);
-			untyped d["setUTCMinutes"](k[1]);
-			untyped d["setUTCSeconds"](k[2]);
+			var d = js.Syntax.new_(Date);
+			(cast d)[cast "setTime"](0);
+			(cast d)[cast "setUTCHours"](k[0]);
+			(cast d)[cast "setUTCMinutes"](k[1]);
+			(cast d)[cast "setUTCSeconds"](k[2]);
 			return d;
 		case 10: // YYYY-MM-DD
 			var k = s.split("-");
-			return new Date(cast k[0],cast untyped k[1] - 1,cast k[2],0,0,0);
+			return new Date(cast k[0],(cast k[1]) - 1,cast k[2],0,0,0);
 		case 19: // YYYY-MM-DD hh:mm:ss
 			var k = s.split(" ");
 			var y = k[0].split("-");
 			var t = k[1].split(":");
-			return new Date(cast y[0],cast untyped y[1] - 1,cast y[2],cast t[0],cast t[1],cast t[2]);
+			return new Date(cast y[0],(cast y[1]) - 1,cast y[2],cast t[0],cast t[1],cast t[2]);
 		default:
 			throw "Invalid date format : " + s;
 		}
@@ -98,7 +98,7 @@ class HxOverrides {
 		}
 		while (i < len)
 		{
-			if (untyped __js__("a[i] === obj"))
+			if (js.Syntax.strictEq(a[i], obj))
 				return i;
 			i++;
 		}
@@ -114,7 +114,7 @@ class HxOverrides {
 			i += len;
 		while (i >= 0)
 		{
-			if (untyped __js__("a[i] === obj"))
+			if (js.Syntax.strictEq(a[i], obj))
 				return i;
 			i--;
 		}

+ 7 - 7
std/js/_std/Reflect.hx

@@ -27,11 +27,11 @@
 	}
 
 	public static function field( o : Dynamic, field : String ) : Dynamic {
-		try return untyped o[field] catch( e : Dynamic ) return null;
+		try return o[cast field] catch( e : Dynamic ) return null;
 	}
 
-	public inline static function setField( o : Dynamic, field : String, value : Dynamic ) : Void untyped {
-		o[field] = value;
+	public inline static function setField( o : Dynamic, field : String, value : Dynamic ) : Void {
+		o[cast field] = value;
 	}
 
 	public static function getProperty( o : Dynamic, field : String ) : Dynamic untyped {
@@ -61,7 +61,7 @@
 
 	@:access(js.Boot)
 	public static function isFunction( f : Dynamic ) : Bool {
-		return js.Lib.typeof(f) == "function" && !(js.Boot.isClass(f) || js.Boot.isEnum(f));
+		return js.Syntax.typeof(f) == "function" && !(js.Boot.isClass(f) || js.Boot.isEnum(f));
 	}
 
 	public static function compare<T>( a : T, b : T ) : Int {
@@ -80,7 +80,7 @@
 	public static function isObject( v : Dynamic ) : Bool {
 		if( v == null )
 			return false;
-		var t = js.Lib.typeof(v);
+		var t = js.Syntax.typeof(v);
 		return (t == "string" || (t == "object" && v.__enum__ == null)) || (t == "function" && (js.Boot.isClass(v) || js.Boot.isEnum(v)) != null);
 	}
 
@@ -88,9 +88,9 @@
 		return v != null && v.__enum__ != null;
 	}
 
-	public static function deleteField( o : Dynamic, field : String ) : Bool untyped {
+	public static function deleteField( o : Dynamic, field : String ) : Bool {
 		if( !hasField(o,field) ) return false;
-		__js__("delete")(o[field]);
+		js.Syntax.delete(o, field);
 		return true;
 	}
 

+ 1 - 1
std/js/_std/Std.hx

@@ -29,7 +29,7 @@ import js.Boot;
 	}
 
 	public static inline function instance<T:{},S:T>( value : T, c : Class<S> ) : S {
-		return untyped __instanceof__(value, c) ? cast value : null;
+		return js.Syntax.instanceof(value, c) ? cast value : null;
 	}
 
 	@:pure

+ 17 - 17
std/js/_std/Type.hx

@@ -82,38 +82,38 @@ enum ValueType {
 	}
 
 	#if (js_es < 5)
-	public static function createInstance<T>( cl : Class<T>, args : Array<Dynamic> ) : T untyped {
+	public static function createInstance<T>( cl : Class<T>, args : Array<Dynamic> ) : T {
 		switch( args.length ) {
 		case 0:
-			return __new__(cl);
+			return js.Syntax.new_(cl);
 		case 1:
-			return __new__(cl,args[0]);
+			return js.Syntax.new_(cl,args[0]);
 		case 2:
-			return __new__(cl,args[0],args[1]);
+			return js.Syntax.new_(cl,args[0],args[1]);
 		case 3:
-			return __new__(cl,args[0],args[1],args[2]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2]);
 		case 4:
-			return __new__(cl,args[0],args[1],args[2],args[3]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3]);
 		case 5:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4]);
 		case 6:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5]);
 		case 7:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
 		case 8:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
 		case 9:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
 		case 10:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
 		case 11:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
 		case 12:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
 		case 13:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12]);
 		case 14:
-			return __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13]);
+			return js.Syntax.new_(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13]);
 		default:
 			throw "Too many arguments";
 		}
@@ -176,7 +176,7 @@ enum ValueType {
 
 	@:access(js.Boot)
 	public static function typeof( v : Dynamic ) : ValueType {
-		switch (js.Lib.typeof(v)) {
+		switch (js.Syntax.typeof(v)) {
 		case "boolean":
 			return TBool;
 		case "string":

+ 1 - 1
std/js/_std/haxe/Log.hx

@@ -29,7 +29,7 @@ package haxe;
 		if (infos != null && infos.customParams != null)
 			for (v in infos.customParams)
 				msg += "," + js.Boot.__string_rec(v, "");
-		if( js.Lib.typeof(untyped console) != "undefined" && (untyped console).log != null )
+		if( js.Syntax.typeof(untyped console) != "undefined" && (untyped console).log != null )
 			(untyped console).log(msg);
 	}
 }

+ 1 - 1
std/js/html/compat/Float32Array.hx

@@ -31,7 +31,7 @@ class Float32Array {
 
 	static function _new( ?arg1 : Dynamic, ?offset : Int, ?length : Int ) : Dynamic {
 		var arr : Array<Float>;
-		if( untyped __typeof__(arg1) == 'number' ) {
+		if( js.Syntax.typeof(arg1) == 'number' ) {
 			arr = new Array();
 			for( i in 0...arg1 )
 				arr[i] = 0;

+ 1 - 1
std/js/html/compat/Float64Array.hx

@@ -31,7 +31,7 @@ class Float64Array {
 
 	static function _new( ?arg1 : Dynamic, ?offset : Int, ?length : Int ) : Dynamic {
 		var arr : Array<Float>;
-		if( untyped __typeof__(arg1) == 'number' ) {
+		if( js.Syntax.typeof(arg1) == 'number' ) {
 			arr = new Array();
 			for( i in 0...arg1 )
 				arr[i] = 0;

+ 1 - 1
std/js/html/compat/Uint8Array.hx

@@ -31,7 +31,7 @@ class Uint8Array {
 
 	static function _new( ?arg1 : Dynamic, ?offset : Int, ?length : Int ) : Dynamic {
 		var arr;
-		if( untyped __typeof__(arg1) == 'number' ) {
+		if( js.Syntax.typeof(arg1) == 'number' ) {
 			arr = new Array();
 			for( i in 0...arg1 )
 				arr[i] = 0;

+ 1 - 1
std/js/jquery/JqEltsIterator.hx

@@ -15,7 +15,7 @@ class JqEltsIterator {
 	}
 
 	static function __init__() {
-		if (untyped __typeof__(JQuery) != "undefined" && JQuery.fn != null)
+		if (js.Syntax.typeof(JQuery) != "undefined" && JQuery.fn != null)
 			JQuery.fn.elements = function() return new JqEltsIterator(js.Lib.nativeThis);
 	}
 }

+ 1 - 1
std/js/jquery/JqIterator.hx

@@ -15,7 +15,7 @@ class JqIterator {
 	}
 
 	static function __init__() {
-		if (untyped __typeof__(JQuery) != "undefined" && JQuery.fn != null)
+		if (js.Syntax.typeof(JQuery) != "undefined" && JQuery.fn != null)
 			JQuery.fn.iterator = function() return new JqIterator(js.Lib.nativeThis);
 	}
 }