[CFE] Reproduction and fix of duplicate string-named 'abstract member-signature'

Before this CL, the map we use to "reuse" references when doing
experimental invalidation mapped from String to Reference.
In bug #44523 two abstract member-signatures have the same textual
(String) name meaning that via the lookup one would get the correct
one, one would get the wrong one, they would get the same one
which eventually causes a crash when trying to serialize.

This CL fixes the issue by mapping via the Name instead, which
basically - for private names - wraps the name and the library
which disambiguates it.

This CL also includes the reproduction of #44523.

Fixes #44523.

TEST=Mostly relying on existing test coverage.

Change-Id: Ib62ebca0b7f5092f0b8410d3c458663c3032eca1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177704
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Jens Johansen 2021-01-07 13:11:18 +00:00 committed by commit-bot@chromium.org
parent 51674dea10
commit 5fac8d3d71
14 changed files with 253 additions and 81 deletions

View file

@ -17,6 +17,7 @@ import 'package:kernel/ast.dart'
IntLiteral,
InterfaceType,
ListLiteral,
Name,
ProcedureKind,
PropertyGet,
Reference,
@ -181,21 +182,24 @@ class EnumBuilder extends SourceClassBuilder {
Reference valuesGetterReference;
Reference valuesSetterReference;
if (referencesFrom != null) {
constructorReference = referencesFromIndexed.lookupConstructor("");
constructorReference =
referencesFromIndexed.lookupConstructor(new Name(""));
toStringReference =
referencesFromIndexed.lookupGetterReference("toString");
referencesFromIndexed.lookupGetterReference(new Name("toString"));
Name indexName = new Name("index");
indexGetterReference =
referencesFromIndexed.lookupGetterReference("index");
referencesFromIndexed.lookupGetterReference(indexName);
indexSetterReference =
referencesFromIndexed.lookupSetterReference("index");
_nameGetterReference =
referencesFromIndexed.lookupGetterReference("_name");
_nameSetterReference =
referencesFromIndexed.lookupSetterReference("_name");
referencesFromIndexed.lookupSetterReference(indexName);
_nameGetterReference = referencesFromIndexed.lookupGetterReference(
new Name("_name", referencesFromIndexed.library));
_nameSetterReference = referencesFromIndexed.lookupSetterReference(
new Name("_name", referencesFromIndexed.library));
Name valuesName = new Name("values");
valuesGetterReference =
referencesFromIndexed.lookupGetterReference("values");
referencesFromIndexed.lookupGetterReference(valuesName);
valuesSetterReference =
referencesFromIndexed.lookupSetterReference("values");
referencesFromIndexed.lookupSetterReference(valuesName);
}
members["index"] = new SourceFieldBuilder(
@ -309,10 +313,15 @@ class EnumBuilder extends SourceClassBuilder {
name.length,
parent.fileUri);
}
Reference getterReference =
referencesFromIndexed?.lookupGetterReference(name);
Reference setterReference =
referencesFromIndexed?.lookupSetterReference(name);
Reference getterReference;
Reference setterReference;
if (referencesFromIndexed != null) {
Name nameName = new Name(name, referencesFromIndexed.library);
getterReference =
referencesFromIndexed.lookupGetterReference(nameName);
setterReference =
referencesFromIndexed.lookupSetterReference(nameName);
}
FieldBuilder fieldBuilder = new SourceFieldBuilder(
metadata,
selfType,

View file

@ -510,8 +510,8 @@ abstract class CombinedMemberSignatureBase<T> {
Class enclosingClass = classBuilder.cls;
Reference reference;
if (classBuilder.referencesFromIndexed != null) {
reference = classBuilder.referencesFromIndexed
.lookupGetterReference(member.name.text);
reference =
classBuilder.referencesFromIndexed.lookupGetterReference(member.name);
}
Uri fileUri;
int startFileOffset;
@ -556,8 +556,8 @@ abstract class CombinedMemberSignatureBase<T> {
Class enclosingClass = classBuilder.cls;
Reference reference;
if (classBuilder.referencesFromIndexed != null) {
reference = classBuilder.referencesFromIndexed
.lookupSetterReference(member.name.text);
reference =
classBuilder.referencesFromIndexed.lookupSetterReference(member.name);
}
Uri fileUri;
int startFileOffset;
@ -599,7 +599,7 @@ abstract class CombinedMemberSignatureBase<T> {
assert(copyLocation != null);
Class enclosingClass = classBuilder.cls;
Reference reference = classBuilder.referencesFromIndexed
?.lookupGetterReference(procedure.name.text);
?.lookupGetterReference(procedure.name);
Uri fileUri;
int startFileOffset;
int fileOffset;

View file

@ -640,7 +640,7 @@ class KernelTarget extends TargetImplementation {
IndexedClass indexedClass = builder.referencesFromIndexed;
Constructor referenceFrom;
if (indexedClass != null) {
referenceFrom = indexedClass.lookupConstructor("");
referenceFrom = indexedClass.lookupConstructor(new Name(""));
}
/// From [Dart Programming Language Specification, 4th Edition](
@ -691,7 +691,7 @@ class KernelTarget extends TargetImplementation {
IndexedClass indexedClass = builder.referencesFromIndexed;
Constructor referenceFrom;
if (indexedClass != null) {
referenceFrom = indexedClass.lookupConstructor("");
referenceFrom = indexedClass.lookupConstructor(new Name(""));
}
if (supertype is ClassBuilder) {
@ -702,7 +702,8 @@ class KernelTarget extends TargetImplementation {
void addSyntheticConstructor(String name, MemberBuilder memberBuilder) {
if (memberBuilder.member is Constructor) {
substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls);
Constructor referenceFrom = indexedClass?.lookupConstructor(name);
Constructor referenceFrom = indexedClass
?.lookupConstructor(new Name(name, indexedClass.library));
builder.addSyntheticConstructor(_makeMixinApplicationConstructor(
builder,
builder.cls.mixin,

View file

@ -52,7 +52,7 @@ class LoadLibraryBuilder extends BuilderImpl {
String prefix = expression.import.name;
Name name = new Name('_#loadLibrary_$prefix', parent.library);
Reference reference =
parent.referencesFromIndexed?.lookupGetterReference(name.text);
parent.referencesFromIndexed?.lookupGetterReference(name);
tearoff = new Procedure(
name,
ProcedureKind.Method,

View file

@ -908,8 +908,9 @@ class SourceClassBuilder extends ClassBuilderImpl
// is actually in the kernel tree. This call creates a StaticGet
// to [declaration.target] in a field `_redirecting#` which is
// only legal to do to things in the kernel tree.
Reference getterReference = referencesFromIndexed
?.lookupGetterReference("_redirecting#");
Reference getterReference =
referencesFromIndexed?.lookupGetterReference(new Name(
"_redirecting#", referencesFromIndexed.library));
_addRedirectingConstructor(
declaration, library, getterReference);
}

View file

@ -979,9 +979,10 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
library.procedures.sort(compareProcedures);
if (unserializableExports != null) {
Name fieldName = new Name("_exports#", library);
Reference getterReference =
referencesFromIndexed?.lookupGetterReference("_exports#");
library.addField(new Field.immutable(new Name("_exports#", library),
referencesFromIndexed?.lookupGetterReference(fieldName);
library.addField(new Field.immutable(fieldName,
initializer: new StringLiteral(jsonEncode(unserializableExports)),
isStatic: true,
isConst: true,
@ -2170,10 +2171,11 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
isSynthesized: fieldIsLateWithLowering);
IndexedContainer indexedContainer =
_currentClassReferencesFromIndexed ?? referencesFromIndexed;
Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
fieldGetterReference =
indexedContainer.lookupGetterReference(nameToLookup);
indexedContainer.lookupGetterReference(nameToLookupName);
fieldSetterReference =
indexedContainer.lookupSetterReference(nameToLookup);
indexedContainer.lookupSetterReference(nameToLookupName);
if (fieldIsLateWithLowering) {
String lateIsSetName = SourceFieldBuilder.createFieldName(
FieldNameType.IsSetField, name,
@ -2182,24 +2184,28 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering);
Name lateIsSetNameName =
new Name(lateIsSetName, indexedContainer.library);
lateIsSetGetterReference =
indexedContainer.lookupGetterReference(lateIsSetName);
indexedContainer.lookupGetterReference(lateIsSetNameName);
lateIsSetSetterReference =
indexedContainer.lookupSetterReference(lateIsSetName);
getterReference = indexedContainer.lookupGetterReference(
indexedContainer.lookupSetterReference(lateIsSetNameName);
getterReference = indexedContainer.lookupGetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering));
setterReference = indexedContainer.lookupSetterReference(
isSynthesized: fieldIsLateWithLowering),
indexedContainer.library));
setterReference = indexedContainer.lookupSetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering));
isSynthesized: fieldIsLateWithLowering),
indexedContainer.library));
}
}
@ -2252,8 +2258,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
MetadataCollector metadataCollector = loader.target.metadataCollector;
Constructor referenceFrom;
if (_currentClassReferencesFromIndexed != null) {
referenceFrom =
_currentClassReferencesFromIndexed.lookupConstructor(constructorName);
referenceFrom = _currentClassReferencesFromIndexed.lookupConstructor(
new Name(
constructorName, _currentClassReferencesFromIndexed.library));
}
ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
metadata,
@ -2323,10 +2330,12 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
if (_currentClassReferencesFromIndexed != null) {
if (kind == ProcedureKind.Setter) {
procedureReference =
_currentClassReferencesFromIndexed.lookupSetterReference(name);
_currentClassReferencesFromIndexed.lookupSetterReference(
new Name(name, _currentClassReferencesFromIndexed.library));
} else {
procedureReference =
_currentClassReferencesFromIndexed.lookupGetterReference(name);
_currentClassReferencesFromIndexed.lookupGetterReference(
new Name(name, _currentClassReferencesFromIndexed.library));
}
} else {
if (currentTypeParameterScopeBuilder.kind ==
@ -2339,11 +2348,11 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
currentTypeParameterScopeBuilder.name,
name);
if (extensionIsStatic && kind == ProcedureKind.Setter) {
procedureReference =
referencesFromIndexed.lookupSetterReference(nameToLookup);
procedureReference = referencesFromIndexed.lookupSetterReference(
new Name(nameToLookup, referencesFromIndexed.library));
} else {
procedureReference =
referencesFromIndexed.lookupGetterReference(nameToLookup);
procedureReference = referencesFromIndexed.lookupGetterReference(
new Name(nameToLookup, referencesFromIndexed.library));
}
if (kind == ProcedureKind.Method) {
String tearOffNameToLookup =
@ -2353,16 +2362,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
ProcedureKind.Getter,
currentTypeParameterScopeBuilder.name,
name);
tearOffReference = referencesFromIndexed
.lookupGetterReference(tearOffNameToLookup);
tearOffReference = referencesFromIndexed.lookupGetterReference(
new Name(tearOffNameToLookup, referencesFromIndexed.library));
}
} else {
if (kind == ProcedureKind.Setter) {
procedureReference =
referencesFromIndexed.lookupSetterReference(name);
procedureReference = referencesFromIndexed.lookupSetterReference(
new Name(name, referencesFromIndexed.library));
} else {
procedureReference =
referencesFromIndexed.lookupGetterReference(name);
procedureReference = referencesFromIndexed.lookupGetterReference(
new Name(name, referencesFromIndexed.library));
}
}
}
@ -2427,8 +2436,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
procedureName = name;
}
Reference reference = _currentClassReferencesFromIndexed
?.lookupGetterReference(procedureName);
Reference reference =
_currentClassReferencesFromIndexed?.lookupGetterReference(new Name(
procedureName, _currentClassReferencesFromIndexed.library));
ProcedureBuilder procedureBuilder;
if (redirectionTarget != null) {

View file

@ -701,20 +701,20 @@ class TestMinimizer {
// TODO(jensj): don't use full uris.
print("""
# Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE.md file.
# Reproduce a crash.
type: newworld""");
# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE.md file.
# Reproduce a crash.
type: newworld""");
if (_settings.widgetTransformation) {
print("trackWidgetCreation: true");
print("target: DDC # basically needed for widget creation to be run");
}
print("""
worlds:
- entry: $_mainUri""");
worlds:
- entry: $_mainUri""");
if (_settings.experimentalInvalidation) {
print(" experiments: alternative-invalidation-strategy");
}

View file

@ -0,0 +1,44 @@
# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE.md file.
# Reproduce a crash.
type: newworld
worlds:
- entry: app/main.dart
experiments: alternative-invalidation-strategy
sources:
app/.dart_tool/package_config.json: |
{
"configVersion": 2,
"packages": [
{
"name": "flutter",
"rootUri": "../../flutter",
"languageVersion": "2.12"
}
]
}
app/main.dart: |
import "package:flutter/lib1.dart";
class _Bar extends RestorableProperty {}
flutter/lib1.dart: |
import "lib2.dart";
abstract class RestorableProperty extends ChangeNotifier {
bool _debugAssertNotDisposed() { return true; }
}
flutter/lib2.dart: |
class ChangeNotifier {
bool _debugAssertNotDisposed() { return true; }
}
expectedLibraryCount: 3
- entry: app/main.dart
experiments: alternative-invalidation-strategy
worldType: updated
expectInitializeFromDill: false
invalidate:
- app/main.dart
expectedLibraryCount: 3
expectsRebuildBodiesOnly: true

View file

@ -0,0 +1,47 @@
main = <No Member>;
library from "org-dartlang-test:///app/main.dart" as main {
import "package:flutter/lib1.dart";
class _Bar extends lib1::RestorableProperty {
synthetic constructor •() → main::_Bar*
: super lib1::RestorableProperty::•()
;
abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
}
library from "package:flutter/lib1.dart" as lib1 {
import "package:flutter/lib2.dart";
abstract class RestorableProperty extends lib2::ChangeNotifier {
synthetic constructor •() → lib1::RestorableProperty
: super lib2::ChangeNotifier::•()
;
method _debugAssertNotDisposed() → dart.core::bool {
return true;
}
}
}
library from "package:flutter/lib2.dart" as lib2 {
class ChangeNotifier extends dart.core::Object {
synthetic constructor •() → lib2::ChangeNotifier
: super dart.core::Object::•()
;
method _debugAssertNotDisposed() → dart.core::bool {
return true;
}
}
}

View file

@ -0,0 +1,47 @@
main = <No Member>;
library from "org-dartlang-test:///app/main.dart" as main {
import "package:flutter/lib1.dart";
class _Bar extends lib1::RestorableProperty {
synthetic constructor •() → main::_Bar*
: super lib1::RestorableProperty::•()
;
abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
}
library from "package:flutter/lib1.dart" as lib1 {
import "package:flutter/lib2.dart";
abstract class RestorableProperty extends lib2::ChangeNotifier {
synthetic constructor •() → lib1::RestorableProperty
: super lib2::ChangeNotifier::•()
;
method _debugAssertNotDisposed() → dart.core::bool {
return true;
}
}
}
library from "package:flutter/lib2.dart" as lib2 {
class ChangeNotifier extends dart.core::Object {
synthetic constructor •() → lib2::ChangeNotifier
: super dart.core::Object::•()
;
method _debugAssertNotDisposed() → dart.core::bool {
return true;
}
}
}

View file

@ -9,6 +9,7 @@ import "ast.dart"
Extension,
Field,
Library,
Name,
Reference,
Procedure,
Typedef;
@ -28,19 +29,23 @@ class ReferenceFromIndex {
}
abstract class IndexedContainer {
final Map<String, Reference> _getterReferences = new Map<String, Reference>();
final Map<String, Reference> _setterReferences = new Map<String, Reference>();
final Map<Name, Reference> _getterReferences = new Map<Name, Reference>();
final Map<Name, Reference> _setterReferences = new Map<Name, Reference>();
Reference lookupGetterReference(String name) => _getterReferences[name];
Reference lookupSetterReference(String name) => _setterReferences[name];
Reference lookupGetterReference(Name name) => _getterReferences[name];
Reference lookupSetterReference(Name name) => _setterReferences[name];
Library get library;
void _addProcedures(List<Procedure> procedures) {
for (int i = 0; i < procedures.length; i++) {
Procedure procedure = procedures[i];
String name = procedure.name.text;
Name name = procedure.name;
if (procedure.isSetter) {
assert(_setterReferences[name] == null);
_setterReferences[name] = procedure.reference;
} else {
assert(_getterReferences[name] == null);
_getterReferences[name] = procedure.reference;
}
}
@ -49,9 +54,11 @@ abstract class IndexedContainer {
void _addFields(List<Field> fields) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String name = field.name.text;
Name name = field.name;
assert(_getterReferences[name] == null);
_getterReferences[name] = field.getterReference;
if (field.hasSetter) {
assert(_setterReferences[name] == null);
_setterReferences[name] = field.setterReference;
}
}
@ -64,19 +71,24 @@ class IndexedLibrary extends IndexedContainer {
final Map<String, IndexedClass> _indexedClasses =
new Map<String, IndexedClass>();
final Map<String, Extension> _extensions = new Map<String, Extension>();
final Library library;
IndexedLibrary(Library library) {
IndexedLibrary(this.library) {
for (int i = 0; i < library.typedefs.length; i++) {
Typedef typedef = library.typedefs[i];
assert(_typedefs[typedef.name] == null);
_typedefs[typedef.name] = typedef;
}
for (int i = 0; i < library.classes.length; i++) {
Class c = library.classes[i];
assert(_classes[c.name] == null);
_classes[c.name] = c;
_indexedClasses[c.name] = new IndexedClass._(c);
assert(_indexedClasses[c.name] == null);
_indexedClasses[c.name] = new IndexedClass._(c, library);
}
for (int i = 0; i < library.extensions.length; i++) {
Extension extension = library.extensions[i];
assert(_extensions[extension.name] == null);
_extensions[extension.name] = extension;
}
_addProcedures(library.procedures);
@ -90,16 +102,17 @@ class IndexedLibrary extends IndexedContainer {
}
class IndexedClass extends IndexedContainer {
final Map<String, Constructor> _constructors = new Map<String, Constructor>();
final Map<Name, Constructor> _constructors = new Map<Name, Constructor>();
final Library library;
IndexedClass._(Class c) {
IndexedClass._(Class c, this.library) {
for (int i = 0; i < c.constructors.length; i++) {
Constructor constructor = c.constructors[i];
_constructors[constructor.name.text] = constructor;
_constructors[constructor.name] = constructor;
}
_addProcedures(c.procedures);
_addFields(c.fields);
}
Constructor lookupConstructor(String name) => _constructors[name];
Constructor lookupConstructor(Name name) => _constructors[name];
}

View file

@ -119,9 +119,9 @@ class MixinFullResolution {
for (var field in class_.mixin.fields) {
Reference getterReference =
indexedClass?.lookupGetterReference(field.name.text);
indexedClass?.lookupGetterReference(field.name);
Reference setterReference =
indexedClass?.lookupSetterReference(field.name.text);
indexedClass?.lookupSetterReference(field.name);
if (getterReference == null) {
getterReference = nonSetters[field.name]?.reference;
getterReference?.canonicalName?.unbind();
@ -166,9 +166,9 @@ class MixinFullResolution {
Reference reference;
if (procedure.isSetter) {
reference = indexedClass?.lookupSetterReference(procedure.name.text);
reference = indexedClass?.lookupSetterReference(procedure.name);
} else {
reference = indexedClass?.lookupGetterReference(procedure.name.text);
reference = indexedClass?.lookupGetterReference(procedure.name);
}
// Linear search for a forwarding stub with the same name.

View file

@ -343,7 +343,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
// C.#fromTypedDataBase(Object address) : super.fromPointer(address);
final VariableDeclaration pointer = new VariableDeclaration("#pointer");
final name = Name("#fromTypedDataBase");
final referenceFrom = indexedClass?.lookupConstructor(name.text);
final referenceFrom = indexedClass?.lookupConstructor(name);
final Constructor ctor = Constructor(
FunctionNode(EmptyStatement(), positionalParameters: [pointer]),
name: name,
@ -676,7 +676,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
final Procedure getter = Procedure(field.name, ProcedureKind.Getter,
FunctionNode(getterStatement, returnType: field.type),
fileUri: field.fileUri,
reference: indexedClass?.lookupGetterReference(field.name.text))
reference: indexedClass?.lookupGetterReference(field.name))
..fileOffset = field.fileOffset
..isNonNullableByDefault = field.isNonNullableByDefault;
@ -693,7 +693,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
FunctionNode(setterStatement,
returnType: VoidType(), positionalParameters: [argument]),
fileUri: field.fileUri,
reference: indexedClass?.lookupSetterReference(field.name.text))
reference: indexedClass?.lookupSetterReference(field.name))
..fileOffset = field.fileOffset
..isNonNullableByDefault = field.isNonNullableByDefault;
}
@ -709,7 +709,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
void _replaceSizeOfMethod(
Class struct, Map<Abi, int> sizes, IndexedClass indexedClass) {
var name = Name("#sizeOf");
var getterReference = indexedClass?.lookupGetterReference(name.text);
var getterReference = indexedClass?.lookupGetterReference(name);
final Field sizeOf = Field.immutable(name,
isStatic: true,
isFinal: true,

View file

@ -337,7 +337,7 @@ class _FfiUseSiteTransformer extends FfiTransformer {
final nativeFunctionType = InterfaceType(
nativeFunctionClass, Nullability.legacy, node.arguments.types);
var name = Name("_#ffiCallback${callbackCount++}", currentLibrary);
var getterReference = currentLibraryIndex?.lookupGetterReference(name.text);
var getterReference = currentLibraryIndex?.lookupGetterReference(name);
final Field field = Field.immutable(name,
type: InterfaceType(
pointerClass, Nullability.legacy, [nativeFunctionType]),