From 4885ca1c62189376400f5a0ce7794ef45aec4095 Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 10 Oct 2024 03:18:03 +0300 Subject: [PATCH] fix rtwrap decompose --- src/rtwrap.c | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/rtwrap.c b/src/rtwrap.c index 2f8a626f..803ca03f 100644 --- a/src/rtwrap.c +++ b/src/rtwrap.c @@ -41,15 +41,6 @@ struct WMd2 { WFun* lastWF; WMd1* lastWM1; WMd2* lastWM2; -void wfn_visit(Value* x) { mm_visit(((WFun*)x)->v); } -void wm1_visit(Value* x) { mm_visit(((WMd1*)x)->v); } -void wm2_visit(Value* x) { mm_visit(((WMd2*)x)->v); } - -B wfn_identity(B x) { - B f = c(WFun,x)->v; - return TI(f,identity)(f); -} - // rtverify #ifndef RT_VERIFY_ARGS @@ -268,19 +259,37 @@ B rtWrap_unwrap(B x) { // consumes x } -B wfn_uc1(B t, B o, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_uc1)( t2, o, x); } -B wfn_ucw(B t, B o, B w, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_ucw)( t2, o, w, x); } -B wm1_uc1(Md1* t, B o, B f, B x) { B t2 = ((WMd1*)t)->v; return TI(t2,m1_uc1)(c(Md1,t2), o, f, x); } -B wm1_ucw(Md1* t, B o, B f, B w, B x) { B t2 = ((WMd1*)t)->v; return TI(t2,m1_ucw)(c(Md1,t2), o, f, w, x); } -B wm2_uc1(Md2* t, B o, B f, B g, B x) { B t2 = ((WMd2*)t)->v; return TI(t2,m2_uc1)(c(Md2,t2), o, f, g, x); } -B wm2_ucw(Md2* t, B o, B f, B g, B w, B x) { B t2 = ((WMd2*)t)->v; return TI(t2,m2_ucw)(c(Md2,t2), o, f, g, w, x); } +static B wfn_uc1(B t, B o, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_uc1)( t2, o, x); } +static B wfn_ucw(B t, B o, B w, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_ucw)( t2, o, w, x); } +static B wm1_uc1(Md1* t, B o, B f, B x) { B t2 = ((WMd1*)t)->v; return TI(t2,m1_uc1)(c(Md1,t2), o, f, x); } +static B wm1_ucw(Md1* t, B o, B f, B w, B x) { B t2 = ((WMd1*)t)->v; return TI(t2,m1_ucw)(c(Md1,t2), o, f, w, x); } +static B wm2_uc1(Md2* t, B o, B f, B g, B x) { B t2 = ((WMd2*)t)->v; return TI(t2,m2_uc1)(c(Md2,t2), o, f, g, x); } +static B wm2_ucw(Md2* t, B o, B f, B g, B w, B x) { B t2 = ((WMd2*)t)->v; return TI(t2,m2_ucw)(c(Md2,t2), o, f, g, w, x); } + +static void wfn_visit(Value* x) { mm_visit(((WFun*)x)->v); } +static void wm1_visit(Value* x) { mm_visit(((WMd1*)x)->v); } +static void wm2_visit(Value* x) { mm_visit(((WMd2*)x)->v); } + +static B wfn_identity(B x) { + B f = c(WFun,x)->v; + return TI(f,identity)(f); +} +static NOINLINE B wrap_decompose(B x, B raw) { + B d0 = TI(raw,decompose)(incG(raw)); + B type = IGetU(d0,0); + decG(d0); + return m_hvec2(type, x); +} +static B wfn_decompose(B x) { return wrap_decompose(x, c(WFun,x)->v); } +static B wm1_decompose(B x) { return wrap_decompose(x, c(WMd1,x)->v); } +static B wm2_decompose(B x) { return wrap_decompose(x, c(WMd2,x)->v); } static B m1BI_d(B t, B f ) { return m_md1D(c(Md1,t), f ); } static B m2BI_d(B t, B f, B g) { return m_md2D(c(Md2,t), f, g); } void rtWrap_init(void) { - TIi(t_funWrap,visit) = wfn_visit; TIi(t_funWrap,identity) = wfn_identity; - TIi(t_md1Wrap,visit) = wm1_visit; TIi(t_md1Wrap,m1_d) = m1BI_d; - TIi(t_md2Wrap,visit) = wm2_visit; TIi(t_md2Wrap,m2_d) = m2BI_d; + TIi(t_funWrap,visit) = wfn_visit; TIi(t_funWrap,decompose) = wfn_decompose; TIi(t_funWrap,identity) = wfn_identity; + TIi(t_md1Wrap,visit) = wm1_visit; TIi(t_md1Wrap,decompose) = wm1_decompose; TIi(t_md1Wrap,m1_d) = m1BI_d; + TIi(t_md2Wrap,visit) = wm2_visit; TIi(t_md2Wrap,decompose) = wm2_decompose; TIi(t_md2Wrap,m2_d) = m2BI_d; TIi(t_funWrap,fn_uc1) = wfn_uc1; TIi(t_funWrap,fn_ucw) = wfn_ucw; TIi(t_md1Wrap,m1_uc1) = wm1_uc1;