Commit Graph

4770 Commits

Author SHA1 Message Date
Konstantin Shcheglov 8ea25ec10c Resynthesize deferred imports from Kernel.
R=brianwilkerson@google.com

Bug:
Change-Id: I6eca89aced40ccfca273152860dad2c5fdd3ddb5
Reviewed-on: https://dart-review.googlesource.com/5886
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-14 19:25:21 +00:00
Konstantin Shcheglov 2e7d54ae33 Refactor kernel shaker.
1. Make helper classes private to the library.

2. Merge RootsMarker into _RetainedDataBuilder.

3. Format and sort.

R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I87d9a553044de61d04600ef2e00081a58de2d92b
Reviewed-on: https://dart-review.googlesource.com/5882
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-14 18:31:51 +00:00
Dan Rubel d69a0aa3d5 revise parser to use handleNativeClause
modify the fasta parser to use handleNativeClause
when parsing methods with a native clause.

Change-Id: Ia631c471f9f8ea7a9e261d112a8ccd96f9eafa46
Reviewed-on: https://dart-review.googlesource.com/3786
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-09-14 13:25:48 +00:00
Konstantin Shcheglov 57dffcba43 Keep in outlines initializers of constant variables and fields/parameters that might affect constants.
I also changed the way to mark roots for outlines.
Actually for outline purposes we should handle included libraries in
the same way as not included, with only distinction that all of public
nodes are included. So, it is easier to visit them using cycles and
feed into RetainedDataBuilder.

R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I0dafad7572388de91f01e72f02599662e86f8759
Reviewed-on: https://dart-review.googlesource.com/5541
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-13 22:09:24 +00:00
Paul Berry ea50970060 In non-strong mode, only infer return types of function expressions, not local functions.
Change-Id: I7e1295f0244e1bd4b8556d49efa2f3b345404ed3
Reviewed-on: https://dart-review.googlesource.com/5502
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-13 21:50:20 +00:00
Paul Berry 70f2969b6c Create a uniform mechanism for finding the 'pkg' directory when running tests.
Several tests need to access source files in the 'pkg' directory, and
they use various mechanisms for finding it.  This CL changes
everything to use the same mechanism.

Change-Id: I146a6d72ec05a20cf07451a83eada9fb8e71a966
Reviewed-on: https://dart-review.googlesource.com/5484
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-13 20:05:40 +00:00
Sigmund Cherem 49d8c271cf Update comment in file_state (follow up from prior CL)
Change-Id: Ia9d6d26ff641bf8ac86afbb0885b08c6c92ddf0e
Reviewed-on: https://dart-review.googlesource.com/5500
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-13 19:34:24 +00:00
Paul Berry e386563b46 Fix annotation of call kinds for runtime checks.
A few corner cases weren't being handled correctly by the analyzer
code; some other corner cases weren't being handled correctly by the
front end.

Change-Id: I2b7153a411036541f48019757349b197f9b3bba7
Reviewed-on: https://dart-review.googlesource.com/5328
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-13 17:36:40 +00:00
Konstantin Shcheglov 2bb1f73406 Include annotations into shaken outputs.
I don't see the "annotations" field for VariableDeclaration, so
annotations for parameters are not included.

R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I3d53bf4e277b38e909172cd14f8d9107b4e4ee67
Reviewed-on: https://dart-review.googlesource.com/5296
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-13 16:44:40 +00:00
Paul Berry 8f1ca007f2 Fix type inference for const expressions.
The inferred types for const expressions shouldn't refer to type
variables that are in scope, because at runtime those type variables
may take on different values at different times (meaning the const
expression isn't actually const after all).

Test cases are in inference_new, since analyzer implements incorrect
behavior.

Fixes #30677.

Change-Id: I27b9a95a92557ad1ce1c2c0f28d9a760c372d52a
Reviewed-on: https://dart-review.googlesource.com/5298
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-12 21:43:49 +00:00
Konstantin Shcheglov 9f8532525c Remove try-finally, simplify writeAdditionalExports.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I9414320060c3c9ee593551ac26804d2b543b2e85
Reviewed-on: https://dart-review.googlesource.com/5293
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2017-09-12 20:49:01 +00:00
Sigmund Cherem 2d6a6b300f Allow custom URI schemes in hot-reload unit test and internally in IKG and
hybrid file system.

Fixes #30673

Change-Id: Ib35a790ca4890ee6e212d2e8cfa4f572784d7f3d
Reviewed-on: https://dart-review.googlesource.com/5294
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-12 20:44:13 +00:00
Konstantin Shcheglov bdb503735d Don't include private nodes into outlines.
Outlines are not "we will resynthesize Analyzer elements from them",
but "what is visible when you import them".


R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: If42354374e56eca268433ad798245cf605e74d41
Reviewed-on: https://dart-review.googlesource.com/5288
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2017-09-12 20:38:51 +00:00
Brian Wilkerson bb915a394c Pass the comma in a catch clause to listeners
Change-Id: I33173614c22a9132f850750a441f443b539ed666
Reviewed-on: https://dart-review.googlesource.com/4980
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-09-12 18:46:20 +00:00
Brian Wilkerson af7bf48e7d Use synthetic identifiers to recover from missing type name
Change-Id: Ic3c547a72a1742e0da40124cce024ae11c75f079
Reviewed-on: https://dart-review.googlesource.com/3762
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-09-12 18:11:06 +00:00
Konstantin Shcheglov e1d47bd889 Serialize trimmed outlines without damaging Program.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I19b6debeb629b83af071e6a0d4f97b46096d83f5
Reviewed-on: https://dart-review.googlesource.com/5141
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-12 17:23:20 +00:00
Brian Wilkerson f93da679a1 Support the optional comma in asserts in fasta
Change-Id: Iab3ad9403eba353f695c5eff352d332ed07a6a6f
Reviewed-on: https://dart-review.googlesource.com/3320
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-09-12 17:21:42 +00:00
Brian Wilkerson 8f6f4d9d24 Pass the parens in conditional uris to listeners
Change-Id: I1cf41c32ae60ba1c0e8389a583d9188ad4f9ba89
Reviewed-on: https://dart-review.googlesource.com/5003
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-09-12 16:49:38 +00:00
Konstantin Shcheglov b73417173a Transitively mark constructors for super/redirect initializers.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I1addcab62d943ec9c19b46847b9d2fb322b26a3b
Reviewed-on: https://dart-review.googlesource.com/5120
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2017-09-12 03:48:52 +00:00
Paul Berry b20e05ccc6 Simplify logic for computing semiSafe annotations.
Rather than track precisely which types can be passed to each method
parameter through all of the interfaces it implements, and mark them
as semiSafe when they don't match the declared parameter type, it is
simpler to simply make semiSafe an "inherited" version of semiTyped.
The simpler analysis is slightly conservative--it will unnecessarily
mark parameters as semiSafe in a few circumstances, but those
circumstances seem like they will be rare enough that they don't
justify doing extra work.

This allows us to get rid of the extra field additionalIncomingTypes
(which we would otherwise have had to store in the kernel
representation).

In the process, reworked the logic for deciding whether to mark a
parameter as semiSafe or semiTyped so that it uses a type visitor
rather than by substituting and then doing a subtype check; this
should be significantly faster.

Note that in order for semiSafe to be "inherited" in all the right
circumstances, we need to mark it on abstract methods as well as
concrete ones; this is a departure from analyzer behavior, so I've
added a hack to front_end_runtime_check_test to ensure that it
generates the expected annotations.

Change-Id: I53d3718d8fb1979ac8551fe02734ddaf3d6708b8
Reviewed-on: https://dart-review.googlesource.com/5044
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-11 21:57:14 +00:00
Paul Berry e55aabdbb6 Rework instrumentation of checkFormal and checkInterface annotations
Previously, we generated annotations at the same time as we changed
the value of the .formalSaftey or .interfaceSafety kernel field.  This
had two drawbacks:

- If a field's safety ever changed twice (i.e. the algorithm first
  decided it was semi-safe, and then revised it to unsafe), we would
  get two annotations.

- The annotation code was spread out, leading to a greater risk that
  an annotation would be forgotten.

This CL addresses both drawbacks by moving all of the annotation code
to a common location.

Change-Id: I842c6c3dae4b4f28c868736cd862e5400406428e
Reviewed-on: https://dart-review.googlesource.com/5020
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-11 20:49:40 +00:00
Paul Berry a3b9b8b6b5 Implement inheritance of the covariant keyword.
Change-Id: Ifa00459c294e313f562686c612b5668e2e808a2f
Reviewed-on: https://dart-review.googlesource.com/5002
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-11 19:09:08 +00:00
Paul Berry 13502b4e9e Annotate generic method type parameter covariance safety.
This CL extends the computation of unsafe/semiSafe/safe and
semiTyped/typed annotations so that they apply to type parameters of
generic methods as well as ordinary method parameters (previously they
only applied to method parameters).

Change-Id: I5302e1bfe404df5c73656069557b80ca6787b2b4
Reviewed-on: https://dart-review.googlesource.com/4900
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-11 17:24:29 +00:00
Paul Berry 22c80524d9 Implement the necessary logic for marking formals as "unsafe".
Change-Id: I4c40d93da56da18c635cc151e41adc81dfac980d
Reviewed-on: https://dart-review.googlesource.com/4680
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-09-11 15:36:16 +00:00
Paul Berry c0a5949d95 Rework TypeInferenceEngineImpl.computeFormalSafety()
The old technique had the right effect in a few simple corner cases,
but wasn't correct on theoretical grounds.  The new technique is to
keep track, for every method parameter in every interface, the set of
types which might be passed to that method parameter through base
classes, and then compare those types to the declared method parameter
types.

So for instance, in the code:

    class A<T> {
      foo(List<T> argument) {}
    }
    class B extends A<num> {
      foo(List<num> argument) {}
    }

The set of types that might be passed to B.foo's argument is all
subtypes of List<Object> (since a caller might be invoking foo through
the interface A<Object>).  Since List<Object> is not a subtype of
List<num>, B needs a runtime check.

Change-Id: Iae819e9f8c97ec1cf910fbfacf9bc635fccd9706
Reviewed-on: https://dart-review.googlesource.com/4610
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-09 14:43:26 +00:00
Konstantin Shcheglov 6ad5e509f1 Mark nodes for default values of optional parameters.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I63a54705417a9cb07f2172be0282d2129daa0606
Reviewed-on: https://dart-review.googlesource.com/4524
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-09-08 22:30:50 +00:00
Paul Berry a734f9908f Store types in auxiliary nodes introduced by desugared property assignments.
Change-Id: If1457f34d80d9b9b560bc678db3fed13bed20fdf
Reviewed-on: https://dart-review.googlesource.com/4601
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-08 21:50:24 +00:00
Paul Berry ce47db6075 Store types in auxiliary nodes introduced by simple desugared assignments.
This CL addresses desugared assignments produced for assignments to
local and static variables.

Change-Id: I1e02745c65ef717a8f6484a0eed35c4ada3b89ac
Reviewed-on: https://dart-review.googlesource.com/4280
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-09-08 18:11:21 +00:00
Paul Berry 16d505327b Rename handleBinary{Operator,Expression} to {begin,end}BinaryExpression.
This makes the names more consistent with the other parser listener
methods.

Change-Id: Ic9f636a520bcc40e0ed281963ff079d4ce0202db
Reviewed-on: https://dart-review.googlesource.com/4120
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-09-08 18:03:51 +00:00
Konstantin Shcheglov 8faabf30f4 Export full Class (except private) during outline shaking.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: If8ca2d584600ca060bad6971a0fb02077ccc839a
Reviewed-on: https://dart-review.googlesource.com/4200
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 23:02:12 +00:00
Paul Berry 9ab1a30598 Store types in auxiliary nodes introduced by desugared indexed assignments.
Fixes #30582.

I'll address other kinds of assignments (assignment to a local
variable, static field/setter, or property) in follow up CLs.

Change-Id: I9055e951dc23a4aa1aa19489cf99a832319938c9
Reviewed-on: https://dart-review.googlesource.com/4184
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 22:25:45 +00:00
Konstantin Shcheglov 5cf4b0f27a Fill Program.uriToSource for libraries in delta.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I13f5e94f5857a9baaa52764907c2d7fbf2a4e4c7
Reviewed-on: https://dart-review.googlesource.com/4140
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 21:18:12 +00:00
Dan Rubel d21d8ef0cb report abstract class member as separate error code
Anytime a user adds `abstract` to a member of a class,
the fasta parser now reports an AbstractClassMember error
rather than the more general ExtraneousModifier error.

Change-Id: I41094ff71d38f1572c692b0a66fe8b68948fc23b
Reviewed-on: https://dart-review.googlesource.com/4143
Commit-Queue: Dan Rubel <danrubel@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-09-07 20:58:44 +00:00
Paul Berry 4d8b18a3b3 Infer return types of local functions appropriately in non-strong mode.
Fixes #30629

Change-Id: I4928521c8b2714167c3cfbd971d2dcb9d3aa79b5
Reviewed-on: https://dart-review.googlesource.com/4141
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 20:25:05 +00:00
Konstantin Shcheglov 1b4239d2e4 Export ByteStore and its implementations from front_end.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: Ie2e3413a7f143e270cec2bd3ae4564ad7cc315b1
Reviewed-on: https://dart-review.googlesource.com/3840
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2017-09-07 19:23:21 +00:00
Paul Berry e9a9d00474 Better handling of references to call in type inference.
During type inference, figuring out the type of a method invocation,
property get, or property set takes three steps:

- findInterfaceMember() looks up the target of the invocation, get, or
  set.

- In the case of a method invocation, additional inference is
  performed (to determine generic parameters).

- getCalleeType() uses the interface member and the receiver type to
  figure out the type of the target.

Previous to this CL, there were two circumstances in which
findInterfaceMember() might return `null`: if the invocation was
dynamic, or the receiver's type was a FunctionType and the method name
is `call`.  In order to allow getCalleeType() to distinguish these two
possibilities, it was necessary to keep track of the method name and
plumb it through to getCalleeType().

That was cumbersome, and it would have interfered with fixing
dartbug.com/30582 (which requires keeping track of the targets of
invocations/gets/sets within complex desugared expressions, in
codepaths that don't have room to easily pass additional information
around).

This CL changes findInterfaceMember to return the sentinel string
`call` to represent the case where the receiver's type is a
FunctionType and the method name is `call`.  This avoids the need for
extra plumbing, since the interface member is already plumbed through
to getCalleeType().

It also does some cleanup of getCalleeType and getSetterType, removing
code branches that have turned out to be unnecessary.

Change-Id: I3295ea139106511005b2067cc9b85b5bc01952c3
Reviewed-on: https://dart-review.googlesource.com/3800
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 15:41:43 +00:00
Konstantin Shcheglov 146590d18a Keep exported nodes during shaking.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: I9475c6582025efa84b0c04d4990ae3b9dc515c03
Reviewed-on: https://dart-review.googlesource.com/3744
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-09-07 15:30:24 +00:00
Brian Wilkerson 3f698e5a61 Fix some typos in the parser code
Change-Id: I31b0473d9f5b7d5e1157d40ba176b9a6255514e0
Reviewed-on: https://dart-review.googlesource.com/3682
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-09-07 14:57:28 +00:00
Dan Rubel 6cfee12257 remove duplicate dart2js external method check
This removes an error generated by the front-end that is already
reported by dart2js and fixes a failing test.

Change-Id: I8082cab9546b962a0b3d4011044fe224867e7613
Reviewed-on: https://dart-review.googlesource.com/3960
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
2017-09-07 13:24:45 +00:00
Dan Rubel ec606a7874 report ExternalMethodWithBody error for native method with body
Change-Id: Ibca0cd1223ee61cafd2427d26448a1890a04aae8
Reviewed-on: https://dart-review.googlesource.com/3560
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
2017-09-07 11:03:45 +00:00
Paul Berry a1f4874a00 Implement type promotion for logical expressions.
This CL implements type promotion logic for both `&&` and `||`;
however, the logic for `||` has no effect, since `_factsWhenFalse`
always returns the current facts.  This is consistent with the current
Dart specification (which only specifies type promotion for `&&`).

Change-Id: I79f608aa33ea0501bb4bba303949330af2da4dda
Reviewed-on: https://dart-review.googlesource.com/3345
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-09-06 17:12:52 +00:00
Paul Berry 068c78e9d7 Change type inference of ?? to match analyzer, prep for future fixes.
Previous to this CL, inference of `??` matched the behavior specified
in the informal spec (https://github.com/dart-lang/sdk/pull/29371),
whereas inference of `?:` matched analyzer behavior.

In the long run, we want the behavior of both `??` and `?:` to match
the spec (note that the spec is still being debated, so this is a
moving target).  But for now, to ease the transition to the new front
end, we want to match analyzer behavior.

With this CL, the inference for `??` is changed to match analyzer
behavior, and a boolean is introduced to make it easy for us to switch
to the behavior specified in the informal spec when it's appropriate
to do so.

Should address the inconsistency pointed out in #30624.

Change-Id: I33d95cd59e4c7e474f3ba27491be87c1bf66d85e
Reviewed-on: https://dart-review.googlesource.com/3421
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-06 15:16:43 +00:00
Paul Berry 4bdad2194d Fix findInterfaceMember when the receiver type is not an InterfaceType.
It is stil permissible to access methods/getters on Object (toString,
==, hashCode, etc.), even if the receiver type is not an
InterfaceType, and we want type inference and kernel annotations to
work correctly.

Change-Id: I311b43c6de31faeefa85bc70636af05c62c4c1fe
Reviewed-on: https://dart-review.googlesource.com/3385
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-09-05 23:40:17 +00:00
Brian Wilkerson f3dfc20bee Map fasta expected type name error to analyzer
Change-Id: Ia687fcc5859e7d60cb21d4c9dc11b4a1a95721af
Reviewed-on: https://dart-review.googlesource.com/3383
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-09-05 21:55:37 +00:00
Brian Wilkerson 7cf0a22f43 Make covariant be a modifier in front_end
Change-Id: I66f8823207f6231b8318b8ac0530f1c51f9b702d
Reviewed-on: https://dart-review.googlesource.com/3282
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-09-05 16:25:06 +00:00
Dan Rubel 7733322d79 report const class as a more specific error code
This depends upon https://codereview.chromium.org/3007943002/ landing first.

R=brianwilkerson@google.com

Review-Url: https://codereview.chromium.org/3007033002 .
2017-09-02 08:46:35 -04:00
Dan Rubel 813d4eddf8 gracefully recover from extraneous top level modifiers
When the user includes extraneous modifiers preceeding top level
directives and declarations, the fasta parser now report an error
and skips the modifier.

R=brianwilkerson@google.com

Review-Url: https://codereview.chromium.org/3007943002 .
2017-09-01 18:55:02 -04:00
Konstantin Shcheglov 72d85a3689 Make FileByteStore accept a unique temporary name suffix.
R=brianwilkerson@google.com
BUG=

Review-Url: https://codereview.chromium.org/3008013002 .
2017-09-01 13:56:26 -07:00
Jacob MacDonald 91c9de2ac2 don't use internal throwOnWarnings option
BUG=
R=sigmund@google.com

Review-Url: https://codereview.chromium.org/3010033002 .
2017-09-01 13:52:48 -07:00
Peter von der Ahé b460a25459 Store actual Reference(s) for additional exports.
R=johnniwinther@google.com, scheglov@google.com

Review-Url: https://codereview.chromium.org/3009953003 .
2017-09-01 16:30:43 +02:00