瀏覽代碼

[cs] Ignore native property access when they aren't used as values

Closes #6784
Caue Waneck 7 年之前
父節點
當前提交
a0cfa59bd3
共有 2 個文件被更改,包括 30 次插入17 次删除
  1. 21 17
      src/generators/gencs.ml
  2. 9 0
      tests/unit/src/unit/issues/Issue6784.hx

+ 21 - 17
src/generators/gencs.ml

@@ -1170,9 +1170,9 @@ let generate con =
 			List.rev !ret
 		in
 
-		let expr_s w e =
+		let expr_s is_in_value w e =
 			last_line := -1;
-			in_value := false;
+			in_value := is_in_value;
 			let rec expr_s w e =
 				let was_in_value = !in_value in
 				in_value := true;
@@ -1225,11 +1225,15 @@ let generate con =
 					| TCall( ({ eexpr = TField(ef,f) } as e), [] ) when String.starts_with (field_name f) "get_" ->
 						let name = field_name f in
 						let propname = String.sub name 4 (String.length name - 4) in
-						if is_extern_prop (gen.greal_type ef.etype) propname then begin
-							expr_s w ef;
-							write w ".";
-							write_field w propname
-						end else
+						if is_extern_prop (gen.greal_type ef.etype) propname then
+							if not was_in_value then
+								write w "{}"
+							else begin
+								expr_s w ef;
+								write w ".";
+								write_field w propname
+							end
+						else
 							do_call w e []
 					| TCall( ({ eexpr = TField(ef,f) } as e), [v] ) when String.starts_with (field_name f) "set_" ->
 						let name = field_name f in
@@ -2033,7 +2037,7 @@ let generate con =
 						(match cf.cf_expr with
 							| Some e ->
 								write w " = ";
-								expr_s w e;
+								expr_s true w e;
 							| None -> ()
 						);
 						write w ";"
@@ -2127,7 +2131,7 @@ let generate con =
 											let unchecked = needs_unchecked e in
 											if unchecked then (begin_block w; write w "unchecked ");
 											let t = Timer.timer ["expression to string"] in
-											expr_s w e;
+											expr_s false w e;
 											t();
 											line_reset_directive w;
 											if unchecked then end_block w
@@ -2154,7 +2158,7 @@ let generate con =
 													| Some sc ->
 														write w ": ";
 														let t = Timer.timer ["expression to string"] in
-														expr_s w sc;
+														expr_s false w sc;
 														write w " ";
 														t()
 												);
@@ -2329,7 +2333,7 @@ let generate con =
 							write w "get";
 							begin_block w;
 							write w "return ";
-							expr_s w this;
+							expr_s true w this;
 							print w ".get_%s();" f.cf_name;
 							end_block w
 						| _ -> ());
@@ -2337,7 +2341,7 @@ let generate con =
 						| AccCall ->
 							write w "set";
 							begin_block w;
-							expr_s w this;
+							expr_s false w this;
 							print w ".set_%s(value);" f.cf_name;
 							end_block w
 						| _ -> ());
@@ -2392,10 +2396,10 @@ let generate con =
 						(if Hashtbl.mem gen.gtypes (["cs"], "Boot") then write w "global::cs.Boot.init();"; newline w);
 						(match gen.gcon.main with
 							| None ->
-								expr_s w { eexpr = TTypeExpr(TClassDecl cl); etype = t_dynamic; epos = null_pos };
+								expr_s true w { eexpr = TTypeExpr(TClassDecl cl); etype = t_dynamic; epos = null_pos };
 								write w ".main();"
 							| Some expr ->
-								expr_s w (mk_block expr));
+								expr_s false w (mk_block expr));
 						end_block w;
 						end_block w;
 						newline w;
@@ -2439,7 +2443,7 @@ let generate con =
 					| None ->
 						write w "main();";
 					| Some expr ->
-							expr_s w (mk_block expr));
+							expr_s false w (mk_block expr));
 				end_block w
 			end;
 
@@ -2450,10 +2454,10 @@ let generate con =
 					if needs_unchecked init then begin
 						begin_block w;
 						write w "unchecked ";
-						expr_s w (mk_block init);
+						expr_s false w (mk_block init);
 						end_block w;
 					end else
-						expr_s w (mk_block init);
+						expr_s false w (mk_block init);
 					line_reset_directive w;
 					newline w;
 					newline w

+ 9 - 0
tests/unit/src/unit/issues/Issue6784.hx

@@ -0,0 +1,9 @@
+package unit.issues;
+
+class Issue6784 extends Test {
+	function test() {
+		#if cs
+		cs.system.Console.BufferHeight;
+		#end
+	}
+}