@@ -670,11 +670,13 @@ abstract class AstCodeGenerator
670
670
List <w.ValueType > call (Reference target) {
671
671
final targetModule = translator.moduleForReference (target);
672
672
final isLocalModuleCall = targetModule == b.module;
673
+ final name = translator.functions.getFunctionName (target);
673
674
674
675
if (isLocalModuleCall) {
676
+ b.comment ('Direct call to $name ' );
675
677
return b.invoke (translator.directCallTarget (target));
676
678
} else {
677
- b.comment ('Indirect call to $target ' );
679
+ b.comment ('Direct call to $name (across modules) ' );
678
680
return translator.callReference (target, b);
679
681
}
680
682
}
@@ -1669,7 +1671,7 @@ abstract class AstCodeGenerator
1669
1671
translateExpression (node.receiver, signature.inputs.first),
1670
1672
(w.FunctionType signature, ParameterInfo paramInfo) {
1671
1673
_visitArguments (node.arguments, signature, paramInfo, 1 );
1672
- });
1674
+ }, useUncheckedEntry : useUncheckedEntry );
1673
1675
}
1674
1676
1675
1677
@override
@@ -1808,18 +1810,21 @@ abstract class AstCodeGenerator
1808
1810
}
1809
1811
}
1810
1812
1813
+ final useUncheckedEntry =
1814
+ translator.canUseUncheckedEntry (node.left, node);
1811
1815
if (singleTarget != null ) {
1812
1816
left ();
1813
1817
right ();
1814
1818
call (translator.getFunctionEntry (singleTarget.reference,
1815
- uncheckedEntry: translator. canUseUncheckedEntry (node, node.left) ));
1819
+ uncheckedEntry: useUncheckedEntry ));
1816
1820
} else {
1817
1821
_virtualCall (
1818
1822
node,
1819
1823
node.interfaceTarget,
1820
1824
_VirtualCallKind .Call ,
1821
1825
left,
1822
1826
right,
1827
+ useUncheckedEntry: useUncheckedEntry,
1823
1828
);
1824
1829
}
1825
1830
if (leftNullable || rightNullable) {
@@ -1853,33 +1858,34 @@ abstract class AstCodeGenerator
1853
1858
_VirtualCallKind kind,
1854
1859
void Function (w.FunctionType signature) pushReceiver,
1855
1860
void Function (w.FunctionType signature, ParameterInfo ) pushArguments,
1856
- {bool useUncheckedEntry = false }) {
1861
+ {required bool useUncheckedEntry}) {
1857
1862
assert (kind != _VirtualCallKind .Get || ! useUncheckedEntry);
1858
1863
SelectorInfo selector = translator.dispatchTable.selectorForTarget (
1859
1864
interfaceTarget.referenceAs (
1860
1865
getter: kind.isGetter, setter: kind.isSetter));
1866
+ final name = selector.entryPointName (useUncheckedEntry);
1861
1867
assert (selector.name == interfaceTarget.name.text);
1862
1868
1863
1869
pushReceiver (selector.signature);
1864
1870
1865
- if (selector.targetRanges.length == 1 ) {
1871
+ final targets = selector.targets (unchecked: useUncheckedEntry);
1872
+
1873
+ if (targets.targetRanges.length == 1 ) {
1866
1874
// TODO(natebiggs): Ensure dynamic modules exclude this.
1867
1875
1868
- assert (selector.staticDispatchRanges.length == 1 );
1869
- final target = translator.getFunctionEntry (
1870
- selector.targetRanges[0 ].target,
1871
- uncheckedEntry: useUncheckedEntry);
1876
+ assert (targets.staticDispatchRanges.length == 1 );
1877
+ final target = targets.targetRanges.single.target;
1872
1878
final signature = translator.signatureForDirectCall (target);
1873
1879
final paramInfo = translator.paramInfoForDirectCall (target);
1874
1880
pushArguments (signature, paramInfo);
1875
1881
return translator.outputOrVoid (call (target));
1876
1882
}
1877
1883
1878
- if (selector .targetRanges.isEmpty) {
1884
+ if (targets .targetRanges.isEmpty) {
1879
1885
// TODO(natebiggs): Ensure dynamic modules exclude this.
1880
1886
1881
1887
// Unreachable call
1882
- b.comment ("Virtual call of ${ selector . name } with no targets"
1888
+ b.comment ("Virtual call of $name with no targets"
1883
1889
" at ${node .location }" );
1884
1890
pushArguments (selector.signature, selector.paramInfo);
1885
1891
for (int i = 0 ; i < selector.signature.inputs.length; ++ i) {
@@ -1897,16 +1903,18 @@ abstract class AstCodeGenerator
1897
1903
b.local_tee (receiverVar);
1898
1904
pushArguments (selector.signature, selector.paramInfo);
1899
1905
1900
- if (selector .staticDispatchRanges.isNotEmpty) {
1906
+ if (targets .staticDispatchRanges.isNotEmpty) {
1901
1907
// TODO(natebiggs): Ensure dynamic modules exclude this.
1902
1908
1903
1909
b.invoke (translator
1904
1910
.getPolymorphicDispatchersForModule (b.module)
1905
- .getPolymorphicDispatcher (selector));
1911
+ .getPolymorphicDispatcher (selector,
1912
+ useUncheckedEntry: useUncheckedEntry));
1906
1913
} else {
1907
- b.comment ("Instance $kind of '${ selector . name } '" );
1914
+ b.comment ("Instance $kind of '$name '" );
1908
1915
b.local_get (receiverVar);
1909
- translator.callDispatchTable (b, selector);
1916
+ translator.callDispatchTable (b, selector,
1917
+ useUncheckedEntry: useUncheckedEntry);
1910
1918
}
1911
1919
1912
1920
return translator.outputOrVoid (selector.signature.outputs);
@@ -2039,7 +2047,7 @@ abstract class AstCodeGenerator
2039
2047
w.Label nullLabel = b.block ();
2040
2048
translateExpression (node.receiver, translator.topInfo.nullableType);
2041
2049
b.br_on_null (nullLabel);
2042
- }, (_, __) {});
2050
+ }, (_, __) {}, useUncheckedEntry : false );
2043
2051
b.br (doneLabel);
2044
2052
b.end (); // nullLabel
2045
2053
switch (target.name.text) {
@@ -2069,7 +2077,8 @@ abstract class AstCodeGenerator
2069
2077
_VirtualCallKind .Get ,
2070
2078
(signature) =>
2071
2079
translateExpression (node.receiver, signature.inputs.first),
2072
- (_, __) {});
2080
+ (_, __) {},
2081
+ useUncheckedEntry: false );
2073
2082
}
2074
2083
}
2075
2084
@@ -2181,7 +2190,7 @@ abstract class AstCodeGenerator
2181
2190
b.br_on_null (nullLabel);
2182
2191
translator.convertType (
2183
2192
b, translator.topInfo.nullableType, signature.inputs[0 ]);
2184
- }, (_, __) {});
2193
+ }, (_, __) {}, useUncheckedEntry : false );
2185
2194
b.br (doneLabel);
2186
2195
b.end (); // nullLabel
2187
2196
switch (target.name.text) {
@@ -2212,7 +2221,8 @@ abstract class AstCodeGenerator
2212
2221
_VirtualCallKind .Get ,
2213
2222
(signature) =>
2214
2223
translateExpression (node.receiver, signature.inputs.first),
2215
- (_, __) {});
2224
+ (_, __) {},
2225
+ useUncheckedEntry: false );
2216
2226
}
2217
2227
2218
2228
@override
@@ -3187,13 +3197,13 @@ CodeGenerator? getInlinableMemberCodeGenerator(Translator translator,
3187
3197
3188
3198
class SynchronousProcedureCodeGenerator extends AstCodeGenerator {
3189
3199
final Procedure member;
3190
- final SynchronousProcedureKind kind;
3200
+ final EntryPoint kind;
3191
3201
3192
3202
SynchronousProcedureCodeGenerator (Translator translator,
3193
3203
w.FunctionType functionType, this .member, this .kind)
3194
3204
: super (translator, functionType, member) {
3195
- assert (! translator. needToCheckTypesFor (member) ||
3196
- kind != SynchronousProcedureKind .normal);
3205
+ assert (
3206
+ ! translator. needToCheckTypesFor (member) || kind != EntryPoint .normal);
3197
3207
}
3198
3208
3199
3209
@override
@@ -3216,16 +3226,16 @@ class SynchronousProcedureCodeGenerator extends AstCodeGenerator {
3216
3226
closures = translator.getClosures (member);
3217
3227
3218
3228
switch (kind) {
3219
- case SynchronousProcedureKind .normal:
3229
+ case EntryPoint .normal:
3220
3230
b.comment ('Normal Entry' );
3221
3231
_makeNonMultiEntryPointFunction ();
3222
- case SynchronousProcedureKind .checked:
3232
+ case EntryPoint .checked:
3223
3233
b.comment ('Checked Entry' );
3224
3234
_makeMultipleEntryPoint (true );
3225
- case SynchronousProcedureKind .unchecked:
3235
+ case EntryPoint .unchecked:
3226
3236
b.comment ('Unchecked Entry' );
3227
3237
_makeMultipleEntryPoint (false );
3228
- case SynchronousProcedureKind .body:
3238
+ case EntryPoint .body:
3229
3239
b.comment ('Body for Checked & Unchecked Entry' );
3230
3240
_makeMultipleEntryPointSharedBody ();
3231
3241
break ;
0 commit comments