2
0
Эх сурвалжийг харах

[cs] better fix for rest args (#10315)

Aleksandr Kuzmenko 4 жил өмнө
parent
commit
4c3b509f92

+ 2 - 1
src/codegen/gencommon/castDetect.ml

@@ -909,7 +909,8 @@ let handle_type_parameter gen e e1 ef ~clean_ef ~overloads_cast_to_base f elist
 						| [], [] -> []
 						| [(_,_,funct)], _ when expects_rest_args ->
 							(match funct, applied with
-							| TInst({ cl_path = (_,"NativeArray") },[_]),[a] when Type.does_unify funct a.etype ->
+							| _,[{ eexpr = TUnop(Spread,Prefix,a) }]
+							| _,[{ eexpr = TParenthesis({ eexpr = TUnop(Spread,Prefix,a) }) }] ->
 								[fn funct a]
 							| TInst({ cl_path = (_,"NativeArray") },[funct]),_ ->
 								List.map (fn funct) applied

+ 6 - 0
src/codegen/gencommon/reflectionCFs.ml

@@ -1182,6 +1182,12 @@ let implement_invokeField ctx slow_invoke cl =
 					mk_this_call cf (List.map (fun (name,optional,t) ->
 						let idx = make_int ctx.rcf_gen.gcon.basic !i pos in
 						let ret = { eexpr = TArray(dyn_arg_local, idx); etype = t_dynamic; epos = pos } in
+						let ret =
+							if ExtType.is_rest t then
+								{ ret with eexpr = TUnop(Spread,Prefix,{ ret with etype = t }) }
+							else
+								ret
+						in
 						incr i;
 						if optional then
 							let condition = binop OpGt dyn_arg_length idx ctx.rcf_gen.gcon.basic.tbool pos in

+ 1 - 0
tests/unit/src/unit/issues/Issue10315.hx

@@ -4,6 +4,7 @@ class Issue10315 extends Test {
 	function test() {
 		var o = new Obj();
 		eq('a', o.call('a'));
+		eq('b', o.call(('b':Dynamic)));
 	}
 }