@@ -572,9 +572,10 @@ class DynamicModuleInfo {
572572 final mainSelector = translator.dynamicMainModuleDispatchTable!
573573 .selectorForTarget (reference);
574574 signature = _getGeneralizedSignature (mainSelector);
575- buildMain = buildSelectorBranch (reference, useUncheckedEntry, signature);
575+ buildMain =
576+ buildSelectorBranch (reference, useUncheckedEntry, mainSelector);
576577 buildDynamic =
577- buildSelectorBranch (reference, useUncheckedEntry, signature );
578+ buildSelectorBranch (reference, useUncheckedEntry, mainSelector );
578579
579580 _createUpdateableFunction (
580581 mainSelector.id + BuiltinUpdatableFunctions .values.length,
@@ -690,8 +691,6 @@ class DynamicModuleInfo {
690691
691692 // The shared entry point to this selector has to use 'any' because the
692693 // selector's signature may change between compilations.
693- // TODO(natebiggs): This doesn't account for overrides with extra
694- // parameters.
695694 final generalizedSignature = translator.typesBuilder.defineFunction ([
696695 ...signature.inputs.map ((e) => const w.RefType .any (nullable: true )),
697696 w.NumType .i32
@@ -701,26 +700,86 @@ class DynamicModuleInfo {
701700 return generalizedSignature;
702701 }
703702
704- void Function (w.FunctionBuilder ) buildSelectorBranch (Reference target,
705- bool useUncheckedEntry, w. FunctionType generalizedSignature ) {
703+ void Function (w.FunctionBuilder ) buildSelectorBranch (
704+ Reference target, bool useUncheckedEntry, SelectorInfo mainSelector ) {
706705 return (w.FunctionBuilder function) {
707- final selector = translator.dispatchTable.selectorForTarget (target);
708- final localSignature = selector .signature;
706+ final localSelector = translator.dispatchTable.selectorForTarget (target);
707+ final localSignature = localSelector .signature;
709708 final ib = function.body;
710709
711- final offset = selector .targets (unchecked: useUncheckedEntry).offset;
710+ final offset = localSelector .targets (unchecked: useUncheckedEntry).offset;
712711
713712 if (offset == null ) {
714713 ib.unreachable ();
715714 ib.end ();
716715 return ;
717716 }
718717
719- for (int i = 0 ; i < ib.locals.length - 1 ; i++ ) {
720- ib.local_get (ib.locals[i]);
721- translator.convertType (
722- ib, generalizedSignature.inputs[i], localSignature.inputs[i]);
718+ final generalizedMainSignature = _getGeneralizedSignature (mainSelector);
719+
720+ final mainParamInfo = mainSelector.paramInfo;
721+ final localParamInfo = localSelector.paramInfo;
722+
723+ assert (mainParamInfo.takesContextOrReceiver ==
724+ localParamInfo.takesContextOrReceiver);
725+
726+ int localsIndex = 0 ;
727+ final takesContextOrReceiver = localParamInfo.takesContextOrReceiver;
728+ if (takesContextOrReceiver) {
729+ ib.local_get (ib.locals[localsIndex]);
730+ translator.convertType (ib, generalizedMainSignature.inputs[localsIndex],
731+ localSignature.inputs[localsIndex]);
732+ localsIndex++ ;
733+ }
734+
735+ final mainTypeParamCount = mainParamInfo.typeParamCount;
736+ assert (mainTypeParamCount == localParamInfo.typeParamCount);
737+ for (int i = 0 ; i < mainTypeParamCount; i++ , localsIndex++ ) {
738+ ib.local_get (ib.locals[localsIndex]);
739+ translator.convertType (ib, generalizedMainSignature.inputs[localsIndex],
740+ localSignature.inputs[localsIndex]);
741+ }
742+
743+ final localPositionalCount = localParamInfo.positional.length;
744+ final mainPositionalCount = mainParamInfo.positional.length;
745+ assert (localPositionalCount >= mainPositionalCount);
746+
747+ for (int i = 0 ; i < localPositionalCount; i++ , localsIndex++ ) {
748+ if (i < mainPositionalCount) {
749+ ib.local_get (ib.locals[localsIndex]);
750+ translator.convertType (
751+ ib,
752+ generalizedMainSignature.inputs[localsIndex],
753+ localSignature.inputs[localsIndex]);
754+ continue ;
755+ }
756+ final constant = localParamInfo.positional[i]! ;
757+ translator.constants.instantiateConstant (
758+ ib, constant, localSignature.inputs[localsIndex]);
759+ }
760+
761+ final localNamedCount = localParamInfo.named.length;
762+ final mainNamedCount = mainParamInfo.named.length;
763+ assert (localNamedCount >= mainNamedCount);
764+
765+ for (int i = 0 ; i < localNamedCount; i++ , localsIndex++ ) {
766+ final name = localParamInfo.names[i];
767+ final mainIndex = mainParamInfo.nameIndex[name];
768+ if (mainIndex != null ) {
769+ final mainLocalIndex =
770+ (takesContextOrReceiver ? 1 : 0 ) + mainTypeParamCount + mainIndex;
771+ ib.local_get (ib.locals[mainLocalIndex]);
772+ translator.convertType (
773+ ib,
774+ generalizedMainSignature.inputs[mainLocalIndex],
775+ localSignature.inputs[localsIndex]);
776+ continue ;
777+ }
778+ final constant = localParamInfo.named[name]! ;
779+ translator.constants.instantiateConstant (
780+ ib, constant, localSignature.inputs[localsIndex]);
723781 }
782+
724783 ib.local_get (ib.locals.last);
725784 if (isDynamicModule) {
726785 translator.callReference (translator.scopeClassId.reference, ib);
@@ -732,7 +791,7 @@ class DynamicModuleInfo {
732791 final table = translator.dispatchTable.getWasmTable (ib.module);
733792 ib.call_indirect (localSignature, table);
734793 translator.convertType (ib, localSignature.outputs.single,
735- generalizedSignature .outputs.single);
794+ generalizedMainSignature .outputs.single);
736795 ib.end ();
737796 };
738797 }
@@ -778,9 +837,9 @@ class DynamicModuleInfo {
778837 _callClassIdBranch (key, useUncheckedEntry, b, generalizedSignature,
779838 name: '#s${mainModuleSelector .id }_${mainModuleSelector .name }' ,
780839 buildMainMatch: buildSelectorBranch (
781- interfaceTarget, useUncheckedEntry, generalizedSignature ),
840+ interfaceTarget, useUncheckedEntry, mainModuleSelector ),
782841 buildDynamicMatch: buildSelectorBranch (
783- interfaceTarget, useUncheckedEntry, generalizedSignature ),
842+ interfaceTarget, useUncheckedEntry, mainModuleSelector ),
784843 skipDynamic: translator.isDynamicModule &&
785844 selector
786845 .targets (unchecked: useUncheckedEntry)
0 commit comments