[kernel] Introduce 'forwardingStubInterfaceTarget' field for Procedures.
First step in fixing issue #31519.
Change-Id: I8df86954993ae5edd59ad2edc57179725880c1d9
Reviewed-on: https://dart-review.googlesource.com/34143
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index f307f05..519bd6d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -356,6 +356,7 @@
List<Expression> annotations;
// Only present if the 'isForwardingStub' flag is set.
Option<MemberReference> forwardingStubSuperTarget;
+ Option<MemberReference> forwardingStubInterfaceTarget;
// Can only be absent if abstract, but tag is there anyway.
Option<FunctionNode> function;
}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 89a1643..eb61c33 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1491,6 +1491,7 @@
Uri fileUri;
Reference forwardingStubSuperTarget;
+ Reference forwardingStubInterfaceTarget;
Procedure(Name name, this.kind, this.function,
{bool isAbstract: false,
@@ -1502,7 +1503,8 @@
int transformerFlags: 0,
this.fileUri,
Reference reference,
- this.forwardingStubSuperTarget})
+ this.forwardingStubSuperTarget,
+ this.forwardingStubInterfaceTarget})
: super(name, reference) {
function?.parent = this;
this.isAbstract = isAbstract;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 83c5af1..d43b7ff 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -932,6 +932,8 @@
_disableLazyReading;
var forwardingStubSuperTarget =
readAndCheckOptionTag() ? readMemberReference() : null;
+ var forwardingStubInterfaceTarget =
+ readAndCheckOptionTag() ? readMemberReference() : null;
var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
var transformerFlags = getAndResetTransformerFlags();
assert(((_) => true)(debugPath.removeLast()));
@@ -947,6 +949,7 @@
function?.parent = node;
node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
node.forwardingStubSuperTarget = forwardingStubSuperTarget;
+ node.forwardingStubInterfaceTarget = forwardingStubInterfaceTarget;
assert((node.forwardingStubSuperTarget != null) ||
!(node.isForwardingStub && node.function.body != null));
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3d12707..ef1edea 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -766,6 +766,7 @@
writeUriReference(node.fileUri);
writeAnnotationList(node.annotations);
writeOptionalReference(node.forwardingStubSuperTarget);
+ writeOptionalReference(node.forwardingStubInterfaceTarget);
writeOptionalNode(node.function);
_variableIndexer = null;
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index e461650..1d0f38f 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -404,7 +404,8 @@
isForwardingSemiStub: node.isForwardingSemiStub,
transformerFlags: node.transformerFlags,
fileUri: node.fileUri,
- forwardingStubSuperTarget: node.forwardingStubSuperTarget)
+ forwardingStubSuperTarget: node.forwardingStubSuperTarget,
+ forwardingStubInterfaceTarget: node.forwardingStubInterfaceTarget)
..fileEndOffset = node.fileEndOffset
..isGenericContravariant = node.isGenericContravariant;
}
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index e37bd1c..b16c8f1 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -231,6 +231,11 @@
forwarding_stub_super_target_ = builder_->ReadCanonicalNameReference();
}
if (++next_read_ == field) return;
+ case kForwardingStubInterfaceTarget:
+ if (builder_->ReadTag() == kSomething) {
+ builder_->ReadCanonicalNameReference();
+ }
+ if (++next_read_ == field) return;
case kFunction:
if (builder_->ReadTag() == kSomething)
builder_->SkipFunctionNode(); // read function node.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 89b569f..9971757 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -246,6 +246,7 @@
kSourceUriIndex,
kAnnotations,
kForwardingStubSuperTarget,
+ kForwardingStubInterfaceTarget,
kFunction,
kEnd,
};