Commit Graph

6018 Commits

Author SHA1 Message Date
Paul Berry 00b292511d Avoid a crash when an invalid assignment is detected during top level inference.
Change-Id: I382a4fdcd25bca529ca424ccdb7fd313d6a95066
Reviewed-on: https://dart-review.googlesource.com/18143
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-02 15:22:55 +00:00
Samir Jindel 52e1466588 [kernel] Fix NoSuchMethod errors for generic functions.
Bug:
Change-Id: I8ad90e34a7b1f77b29f1d711f158bcb69f5928f4
Reviewed-on: https://dart-review.googlesource.com/17941
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2017-11-02 15:16:08 +00:00
Brian Wilkerson 27fd7cad98 Clean-up parseUnit
Change-Id: Icbcef86609c5b84a129b6c68a1311cb4447c90a9
Reviewed-on: https://dart-review.googlesource.com/18100
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-02 13:33:08 +00:00
Brian Wilkerson 38a170cca9 Make parseTypeVariable accept the last committed
Change-Id: I64e29df367fca45709beb450b5aff1f9073f0b78
Reviewed-on: https://dart-review.googlesource.com/18080
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-02 13:19:20 +00:00
Paul Berry c4e00daf70 Create a front_end test case for invalid assignment errors.
Change-Id: I5c23f7eb6d07b551397ca2301ed5485910083b8d
Reviewed-on: https://dart-review.googlesource.com/18140
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-01 22:09:27 +00:00
Brian Wilkerson 6661da9b86 Make parseMapLiteralEntry accept the last consumed
Change-Id: I0d4c393ece13bbe8f1edad032053df90bd4fcf5d
Reviewed-on: https://dart-review.googlesource.com/18040
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 21:12:23 +00:00
Brian Wilkerson 0d94dfaf5c Make parseLiteralStringOrRecoverExpression accept the last consumed
Change-Id: Ia8b8ad0d9e8a86c7a782185ef00dd667bc2e457a
Reviewed-on: https://dart-review.googlesource.com/18002
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 21:07:18 +00:00
Brian Wilkerson 1e6490dbef Return last committed from parseTopLevelMember, parseTopLevelKeywordDeclaration, and parseTopLevelDeclarationImpl
Change-Id: If9fe159f4926c250cf06937cea9f1f4a78e21269
Reviewed-on: https://dart-review.googlesource.com/18003
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 20:31:36 +00:00
Konstantin Shcheglov 9d0d1fb6d2 Replace #30035 with #28434 in status files.
Kernel now supports these annotations, we need to start producing them.

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

Bug:
Change-Id: I1b2732ddad2674688d562f3be3ca29140a5e9381
Reviewed-on: https://dart-review.googlesource.com/17863
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-11-01 20:30:04 +00:00
Brian Wilkerson 895f771726 Make parseTopLevelMethod return the last consumed
Change-Id: I65b9a2a6842ed1ec8ce986cb83fa108ce38be6ba
Reviewed-on: https://dart-review.googlesource.com/18001
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 19:02:47 +00:00
Paul Berry d2e3c54941 Allow arguments of type DartType in error message templates.
Change-Id: Ief2c253dc287cb416f35d03d796383725c2982c3
Reviewed-on: https://dart-review.googlesource.com/17981
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-01 18:53:15 +00:00
Brian Wilkerson f95e1475fc Remove the unused Listener.beginDottedName
Change-Id: I1c5752a9610f21dad62db6655972b4006ce632e9
Reviewed-on: https://dart-review.googlesource.com/17862
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-11-01 18:35:45 +00:00
Brian Wilkerson 87a096e992 Remove the unused Listener.beginIdentifierList
Change-Id: I3644aaff3fa7a8a97b9e9bcc83f549f628a1fb71
Reviewed-on: https://dart-review.googlesource.com/17861
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 17:21:05 +00:00
Brian Wilkerson dd18ef841b Parser conversion, part 3
Change-Id: Ibe48da9bfa89887fb04a4b958b913fe7c0087cf1
Reviewed-on: https://dart-review.googlesource.com/17600
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-11-01 16:32:45 +00:00
Paul Berry 08b0120186 Begin reporting "invalid assignment" errors.
Change-Id: I1e47acd662032c63e56cb2349b2f349e9825b990
Reviewed-on: https://dart-review.googlesource.com/17680
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-01 16:28:35 +00:00
danrubel 9319716c4f Ensure progress in parseUnit
This adds a check in the top level parseUnit loop to ensure
that parsing has not stalled causing an infinite loop.

Fix https://github.com/dart-lang/sdk/issues/31151

Change-Id: Ief7c12d60bd7e09111f9b1bbefa4a29b9fcf9175
Reviewed-on: https://dart-review.googlesource.com/17460
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-11-01 14:22:40 +00:00
Peter von der Ahé b7060891c1 Mention that libraries.json is generated.
Change-Id: I48fcc8443a0980c435e87642cf6a7aede07e68f0
Reviewed-on: https://dart-review.googlesource.com/17161
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
2017-11-01 12:55:42 +00:00
Peter von der Ahé 16e4875629 Update supertype builder when breaking cyclic hierarchy
Change-Id: Ibae0a3d1759d79bf0d2e350347e390936fa314ff
Reviewed-on: https://dart-review.googlesource.com/16953
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-11-01 10:08:40 +00:00
Jens Johansen c8e51ef922 [kernel] Add offset to this[i] and super[i]
Bug:
Change-Id: Ic65b69c4977be834c7b69638d6c030727c7210e5
Reviewed-on: https://dart-review.googlesource.com/17441
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2017-11-01 09:57:00 +00:00
Paul Berry f382f3980c Run kernel type checker during front end strong mode unit tests.
This should help make sure that the front end is inserting all of the
necessary implicit downcasts.

The type checker is run after comparing to golden files, and before
running the test in the VM.  So if a test case fails to match its
golden file, the test's status will be "Fail" regardless of whether it
type checks.  If the test case matches its golden file but fails to
type chek, the test's status will be "TypeCheckError".  Rationale: the
type checker is still under development; if it has bugs leading to
false failures, we don't want that to get in the way of comparing
against golden files.

Change-Id: I6764aa5c7f2aab92a10edfa41afcdb056946530b
Reviewed-on: https://dart-review.googlesource.com/17522
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-10-31 21:25:45 +00:00
Siva Chandra 9f0175059e Load class members lazily when loading from kernel.
This change brings down core snapshot size by ~750KB, and brings
down app-jit snapshot size of simple "Hello, World" dart script by
~650KB. The bot cycle times will also come down by around ~20%.

Change-Id: I2a01c98bedc7ebfa2a653983995486a71504daf3
Reviewed-on: https://dart-review.googlesource.com/16323
Commit-Queue: Siva Chandra <sivachandra@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
2017-10-31 19:19:25 +00:00
Dan Rubel 2b681b2149 Disable scanning of &&= and ||= assignment operators
Fix https://github.com/dart-lang/sdk/issues/30340

Change-Id: Id27f37af9805ca09deaa3c6252817e3d9a926216
Reviewed-on: https://dart-review.googlesource.com/17361
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-10-31 18:51:24 +00:00
Konstantin Shcheglov 9b8e8c2344 Add memory cache directly into ProtectedFileByteStore.
So, it can be used standalone, without wrapping into
MemoryCachingByteStore, and IKG can check for it to protect keys.

Bug:
Change-Id: I50635c773b73ad7e57d0dfe1fd9e3c4574f1a1aa
Reviewed-on: https://dart-review.googlesource.com/17560
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2017-10-31 18:10:05 +00:00
Peter von der Ahé 8ac1307f60 Prepare buildBuilder for patching
Change-Id: I900f7ce8e0e80fff703ca23aeb9f08b154f839ab
Reviewed-on: https://dart-review.googlesource.com/16949
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
2017-10-31 17:32:25 +00:00
Brian Wilkerson b6ef64ffbd Parser conversion, part 2
Change-Id: I7fb782d5f9ac9a3ac024da953f1e72faa6e557b3
Reviewed-on: https://dart-review.googlesource.com/17280
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-10-31 17:05:35 +00:00
Paul Berry 8620e6b24a Insert implicit downcasts for ??= assignments.
Change-Id: I272eeea96a19ad5c781113211ee466f844ffbe4b
Reviewed-on: https://dart-review.googlesource.com/17240
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-10-31 15:58:55 +00:00
Brian Wilkerson 0f25913463 Remove unused error code
Change-Id: I178aa3f70108eda870aba2f75a93e2a833a94915
Reviewed-on: https://dart-review.googlesource.com/17480
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-10-31 15:33:26 +00:00
Peter von der Ahé 2a9d762b4b Remove unneeded section on creating platform.dill
Change-Id: I5f7a781d6ade52f1a9a4cf77ec333acc5e4f64d6
Reviewed-on: https://dart-review.googlesource.com/17180
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-31 15:06:05 +00:00
Peter von der Ahé 674acc9cce Cache Uri.base
Change-Id: I8c3da7e9fcfa3a05aaa52c8b821bc52a9ec8440c
Reviewed-on: https://dart-review.googlesource.com/17442
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-31 13:38:55 +00:00
Paul Berry 963f724a32 Allow "--strong" as a synonym for "--strong-mode" in "fasta compile"
This makes the behavior of "fasta compile" more consistent with other
tools.

Change-Id: I1c1f1678446ea827e04a59cdcaa1cdbf541ecbe5
Reviewed-on: https://dart-review.googlesource.com/17320
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-10-30 19:57:25 +00:00
Leaf Petersen 4270b99d75 Fix dynamic as bottom uses in front end and dart2js.
Re-enable the dynamic as bottom hint in analysis_options.yaml and fix
the code to be hint clean again.

Fixes #30589
Fixes #30590

Bug:
Change-Id: Idb7910b3ab1c6d931a3ead3eed885d8bd172e621
Reviewed-on: https://dart-review.googlesource.com/17062
Commit-Queue: Leaf Petersen <leafp@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2017-10-30 19:54:26 +00:00
Peter von der Ahé 8071fa9053 Prepare external handling for patches.
Change-Id: Ib4299fcb87657d5b5b001404a60c4b701a366f3a
Reviewed-on: https://dart-review.googlesource.com/16543
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-30 18:46:25 +00:00
Peter von der Ahé b6eb82a993 Various checks to ensure correct parent
Change-Id: I74f66380f30c3344bb0865e14eb8742d70144ddf
Reviewed-on: https://dart-review.googlesource.com/16760
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-30 17:15:35 +00:00
Brian Wilkerson 61faf35b32 First set of Parser method conversions
Change-Id: If911c37f2324e45e5118de22e5fd636638a27d6a
Reviewed-on: https://dart-review.googlesource.com/17063
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-10-30 16:05:15 +00:00
Peter von der Ahé fa225e4a19 Prepare for patching: origin and readPatchFiles.
Change-Id: Id81e05d5c71d6c55fb86e230b054271b27c48023
Reviewed-on: https://dart-review.googlesource.com/16523
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2017-10-30 15:01:34 +00:00
Peter von der Ahé 5c9ec5222b Don't process libraries from a different loader.
Change-Id: Id4b00d4510adcaf43efc5cb661d95f98f8c5012c
Reviewed-on: https://dart-review.googlesource.com/16481
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-30 14:15:55 +00:00
Peter von der Ahé 6f687277f5 Write logs when running tests
Change-Id: Ib5b59d936d0f0dbc9a6640a8f155b4a7165822b8
Reviewed-on: https://dart-review.googlesource.com/16545
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-30 13:52:05 +00:00
Dan Rubel a2c5217e8d Update several fasta/analyzer covariant and type errors
* report "missing const, final, var, or type" error in several situations
* fix several top level covariant errors
* report final and covariant error

Change-Id: Iffe313c1b3cd2413be5f7763cb726436722e6a74
Reviewed-on: https://dart-review.googlesource.com/17140
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-10-30 13:28:46 +00:00
Peter von der Ahé a0cc5b6a5f Minor improvements to Fasta's extended verifier
Change-Id: I2f8fc20e0529d72fec51eec97b54bd63ce15c4c4
Reviewed-on: https://dart-review.googlesource.com/16950
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-30 09:17:12 +00:00
Brian Wilkerson 6fdc91d049 Add markers in Parser to keep track of what has and has not been converted
Change-Id: I2cb16dbe4fee3d3f34f8781abd19b16475b4a409
Reviewed-on: https://dart-review.googlesource.com/17020
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2017-10-27 22:25:47 +00:00
Paul Berry 33c2280451 Ensure that runtime checks inserted by strong mode have fileOffset set.
Otherwise if the checks fail, the user won't get a useful stack trace.

Change-Id: Idc758db93df44b7a2f7a815c0388e4fb8afda121
Reviewed-on: https://dart-review.googlesource.com/17044
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-10-27 21:50:17 +00:00
Bob Nystrom cf8a477cb7 Support test packages in dartdevk in test.dart.
This allows dartdevk to compile tests that import packages like expect.
There are a few pieces to this:

- Add support to build_pkgs.dart to build the kernel summaries for each
  test package (in addition to the analyzer summaries it already
  builds).

- Plumb that through the dartdevc_test target in the GN build as well.

- While we're at it, use GN to build the ddc_sdk.dill file and have
  test.dart load that one instead of the manually built one from calling
  ./tool/kernel_sdk.dart.

- Add command-line arguments to dartdevk for passing in the path to the
  SDK summary and the other summaries to compile against.

- Fix a little typo in processed_options.dart that was preventing it
  from resolving "package:" URIs.

- In test.dart, when compiling a test, link in the summaries for all of
  the test packages.

At runtime, it still uses the JS for those packages generated from the
old analyzer-based front end since the kernel-based compiler isn't
complete enough to compile any of those packages yet.

With all of this, if I change a test to:

  import "package:expect/expect.dart";

  main() {
    Expect.equals("a", "b");
  }

Then it compiles but fails at runtime. The compiler is completing, but
the generated code has some bugs. I don't know enough to fix them
myself, but here's what I've found out:

- In _libraryToModule(), the Library we get from kernel has a null
  fileUri, so this returns an empty string. That in turn means the
  generated JS tries to use "$" as the module name.

  Using this works around it temporarily:

      if (moduleName.isEmpty) moduleName = library.name;

- In _emitTopLevelNameNoInterop(), it doesn't handle the case where the
  NamedNode is a static method on a class. It just generates the library
  and method name, skipping the class, so "Expect.equals(1, 2)" gets
  compiled to "expect.equals(1, 2)" instead of
  "expect.Expect.equals(1, 2)".

Change-Id: I6bd9d98bc9706965160d8fb7cf70b20eeebab3a8
Reviewed-on: https://dart-review.googlesource.com/16687
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Vijay Menon <vsm@google.com>
2017-10-27 21:25:58 +00:00
Brian Wilkerson 347cf98cb5 Bug fixes and clean-up in Parser
Change-Id: I7d00b630831948892d181994cea12e52c6389bbb
Reviewed-on: https://dart-review.googlesource.com/17000
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-10-27 20:27:07 +00:00
Paul Berry 6f9d6965fe Insert implicit downcasts for simple assignments.
Notes on test changes:

- This revealed runtime failures in some tests in
  pkg/front_end/testcases/inference.  Since these tests were never
  meant to exercise runtime behavior in the first place, I just
  changed them so that main() does nothing.

- This revealed runtime failures in some tests in tests/language_2.
  These tests began failing because they used "var" for a fields and
  then later assigned a value to the field that was incompatible with
  the inferred type.  It looks like the intent was for these fields to
  have type "dynamic", so I changed the tests accordingly.

Change-Id: I0ddb2063427b52b5e4be1884fa333e25be4bf4f3
Reviewed-on: https://dart-review.googlesource.com/16881
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-10-27 18:27:09 +00:00
Konstantin Shcheglov 16d4e9606f Use text presentation for expections and initial libraries state.
R=ahe@google.com, paulberry@google.com, sigmund@google.com

Bug:
Change-Id: Ia74e6012e02156a8ee30eb72c07a2415ed2dcba0
Reviewed-on: https://dart-review.googlesource.com/16880
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2017-10-27 14:43:08 +00:00
Brian Wilkerson f36203ecb0 Add error range checks for more of the existing tests
Change-Id: Ice173c1046f334b69dab8896a8d0eb570dbedaed
Reviewed-on: https://dart-review.googlesource.com/16691
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2017-10-27 13:53:18 +00:00
Samir Jindel 031a7ffe41 [kernel] Improve Enum representation.
Dart2JS and the VM prefer for Enum names to be stored inline in the Enum
object to avoid having the static array of all Enum values. A base class
for Enums is provided to avoid repeating the common fields and accessors
between Enum definitions.

Bug:
Change-Id: I783f863015b45f13317fda06e627d14844fe2ddf
Reviewed-on: https://dart-review.googlesource.com/16526
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-10-27 12:10:53 +00:00
Peter von der Ahé 2d96f78d99 Use correct location for external redirecting factory.
Change-Id: Ie03b34d5af25ebb51941cd4f85fd11729b1af7dc
Reviewed-on: https://dart-review.googlesource.com/16940
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-27 10:50:38 +00:00
Peter von der Ahé 2d2945e701 Include runtimeType in error message.
Change-Id: Ibdaef8c25533106b6701bda60a1f4cbc11582e18
Reviewed-on: https://dart-review.googlesource.com/16443
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2017-10-27 10:15:48 +00:00
Dan Rubel 54f22f1a03 Improve error recovery for fields.
Change-Id: I5e44cc220f67f4daa9c5339c3afea9c5f2f48bcd
Reviewed-on: https://dart-review.googlesource.com/16721
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2017-10-27 03:02:40 +00:00