nimskull icon indicating copy to clipboard operation
nimskull copied to clipboard

vtable method dispatch

Open mrgaturus opened this issue 1 year ago • 8 comments

Nim is very good for creating gui toolkits (see: nimx, fidget, gintro, etc). but something that is very important for widget abstraction is dynamic dispatch. Currently Nim dynamic dispatch is done via methods but the implementation of method dispatch is awful, it uses many if conditionals to check what object is it and use found proc:

see an example of generated c code using a draw method:

N_LIB_PRIVATE N_NIMCALL(void, draw__guiZwidget_203)(tyObject_GUIWidgetcolonObjectType___ZRFOxOUn9a9bQzHUbo9cYJ7Ag* widget, tyObject_CTXRender__XuHS9afmCdZYoNHhDdMMwTw* ctx) {
	chckNilDisp(widget);
	{
		if (!((widget) && ((*widget).m_type == (&NTIguicolorbar58objecttype__7ykwpVETdTqIc20VQxXpNA_)))) goto LA3_;
		draw__guiZwidgetsZcolor_79(((tyObject_GUIColorBarcolonObjectType___7ykwpVETdTqIc20VQxXpNA*) (widget)), ctx);
	}
	goto LA1_;
	LA3_: ;
	{
		if (!((widget) && ((*widget).m_type == (&NTIguilabel58objecttype__1ZTrcZ3MmwrG316Q2g8ViQ_)))) goto LA6_;
		draw__guiZwidgetsZlabel_89(((tyObject_GUILabelcolonObjectType___1ZTrcZ3MmwrG316Q2g8ViQ*) (widget)), ctx);
	}
	goto LA1_;
	LA6_: ;
	{
		if (!((widget) && ((*widget).m_type == (&NTIguislider58objecttype__v9cI83xtHh31K2VaG8N7FPw_)))) goto LA9_;
		draw__guiZwidgetsZslider_46(((tyObject_GUISlidercolonObjectType___v9cI83xtHh31K2VaG8N7FPw*) (widget)), ctx);
	}
	goto LA1_;
	LA9_: ;
	{
		if (!((widget) && (isObjWithCache((*widget).m_type, (&NTIguicanvaspanel58objecttype__yhuZCP5SorEAwEVaKUlcOg_), Nim_OfCheck_CACHE56)))) goto LA12_;
		draw__npainter_272(((tyObject_GUICanvasPanelcolonObjectType___yhuZCP5SorEAwEVaKUlcOg*) (widget)), ctx);
	}
	goto LA1_;
	LA12_: ;
	{
		if (!((widget) && ((*widget).m_type == (&NTIguicanvas58objecttype__h3AjbyXWrHNbLXlmWjT38A_)))) goto LA15_;
		draw__npainter_268(((tyObject_GUICanvascolonObjectType___h3AjbyXWrHNbLXlmWjT38A*) (widget)), ctx);
	}
	goto LA1_;
	LA15_: ;
	{
		if (!((widget) && ((*widget).m_type == (&NTIguicheckbox58objecttype__9cvZWYvADYHtuPrnf3hbYWA_)))) goto LA18_;
		draw__guiZwidgetsZcheck_34(((tyObject_GUICheckBoxcolonObjectType___9cvZWYvADYHtuPrnf3hbYWA*) (widget)), ctx);
	}
	goto LA1_;
	LA18_: ;
	{
		if (!((widget) && ((*widget).m_type == (&NTIguiradio58objecttype__4tlER6RWs39aK1vcz1XXnOg_)))) goto LA21_;
		draw__guiZwidgetsZradio_36(((tyObject_GUIRadiocolonObjectType___4tlER6RWs39aK1vcz1XXnOg*) (widget)), ctx);
	}
       /* ............................................................... */
       /* And There Are More Conditionals for Other Widget Objects */
       /* ............................................................... */
}

Something that may stops Nim from implement vtable dispatch is keeping multi-methods, there is a possibility to keep multi methods combining vtable dispatch and those if conditionals

mrgaturus avatar Jan 29 '23 04:01 mrgaturus