Commit Graph

26990 Commits

Author SHA1 Message Date
sigurds
aa0ddf7db4 [turbofan] Initial support for escape analysis.
This is the first part of escape analysis for turbofan.
At the moment, there is no deopt support, and support
for loops is partial (only binary Phis are handled).

The CL includes 4 unittests.

There are also 8 new mjsunit tests, some of which are
skiped as they require features not yet implemented.

BUG=v8:4586
LOG=n

Review URL: https://codereview.chromium.org/1457683003

Cr-Commit-Position: refs/heads/master@{#32498}
2015-12-02 10:53:50 +00:00
verwaest
9bee67509c Don't EnsureHasInitialMap on non-constructors.
non-constructors are not allowed to have initial maps. The optimizing compilers used to add initial maps unconditionally to functions used as right-hand-side in instanceof.

BUG=

Review URL: https://codereview.chromium.org/1490003003

Cr-Commit-Position: refs/heads/master@{#32497}
2015-12-02 10:39:46 +00:00
jkummerow
e478a8ac39 [proxies] Implement Symbol/DONT_ENUM filtering for GetKeys()
And use it to fix Object.keys() for proxies.

BUG=v8:1543
LOG=n
R=cbruni@chromium.org

Review URL: https://codereview.chromium.org/1488873003

Cr-Commit-Position: refs/heads/master@{#32496}
2015-12-02 10:19:59 +00:00
mlippautz
2e7eea4aef [heap] Clean up stale store buffer entries for aborted pages.
1.  Let X be the aborted slot (slot in an evacuated object in an aborted page)
2.  Assume X contains pointer to Y and Y is in the new space, so X is in the
    store buffer.
3.  Store buffer rebuilding will not filter out X (it checks InNewSpace(Y)).
4.  The current mark-sweep finishes. The slot X is in free space and is also in
    the store buffer.
5.  A string of length 9 "abcdefghi" is allocated in the new space. The string
    looks like |MAP|LENGTH|hgfedcba|NNNNNNNi| in memory, where NNNNNNN is
    previous garbage. Let's assume that NNNNNNN0 was pointing to a new space
    object before.
6.  Scavenge happens.
7.  Slot X is still in free space and in store buffer. [It causes scavenge of
    the object Y in
    store_buffer()->IteratePointersToNewSpace(&Scavenger::ScavengeObject). But
    it is not important].
8.  Our string is promoted and is allocated over the slot X, such that NNNNNNNi
    is written in X.
9.  The scavenge finishes.
9.  Another scavenge starts.
10. We crash in
    store_buffer()->IteratePointersToNewSpace(&Scavenger::ScavengeObject) when
    processing slot X, because it doesn't point to valid map.

BUG=chromium:524425,chromium:564498
LOG=N
R=hpayer@chromium.org, ulan@chromium.org

Review URL: https://codereview.chromium.org/1493653002

Cr-Commit-Position: refs/heads/master@{#32495}
2015-12-02 09:39:35 +00:00
yangguo
62dcf2fab6 [es6] correctly handle object wrappers in JSON.stringify.
R=bmeurer@chromium.org
BUG=v8:4581
LOG=N

Review URL: https://codereview.chromium.org/1495473002

Cr-Commit-Position: refs/heads/master@{#32494}
2015-12-02 08:44:03 +00:00
hablich
4fb84b9dd6 Clobber to hopefully resolve a clang problem
BUG=chromium:500934
LOG=N
TBR=yangguo@chromium.org

Review URL: https://codereview.chromium.org/1486343003

Cr-Commit-Position: refs/heads/master@{#32493}
2015-12-02 08:09:19 +00:00
zhengxing.li
ed679e5280 X87: [turbofan] Implemented the optional Float32RoundDown operator.
port 74434403f6 (r32261)

  original commit message:
  I implemented the optional Float32RoundDown operator on x64, ia32, arm,
  and arm64.

  For arm I also had to adjust the simulator.

BUG=

Review URL: https://codereview.chromium.org/1490113003

Cr-Commit-Position: refs/heads/master@{#32492}
2015-12-02 08:03:15 +00:00
bmeurer
f618401a8e [builtins] Remove some (now) unused code from C++ builtin adaptor.
Sanitize ConstructStub handling and add a test case to ensure that the
Symbol constructor is using the correct context.

R=jarin@chromium.org
BUG=v8:4413
LOG=n

Review URL: https://codereview.chromium.org/1489323002

Cr-Commit-Position: refs/heads/master@{#32491}
2015-12-02 07:32:10 +00:00
zhengxing.li
a0134a6dc6 X87: [turbofan] Added the optional Float64RoundTiesEven operator to turbofan.
port dffecf31fc (r32005)

  original commit message:
  The TiesEven rounding mode rounds float64 numbers to the nearest
  integer. If there are two nearest integers, then the number is rounded
  to the even one.  This is the default rounding mode according to
  IEEE~754.

  I implemented the operator on ia32, x64, arm, arm64, mips, and mips64.

  I think there is a bug in the current implementation of the ppc
  simulator, which kept me from implementing the operator on ppc.
  According to my understanding of the ppc instruction manual, the FRIN
  instruction provides the right behavior for Float64RoundTiesEven. In the
  simulator, however, FRIN provides a different semantics. If there are
  two nearest integers, then the simulator returns the one which is
  further away form 0.

BUG=

Review URL: https://codereview.chromium.org/1486323003

Cr-Commit-Position: refs/heads/master@{#32490}
2015-12-02 07:03:48 +00:00
zhengxing.li
4879550675 X87: Array constructor failed to enter it's function execution context.
port d2f78c6b79 (r32476)

  original commit message:
  This becomes visible if an exception is thrown by the constructor.
  We do this on "new Array(3.5)", throwing a RangeError.

BUG=

Review URL: https://codereview.chromium.org/1491153002

Cr-Commit-Position: refs/heads/master@{#32489}
2015-12-02 05:35:42 +00:00
zhengxing.li
54a9d349db X87: Provide call counts for constructor calls, surface them as a vector IC.
port 66d5a9df62 (r32452)

  original commit message:
  CallIC and CallConstructStub look so alike, at least in the feedback they gather even if the implementation differs...and CallIC has such a nice way of surfacing the feedback (CallICNexus), that there

BUG=

Review URL: https://codereview.chromium.org/1491063003

Cr-Commit-Position: refs/heads/master@{#32488}
2015-12-02 05:26:42 +00:00
zhengxing.li
ee29b94a83 X87: [debugger] Remove code to predict step-in target.
port 2f559f210d (r32449)

  original commit message:

BUG=

Review URL: https://codereview.chromium.org/1494453002

Cr-Commit-Position: refs/heads/master@{#32487}
2015-12-02 05:23:37 +00:00
zhengxing.li
a7ec7ebda3 X87: [x86] Sane default for Label::Distance on JumpIfRoot/JumpIfNotRoot.
port c83db2d071 (r32456)

  original commit message:

BUG=

Review URL: https://codereview.chromium.org/1487293002

Cr-Commit-Position: refs/heads/master@{#32486}
2015-12-02 05:21:16 +00:00
v8-autoroll
44ec33978d Update V8 DEPS.
Rolling v8/build/gyp to e2313c02ad7b6d589b38fe578f5d39970a9bbc20

Rolling v8/tools/clang to 3cc3dac50b26c67176bfed187a300741f31651bf

TBR=machenbach@chromium.org,vogelheim@chromium.org,hablich@chromium.org

Review URL: https://codereview.chromium.org/1491133002

Cr-Commit-Position: refs/heads/master@{#32485}
2015-12-02 04:23:09 +00:00
zhengxing.li
0b94c99847 X87: [turbofan] Added the optional Float64RoundUp operator to turbofan.
port 1389b9f53c (r32004)

  original commit message:
  I implemented it on x64, ia32, arm, arm64, mips, mips64, and ppc.

BUG=

Review URL: https://codereview.chromium.org/1488993002

Cr-Commit-Position: refs/heads/master@{#32484}
2015-12-02 02:13:55 +00:00
yangguo
564a208676 [bootstrapper] no longer use outdated contexts list.
We currently use the outdated contexts list provided by the serializer
to update the receiver (the global proxy) in script contexts. However,
this is not actually necessary, since the global proxy is passed to the
deserializer and replaced as we deserialize.

Originally, the outdated contexts list is to update the global object
field in contexts. This was necessary since at the time the deserializer
creates the native context, the global object has not yet been created.
But the global proxy already exists.

R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/1488873004

Cr-Commit-Position: refs/heads/master@{#32483}
2015-12-01 23:42:02 +00:00
mbrandy
70e699751c PPC: [debugger] Remove code to predict step-in target.
Port 2f559f210d

R=yangguo@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=

Review URL: https://codereview.chromium.org/1490923004

Cr-Commit-Position: refs/heads/master@{#32482}
2015-12-01 23:17:18 +00:00
mbrandy
8ea834385e PPC: Provide call counts for constructor calls, surface them as a vector IC.
Port 66d5a9df62

Original commit message:
    CallIC and CallConstructStub look so alike, at least in the feedback
    they gather even if the implementation differs...and CallIC has such
    a nice way of surfacing the feedback (CallICNexus), that there is a
    request to make CallConstructStub look analogous. Enter ConstructICStub.

R=mvstanton@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=

Review URL: https://codereview.chromium.org/1485303002

Cr-Commit-Position: refs/heads/master@{#32481}
2015-12-01 23:09:48 +00:00
mbrandy
ec5590dc82 PPC: Array constructor failed to enter it's function execution context.
Port d2f78c6b79

Original commit message:
    This becomes visible if an exception is thrown by the constructor.
    We do this on "new Array(3.5)", throwing a RangeError.

R=mvstanton@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=

Review URL: https://codereview.chromium.org/1484423003

Cr-Commit-Position: refs/heads/master@{#32480}
2015-12-01 23:08:58 +00:00
dusan.m.milosavljevic
2d0e9abebf MIPS:[turbofan] Use Ins, Dins to clear bits instead of And with inverted immediate.
TEST=unittests/InstructionSelectorTest.Word(32|64)AndToClearBits
BUG=

Review URL: https://codereview.chromium.org/1485023004

Cr-Commit-Position: refs/heads/master@{#32479}
2015-12-01 22:16:48 +00:00
dusan.m.milosavljevic
6b11cc830b MIPS:[turbofan] Use Nor instruction for bit negation instead of xori.
Xori instruction can only have unisgned 16-bit immediates for right input,
as such it is not suitable for bit negation on mips.

TEST=unittests/InstructionSecetorTest.Word(32|64)XorMinusOneWithParameter
BUG=

Review URL: https://codereview.chromium.org/1485833003

Cr-Commit-Position: refs/heads/master@{#32478}
2015-12-01 21:58:43 +00:00
caitpotter88
5058f68596 [parser] treat MethodDefinitions in ObjectPatterns as SyntaxErrors
BUG=v8:4585
LOG=N
R=adamk@chromium.org, rossberg@chromium.org

Review URL: https://codereview.chromium.org/1488043002

Cr-Commit-Position: refs/heads/master@{#32477}
2015-12-01 20:33:11 +00:00
mvstanton
d2f78c6b79 Array constructor failed to enter it's function execution context.
This becomes visible if an exception is thrown by the constructor.
We do this on "new Array(3.5)", throwing a RangeError.

BUG=

Review URL: https://codereview.chromium.org/1483053004

Cr-Commit-Position: refs/heads/master@{#32476}
2015-12-01 18:43:03 +00:00
cbruni
f4d4051521 [runtime] [proxy] Runtime_HasOwnProperty and thus
Object.prototype.hasOwnProperty should use JSReceiver::HasOwnProperty for
proxies.

BUG=v8:1543
LOG=N

Review URL: https://codereview.chromium.org/1480213004

Cr-Commit-Position: refs/heads/master@{#32475}
2015-12-01 17:33:04 +00:00
mythria
128e75cbd9 [Interpreter] Add support for context slot loads / stores to BytecodeGraphBuilder.
Adds implementation and tests for LdaContextSlot, StaeContextSlot, PushContext,
and PopContext to bytecode graph builder

BUG=v8:4280
LOG=N

Review URL: https://codereview.chromium.org/1489863002

Cr-Commit-Position: refs/heads/master@{#32474}
2015-12-01 17:33:03 +00:00
cbruni
df36d046a4 [runtime] [proxy] Fix Object.prototype.PropertyIsEnumerable to support
proxies.

BUG=v8:1543
LOG=N

Review URL: https://codereview.chromium.org/1484313003

Cr-Commit-Position: refs/heads/master@{#32473}
2015-12-01 17:12:08 +00:00
titzer
8948e08ed7 [turbofan] Check that inputs to Node::New are not NULL.
R=mstarzinger@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1492433003

Cr-Commit-Position: refs/heads/master@{#32472}
2015-12-01 16:32:42 +00:00
cbruni
d9e0a5a9ad [runtime] [proxy] Adding [[SetPrototypeOf]] trap.
LOG=N
BUG=v8:1543

Review URL: https://codereview.chromium.org/1481383003

Cr-Commit-Position: refs/heads/master@{#32471}
2015-12-01 15:59:44 +00:00
mstarzinger
82e6bed4db Deprecate the %IsConstructCall intrinsic completely.
R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/1479233002

Cr-Commit-Position: refs/heads/master@{#32470}
2015-12-01 15:58:55 +00:00
yangguo
3a4846d2bd [bootstrapper] add checks for variable bindings in native scripts.
Native scripts must not accidentally pollute the global object.

R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/1490783002

Cr-Commit-Position: refs/heads/master@{#32469}
2015-12-01 14:28:19 +00:00
mstarzinger
8c793fed78 [crankshaft] Prevent inlining of new.target functions.
This moves the bailout for functions containing new.target variable to
the correct place so that Crankshaft doesn't accidentally inline such
functions, yielding an "undefined" new.target value all the time.

R=bmeurer@chromium.org
TEST=mjsunit/es6/regress/regress-inlined-new-target

Review URL: https://codereview.chromium.org/1484163003

Cr-Commit-Position: refs/heads/master@{#32468}
2015-12-01 14:19:43 +00:00
bbudge
6aa9b10faf Clean up ArchDefaultRegisterConfiguration.
Remove two unused fields.
Define register codes the same way register names are defined and eliminate static methods.
#error if target isn't defined.

LOG=N
BUG=v8:4124

Review URL: https://codereview.chromium.org/1482963003

Cr-Commit-Position: refs/heads/master@{#32467}
2015-12-01 14:18:55 +00:00
cbruni
7e8fa4b96a [runtime] [proxy] implementing [[Get]] trap.
BUG=v8:1543
LOG=N

Review URL: https://codereview.chromium.org/1482283002

Cr-Commit-Position: refs/heads/master@{#32466}
2015-12-01 14:04:43 +00:00
dusan.m.milosavljevic
1d735a2d2e MIPS: [turbofan] Enable Word32 safe shifts.
TEST=
BUG=

Review URL: https://codereview.chromium.org/1483973002

Cr-Commit-Position: refs/heads/master@{#32465}
2015-12-01 14:03:54 +00:00
machenbach
79ded5acc9 Revert of [CQ] Update proto format to fix triggered builders. (patchset #1 id:1 of https://codereview.chromium.org/1486963002/ )
Reason for revert:
Maybe causing problems

Original issue's description:
> [CQ] Update proto format to fix triggered builders.
>
> Depends on https://chromereviews.googleplex.com/319777013/
>
> BUG=chromium:561530
> LOG=n
> TBR=sergiyb@chromium.org, tandrii@chromium.org
> NOTRY=true
>
> Committed: https://crrev.com/51d6d619330080a76c5bc7a2ebdafebc6a808aa8
> Cr-Commit-Position: refs/heads/master@{#32453}

TBR=sergiyb@chromium.org,tandrii@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=chromium:561530

Review URL: https://codereview.chromium.org/1485813004

Cr-Commit-Position: refs/heads/master@{#32464}
2015-12-01 13:55:47 +00:00
hpayer
672b49119b Revert of [heap] Remove eager shortcut in JSFunction visitor. (patchset #1 id:1 of https://codereview.chromium.org/1476223002/ )
Reason for revert:
Still investigating bad canary.

Original issue's description:
> [heap] Remove eager shortcut in JSFunction visitor.
>
> This removes an optimization in the static JSFunction visitor that
> eagerly marked through to the SharedFunctionInfo for code flushing
> candidates. This causes all processing in VisitJSFunction to be
> side-stepped and hence might cause leaks.
>
> R=hpayer@chromium.org
>
> Committed: https://crrev.com/a29f0576c32e8fda90bf7ab19c6d170568150a7f
> Cr-Commit-Position: refs/heads/master@{#32332}

TBR=mstarzinger@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1488063002

Cr-Commit-Position: refs/heads/master@{#32463}
2015-12-01 13:32:55 +00:00
hpayer
aa24a3135e Revert of [heap] Refactor evacuation for young and old gen into visitors. (patchset #5 id:80001 of https://codereview.chromium.org/1470253002/ )
Reason for revert:
Still investigating bad canary.

Original issue's description:
> [heap] Refactor evacuation for young and old gen into visitors.
>
> Create a visitor for evacuating objects for young and old generation. This is
> the first step of preparing a task to process, both,  newspace and oldspace
> pages in parallel.
>
> BUG=chromium:524425
> LOG=N
>
> Committed: https://crrev.com/138d9bae5d7014e0d205634a49b5eac3697744c8
> Cr-Commit-Position: refs/heads/master@{#32349}

TBR=mlippautz@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=chromium:524425

Review URL: https://codereview.chromium.org/1483393002

Cr-Commit-Position: refs/heads/master@{#32462}
2015-12-01 13:31:18 +00:00
hpayer
d3faef8658 Revert of [heap] Cleanup mark bit usage. (patchset #1 id:1 of https://codereview.chromium.org/1474203003/ )
Reason for revert:
Still investigating bad canary.

Original issue's description:
> [heap] Cleanup mark bit usage.
>
> BUG=
>
> Committed: https://crrev.com/5874ac783ff9bc4bb4b2fda81f5077f06619f96c
> Cr-Commit-Position: refs/heads/master@{#32362}

TBR=mlippautz@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=

Review URL: https://codereview.chromium.org/1490753003

Cr-Commit-Position: refs/heads/master@{#32461}
2015-12-01 13:29:46 +00:00
hpayer
9c60ddc60e Revert of [heap] Unify evacuating an object for new and old generation. (patchset #2 id:20001 of https://codereview.chromium.org/1481873002/ )
Reason for revert:
Still investigating bad canary.

Original issue's description:
> [heap] Unify evacuating an object for new and old generation.
>
> BUG=chromium:524425
> LOG=N
>
> Committed: https://crrev.com/afb8bcce8ba889280ed747eb218d287ddd233b4a
> Cr-Commit-Position: refs/heads/master@{#32365}

TBR=mlippautz@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=chromium:524425

Review URL: https://codereview.chromium.org/1483963004

Cr-Commit-Position: refs/heads/master@{#32460}
2015-12-01 13:28:58 +00:00
hpayer
72ae472ccc Revert of [heap] Remove live weak cells from weak cell list when finalizing incremental marking. (patchset #3 id:40001 of https://codereview.chromium.org/1474303002/ )
Reason for revert:
Still investigating bad canary.

Original issue's description:
> [heap] Remove live weak cells from weak cell list when finalizing incremental marking.
>
> BUG=chromium:548562
> LOG=n
>
> Committed: https://crrev.com/6190c608c8f3ced0f00ff53965e115b78646cecd
> Cr-Commit-Position: refs/heads/master@{#32372}

TBR=ulan@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=chromium:548562

Review URL: https://codereview.chromium.org/1481383004

Cr-Commit-Position: refs/heads/master@{#32459}
2015-12-01 13:27:19 +00:00
neis
ebf6e92ebb Add .gdb_history to .gitignore.
R=machenbach@chromium.org
BUG=
NOTRY=true

Review URL: https://codereview.chromium.org/1486083002

Cr-Commit-Position: refs/heads/master@{#32458}
2015-12-01 12:30:48 +00:00
neis
031751d5c4 [proxies] Implement [[Set]].
R=rossberg
BUG=v8:1543
LOG=N

Review URL: https://codereview.chromium.org/1481103002

Cr-Commit-Position: refs/heads/master@{#32457}
2015-12-01 12:27:09 +00:00
bmeurer
c83db2d071 [x86] Sane default for Label::Distance on JumpIfRoot/JumpIfNotRoot.
R=jarin@chromium.org
BUG=chromium:563929
LOG=n

Review URL: https://codereview.chromium.org/1483343002

Cr-Commit-Position: refs/heads/master@{#32456}
2015-12-01 12:23:25 +00:00
mstarzinger
3d9a27517c Revert of [turbofan] Ship TurboFan with new.target references. (patchset #1 id:1 of https://codereview.chromium.org/1482733002/ )
Reason for revert:
Tanks sunspider/date-format-tofte because of the Date constructor being turbofanned.

Original issue's description:
> [turbofan] Ship TurboFan with new.target references.
>
> This correctly marks functions containing a new.target reference as
> being disabled with Crankshaft, which would have bailed out anyways.
> Also note that this will trigger TurboFan for such functions and hence
> widens the TurboFan intake valve.
>
> R=bmeurer@chromium.org
>
> Committed: https://crrev.com/2ec6fcd1520bb8a09c9924ac5498eb9b437670b0
> Cr-Commit-Position: refs/heads/master@{#32444}

TBR=bmeurer@chromium.org,rossberg@chromium.org,hablich@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1489833002

Cr-Commit-Position: refs/heads/master@{#32455}
2015-12-01 12:19:05 +00:00
jkummerow
3cb3a6fe4a [crankshaft] Fix crash when case labels inline endless loops
The fix is to bail out of compilation in that case.

BUG=chromium:551287
LOG=n
R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/1483373002

Cr-Commit-Position: refs/heads/master@{#32454}
2015-12-01 12:17:31 +00:00
machenbach
51d6d61933 [CQ] Update proto format to fix triggered builders.
Depends on https://chromereviews.googleplex.com/319777013/

BUG=chromium:561530
LOG=n
TBR=sergiyb@chromium.org, tandrii@chromium.org
NOTRY=true

Review URL: https://codereview.chromium.org/1486963002

Cr-Commit-Position: refs/heads/master@{#32453}
2015-12-01 12:00:17 +00:00
mvstanton
66d5a9df62 Provide call counts for constructor calls, surface them as a vector IC.
CallIC and CallConstructStub look so alike, at least in the feedback they gather even if the implementation differs...and CallIC has such a nice way of surfacing the feedback (CallICNexus), that there is a request to make CallConstructStub look analogous. Enter ConstructICStub.

BUG=

Review URL: https://codereview.chromium.org/1476413003

Cr-Commit-Position: refs/heads/master@{#32452}
2015-12-01 11:06:40 +00:00
jochen
17b4e7450d Mark soon-to-be-deprecated TryCatch ctor as deprecated
BUG=none
R=vogelheim@chromium.org
LOG=n

Review URL: https://codereview.chromium.org/1488563002

Cr-Commit-Position: refs/heads/master@{#32451}
2015-12-01 10:58:46 +00:00
yangguo
986412998c [debugger] only track LiveEdit if source changes.
R=hablich@chromium.org

Review URL: https://codereview.chromium.org/1486003003

Cr-Commit-Position: refs/heads/master@{#32450}
2015-12-01 10:56:31 +00:00
yangguo
2f559f210d [debugger] Remove code to predict step-in target.
R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/1474293002

Cr-Commit-Position: refs/heads/master@{#32449}
2015-12-01 10:54:15 +00:00