[vm,modular_aot] Dynamic calls

TEST=ci
Issue: https://github.com/dart-lang/sdk/issues/61635
Change-Id: I13eaccbefae4917500ee3aeb6a09d71f480a4c94
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/485560
Reviewed-by: Slava Egorov <vegorov@google.com>
This commit is contained in:
Alexander Markov
2026-03-05 15:51:29 -08:00
committed by Commit Queue
parent 8a6955a272
commit fd18bbb4a3
6 changed files with 156 additions and 59 deletions
+3 -1
View File
@@ -99,6 +99,7 @@ class ModuleSnapshot : public AllStatic {
kNewObjectTags,
kStaticFieldOffset,
kInterfaceCall,
kDynamicCall,
};
};
@@ -1183,7 +1184,8 @@ class ObjectPoolDeserializationCluster : public DeserializationCluster {
Smi::Value(field->untag()->host_offset_or_field_id()));
break;
}
case ModuleSnapshot::kInterfaceCall: {
case ModuleSnapshot::kInterfaceCall:
case ModuleSnapshot::kDynamicCall: {
pool->untag()->entry_bits()[j] = tagged_entry_bits;
UntaggedObjectPool::Entry& entry = pool->untag()->data()[j];
entry.raw_obj_ = d.ReadRef();
+24 -6
View File
@@ -14611,12 +14611,30 @@ void Library::CopyPragmas(const Library& old_lib) {
#endif // !defined(DART_PRECOMPILED_RUNTIME)
static bool ShouldBePrivate(const String& name) {
return (name.Length() >= 1 && name.CharAt(0) == '_') ||
(name.Length() >= 5 &&
(name.CharAt(4) == '_' &&
(name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
name.CharAt(1) == 'e' && name.CharAt(2) == 't' &&
name.CharAt(3) == ':'));
// _foo
if (name.Length() >= 1 && name.CharAt(0) == '_') {
return true;
}
// get:_foo, set:_foo or dyn:_foo
if (name.Length() >= 5 && name.CharAt(3) == ':' && name.CharAt(4) == '_') {
if ((name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
name.CharAt(1) == 'e' && name.CharAt(2) == 't') {
return true;
}
if (name.CharAt(0) == 'd' && name.CharAt(1) == 'y' &&
name.CharAt(2) == 'n') {
return true;
}
}
// dyn:get:_foo, dyn:set:_foo
if (name.Length() >= 9 && name.CharAt(0) == 'd' && name.CharAt(1) == 'y' &&
name.CharAt(2) == 'n' && name.CharAt(3) == ':' &&
(name.CharAt(4) == 'g' || name.CharAt(4) == 's') &&
name.CharAt(5) == 'e' && name.CharAt(6) == 't' && name.CharAt(7) == ':' &&
name.CharAt(8) == '_') {
return true;
}
return false;
}
void Library::RehashDictionary(const Array& old_dict,