Browse Source

Added fast-path for Std.is(_, Array).

Uses Object.prototype.toString.call(o) == "[object Array]"

instanceof Array is not full-proof, nor is constructor check when
scripts are run between browser frames.
Luca Deltodesco 12 years ago
parent
commit
3904656529
2 changed files with 7 additions and 1 deletions
  1. 5 0
      genjs.ml
  2. 2 1
      std/js/_std/Std.hx

+ 5 - 0
genjs.ml

@@ -1142,6 +1142,11 @@ let rec optimize_call tctx e = let recurse = optimize tctx e in
                     let teq = mk_local tctx "__js_teq__" (tfun [intt; intt] boolt) e.epos in
                     let lhs = mk (TBinop (Ast.OpOr, o, mk (TConst (TInt Int32.zero)) intt e.epos)) intt e.epos in
                     mk (TCall (teq, [lhs; o])) boolt e.epos
+                | TTypeExpr (TClassDecl ({ cl_path = [],"Array" })) ->
+                    let pstring = mk_local tctx "$ObjectPrototypeToString" t_dynamic e.epos in
+                    let pstring = mk (TField (pstring, FDynamic ("call"))) (tfun [o.etype] stringt) e.epos in
+                    let psof = mk (TCall (pstring, [o])) stringt e.epos in
+                    mk (TBinop (Ast.OpEq, psof, (mk (TConst (TString "[object Array]")) stringt e.epos))) boolt e.epos
                 | _ -> recurse
             )
         | _ -> recurse

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

@@ -27,7 +27,7 @@ import js.Boot;
 	public static inline function is( v : Dynamic, t : Dynamic ) : Bool {
 		return untyped js.Boot.__instanceof(v,t);
 	}
-	
+
 	public static inline function instance<T>( v : { }, c : Class<T> ) : T {
 		return untyped __instanceof__(v, c) ? cast v : null;
 	}
@@ -110,6 +110,7 @@ import js.Boot;
 					return a;
 				}
 		);
+        __js__("var $ObjectPrototypeToString = Object.prototype.toString");
 	}
 
 }