Skip to content

Commit

Permalink
[kernel] Introduce 'forwardingStubInterfaceTarget' field for Procedures.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
sjindel-google authored and commit-bot@chromium.org committed Jan 11, 2018
1 parent e9daa98 commit 96381b7
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 2 deletions.
1 change: 1 addition & 0 deletions pkg/kernel/binary.md
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ type Procedure extends Member {
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;
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/kernel/lib/ast.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1491,6 +1491,7 @@ class Procedure extends Member implements FileUriNode {
Uri fileUri;

Reference forwardingStubSuperTarget;
Reference forwardingStubInterfaceTarget;

Procedure(Name name, this.kind, this.function,
{bool isAbstract: false,
Expand All @@ -1502,7 +1503,8 @@ class Procedure extends Member implements FileUriNode {
int transformerFlags: 0,
this.fileUri,
Reference reference,
this.forwardingStubSuperTarget})
this.forwardingStubSuperTarget,
this.forwardingStubInterfaceTarget})
: super(name, reference) {
function?.parent = this;
this.isAbstract = isAbstract;
Expand Down
3 changes: 3 additions & 0 deletions pkg/kernel/lib/binary/ast_from_binary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,8 @@ class BinaryBuilder {
_disableLazyReading;
var forwardingStubSuperTarget =
readAndCheckOptionTag() ? readMemberReference() : null;
var forwardingStubInterfaceTarget =
readAndCheckOptionTag() ? readMemberReference() : null;
var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
var transformerFlags = getAndResetTransformerFlags();
assert(((_) => true)(debugPath.removeLast()));
Expand All @@ -947,6 +949,7 @@ class BinaryBuilder {
function?.parent = node;
node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
node.forwardingStubSuperTarget = forwardingStubSuperTarget;
node.forwardingStubInterfaceTarget = forwardingStubInterfaceTarget;

assert((node.forwardingStubSuperTarget != null) ||
!(node.isForwardingStub && node.function.body != null));
Expand Down
1 change: 1 addition & 0 deletions pkg/kernel/lib/binary/ast_to_binary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -766,6 +766,7 @@ class BinaryPrinter extends Visitor implements BinarySink {
writeUriReference(node.fileUri);
writeAnnotationList(node.annotations);
writeOptionalReference(node.forwardingStubSuperTarget);
writeOptionalReference(node.forwardingStubInterfaceTarget);
writeOptionalNode(node.function);
_variableIndexer = null;

Expand Down
3 changes: 2 additions & 1 deletion pkg/kernel/lib/clone.dart
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,8 @@ class CloneVisitor extends TreeVisitor {
isForwardingSemiStub: node.isForwardingSemiStub,
transformerFlags: node.transformerFlags,
fileUri: node.fileUri,
forwardingStubSuperTarget: node.forwardingStubSuperTarget)
forwardingStubSuperTarget: node.forwardingStubSuperTarget,
forwardingStubInterfaceTarget: node.forwardingStubInterfaceTarget)
..fileEndOffset = node.fileEndOffset
..isGenericContravariant = node.isGenericContravariant;
}
Expand Down
5 changes: 5 additions & 0 deletions runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,11 @@ void ProcedureHelper::ReadUntilExcluding(Field field) {
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.
Expand Down
1 change: 1 addition & 0 deletions runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ class ProcedureHelper {
kSourceUriIndex,
kAnnotations,
kForwardingStubSuperTarget,
kForwardingStubInterfaceTarget,
kFunction,
kEnd,
};
Expand Down

0 comments on commit 96381b7

Please sign in to comment.