Parcourir la source

[cs] fix DynamicObject lookupSetField(_f) (closes #2528)

Dan Korostelev il y a 11 ans
Parent
commit
4b37923553
2 fichiers modifiés avec 21 ajouts et 1 suppressions
  1. 6 1
      gencommon.ml
  2. 15 0
      tests/unit/TestCSharp.hx

+ 6 - 1
gencommon.ml

@@ -6578,6 +6578,11 @@ struct
 
         let res2 = alloc_var "res2" basic.tint in
         let res2_local = mk_local res2 pos in
+        let gte2 = {
+          eexpr = TBinop(Ast.OpGte, res2_local, { eexpr = TConst(TInt(Int32.zero)); etype = basic.tint; epos = pos });
+          etype = basic.tbool;
+          epos = pos;
+        } in
 
         let block =
         [
@@ -6588,7 +6593,7 @@ struct
               Some({ eexpr = TBlock([
                 { eexpr = TVar( res2, Some(ctx.rcf_hash_function hash_local snd_hash)); etype = basic.tvoid; epos = pos };
                 {
-                  eexpr = TIf(gte, { eexpr = TBlock([
+                  eexpr = TIf(gte2, { eexpr = TBlock([
                     mk_splice snd_hash res2_local;
                     mk_splice snd_dynamics res2_local
                   ]); etype = t_dynamic; epos = pos }, None);

+ 15 - 0
tests/unit/TestCSharp.hx

@@ -15,6 +15,21 @@ class TestCSharp extends Test
 		out = x * 2;
 	}
 
+    // test for https://github.com/HaxeFoundation/haxe/issues/2528
+    public function testDynObjectSetField()
+    {
+        var a:Dynamic = {};
+        a.status = 10;
+        var b:{status:Int} = a;
+        b.status = 15;
+
+        eq(a, b);
+        eq(Reflect.fields(a).length, 1);
+        eq(Reflect.fields(b).length, 1);
+        eq(a.status, 15);
+        eq(b.status, 15);
+    }
+
 	public function testRef()
 	{
 		var i = 10;