[vm] Cast function calls and handlers to avoid dynamic calls vm core library.

TEST=With prior tests. No new behaviour besides changing up the tree-shaking for some things due to the removal of dynamic.

Change-Id: Ib8a0fe893bf5ea7069f1eea37ed5c6508661ca38
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/265962
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
This commit is contained in:
Kallen Tu
2022-11-01 21:09:19 +00:00
committed by Commit Queue
parent b591fc9d2c
commit cbcf0609d1
5 changed files with 11 additions and 15 deletions
@@ -19,7 +19,7 @@ class A1 extends core::Object {
synthetic constructor •() → self::A1
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method call([dynamic a1 = #C1, dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method call([[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1] dynamic a5 = #C1]) → void {
[@vm.direct-call.metadata=#lib::A1.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A1::foo} = _in::unsafeCast<self::T1?>(a5);
}
}
@@ -42,7 +42,7 @@ class A2 extends core::Object {
synthetic constructor •() → self::A2
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method call([dynamic a1 = #C1, dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method call([[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 5)] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2] dynamic a6 = #C1]) → void {
[@vm.direct-call.metadata=#lib::A2.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A2::foo} = a6;
}
}
@@ -75,7 +75,7 @@ class A3 extends core::Object {
synthetic constructor •() → self::A3
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:24,getterSelectorId:25] method call([dynamic a1 = #C1, dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:24,getterSelectorId:25] method call([[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 5)] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 6)] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3] dynamic a7 = #C1]) → void {
[@vm.direct-call.metadata=#lib::A3.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A3::foo} = a7;
}
}
@@ -98,7 +98,7 @@ class A4 extends core::Object {
synthetic constructor •() → self::A4
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:32,getterSelectorId:33] method call([dynamic a1 = #C1, dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:32,getterSelectorId:33] method call([[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 5)] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 6)] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 7)] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4] dynamic a8 = #C1]) → void {
[@vm.direct-call.metadata=#lib::A4.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A4::foo} = a8;
}
}
+2 -2
View File
@@ -59,10 +59,10 @@ class _AssertionError extends Error implements AssertionError {
return condition;
}
if (condition is _Closure) {
return (condition as dynamic)();
return (condition as dynamic Function())();
}
if (condition is Function) {
condition = condition();
condition = (condition as dynamic Function())();
}
return condition;
}
+3 -3
View File
@@ -190,7 +190,7 @@ class _RawReceivePortImpl implements RawReceivePort {
// TODO(floitsch): this relies on the fact that any exception aborts the
// VM. Once we have non-fatal global exceptions we need to catch errors
// so that we can run the immediate callbacks.
handler(message);
(handler as Function)(message);
_runPendingImmediateCallback();
return handler;
}
@@ -291,9 +291,9 @@ void _delayEntrypointInvocation(Function entryPoint, List<String>? args,
port.close();
if (allowZeroOneOrTwoArgs) {
if (entryPoint is _BinaryFunction) {
(entryPoint as dynamic)(args, message);
(entryPoint as Function)(args, message);
} else if (entryPoint is _UnaryFunction) {
(entryPoint as dynamic)(args);
(entryPoint as Function)(args);
} else {
entryPoint();
}
@@ -27,9 +27,7 @@ testMessageCall() {
try {
call_with_bar(new Callable());
} catch (e) {
final noMatchingArgs =
"has no instance method 'call' with matching arguments";
Expect.isTrue(e.toString().contains(noMatchingArgs));
Expect.isTrue(e.toString().contains("has no instance method 'call'"));
}
}
@@ -29,9 +29,7 @@ testMessageCall() {
try {
call_with_bar(new Callable());
} catch (e) {
final noMatchingArgs =
"has no instance method 'call' with matching arguments";
Expect.isTrue(e.toString().contains(noMatchingArgs));
Expect.isTrue(e.toString().contains("has no instance method 'call'"));
}
}