From 8df3fcffad2786e63fa21dc2de58c624cf6d3353 Mon Sep 17 00:00:00 2001 From: RblSb Date: Fri, 31 Jan 2025 19:55:57 +0300 Subject: [PATCH] Can i extract this TBinop? --- src/typing/typer.ml | 14 ++++--- tests/optimization/src/issues/Issue11931.hx | 18 +++------ tests/unit/src/unit/TestNullCoalescing.hx | 43 +++++++++++++++++++++ 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/typing/typer.ml b/src/typing/typer.ml index 654780c1a82..1fa535a0832 100644 --- a/src/typing/typer.ml +++ b/src/typing/typer.ml @@ -1877,14 +1877,18 @@ and type_expr ?(mode=MGet) ctx (e,p) (with_type:WithType.t) = let e_cond = mk (TBinop(OpNotEq,e1,e_null)) ctx.t.tbool e1.epos in let e_if = mk (TIf(e_cond,cast e1,Some e2)) iftype p in vr#to_texpr e_if - | EBinop (OpAssignOp OpNullCoal,e1_orig,e2) -> + | EBinop (OpAssignOp OpNullCoal,e1,e2) -> let vr = new value_reference ctx in - let e1 = type_expr ctx (Expr.ensure_block e1_orig) with_type in + let e_assign = type_assign ctx e1 (Expr.ensure_block e2) WithType.value p in + let e1 = match e_assign.eexpr with + | TBinop(OpAssign,e1_left,_) -> e1_left + | _ -> raise_typing_error "Invalid null coalescing assignment" p + in let e1_null_t = if is_nullable e1.etype then e1.etype else ctx.t.tnull e1.etype in let e1_var = vr#as_var (Option.default "tmp" (WithType.get_expected_name with_type)) {e1 with etype = e1_null_t} in - let e_null = Builder.make_null e1_null_t e1.epos in - let e_cond = mk (TBinop(OpNotEq,e1_var,e_null)) ctx.t.tbool e1.epos in - let e_assign = type_assign ctx e1_orig (Expr.ensure_block e2) with_type p in + + let e_null = Builder.make_null e1_null_t p in + let e_cond = mk (TBinop(OpNotEq,e1_var,e_null)) ctx.t.tbool p in let e_if = mk (TIf(e_cond,e1_var,Some e_assign)) e1.etype p in vr#to_texpr e_if | EBinop (op,e1,e2) -> diff --git a/tests/optimization/src/issues/Issue11931.hx b/tests/optimization/src/issues/Issue11931.hx index 4d3f81303b4..a32cbf42448 100644 --- a/tests/optimization/src/issues/Issue11931.hx +++ b/tests/optimization/src/issues/Issue11931.hx @@ -3,21 +3,13 @@ package issues; class Issue11931 { @:js(' var arr = []; - var _g = 0; - var _g1 = issues_Issue11931.test_i; - while(_g < _g1) { - var x = _g++; - var e = arr[x]; - issues_Issue11931.use(e != null ? e : arr[x] = []); - } + var e = arr[0]; + issues_Issue11931.use(e != null ? e : arr[0] = []); ') static function test() { - static var i = 0; - var arr:Array> = []; - for (x in 0...i) { - var e = arr[x] ??= []; - use(e); - } + var arr = []; + var e = arr[0] ??= []; + use(e); } @:pure(false) diff --git a/tests/unit/src/unit/TestNullCoalescing.hx b/tests/unit/src/unit/TestNullCoalescing.hx index 76eb4895fbc..f4597445061 100644 --- a/tests/unit/src/unit/TestNullCoalescing.hx +++ b/tests/unit/src/unit/TestNullCoalescing.hx @@ -142,5 +142,48 @@ class TestNullCoalescing extends Test { t(HelperMacros.isNullable(nullF2)); f(HelperMacros.isNullable(notNullF)); f(HelperMacros.isNullable(notNullF2)); + + // test typing + #if !macro + var a = mut() ?? mut(); + eq(2, getMut()); + resetMut(); + + var a = 0; + mutAssignLeft() ??= mut() ?? mut(); + eq(3, getMut()); + resetMut(); + + var a = 0; + final b = a ??= mut(); + eq(1, getMut()); + resetMut(); + + var a = 0; + mutAssignLeft() ??= 1; + eq(1, getMut()); + resetMut(); + #end + } + + static var mutI = 0; + + static macro function mut() { + mutI++; + return macro mutI; + } + + static macro function getMut() { + return macro $v{mutI}; + } + + static macro function resetMut() { + mutI = 0; + return macro $v{mutI}; + } + + static macro function mutAssignLeft() { + mutI++; + return macro a; } }