Browse Source

[js] don't generate $bind for `method == null` (#6297)

Aleksandr Kuzmenko 5 years ago
parent
commit
7440224a03

+ 9 - 1
src/generators/genjs.ml

@@ -339,7 +339,7 @@ let this ctx = match ctx.in_value with None -> "this" | Some _ -> "$this"
 
 
 let is_iterator_field_access fa = match field_name fa with
 let is_iterator_field_access fa = match field_name fa with
 	| "iterator" | "keyValueIterator" -> true
 	| "iterator" | "keyValueIterator" -> true
-	| _ -> true
+	| _ -> false
 
 
 let is_dynamic_iterator ctx e =
 let is_dynamic_iterator ctx e =
 	let check x =
 	let check x =
@@ -531,6 +531,14 @@ and gen_expr ctx e =
 		spr ctx (field (field_name f));
 		spr ctx (field (field_name f));
 		print ctx " %s " (Ast.s_binop op);
 		print ctx " %s " (Ast.s_binop op);
 		gen_value ctx e2;
 		gen_value ctx e2;
+	| TBinop ((OpEq | OpNotEq) as op,{ eexpr = TField (x,(FClosure _ as f)) },{ eexpr = TConst TNull }) ->
+		gen_value ctx x;
+		spr ctx (field (field_name f));
+		print ctx " %s null" (Ast.s_binop op)
+	| TBinop ((OpEq | OpNotEq) as op,{ eexpr = TConst TNull },{ eexpr = TField (x,(FClosure _ as f)) }) ->
+		print ctx "null %s " (Ast.s_binop op);
+		gen_value ctx x;
+		spr ctx (field (field_name f))
 	| TBinop (op,e1,e2) ->
 	| TBinop (op,e1,e2) ->
 		gen_value ctx e1;
 		gen_value ctx e1;
 		print ctx " %s " (Ast.s_binop op);
 		print ctx " %s " (Ast.s_binop op);

+ 0 - 17
tests/optimization/src/issues/Issue6296.hx

@@ -1,17 +0,0 @@
-package issues;
-
-class Issue6296 {
-	@:js('
-		var a = [];
-		if(a.push != null) {
-			a.push(1);
-		}'
-	)
-	@:analyzer(no_local_dce)
-	static function f(a, b) {
-		var a = [];
-		if (a.push != null) {
-			a.push(1);
-		}
-	}
-}

+ 20 - 0
tests/optimization/src/issues/Issue6297.hx

@@ -0,0 +1,20 @@
+package issues;
+
+class Issue6297 {
+	@:js("
+		issues_Issue6297.use(a.test == null);
+		issues_Issue6297.use(a.test != null);
+		issues_Issue6297.use(null == a.test);
+		issues_Issue6297.use(null != a.test);
+	")
+	@:analyzer(no_local_dce)
+	static function f(a:{function test():Void;}) {
+		use(a.test == null);
+		use(a.test != null);
+		use(null == a.test);
+		use(null != a.test);
+	}
+
+	@:pure(false)
+	static function use(e:Dynamic) {}
+}