- 15 Jun, 2017 6 commits
-
-
Brad Fitzpatrick authored
Change-Id: I78443d5874a7667fbac78eac188d402227373da3 Reviewed-on: https://go-review.googlesource.com/45813Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Matthew Dempsky authored
Before CL 36170, we identified all function bodies that needed to be exported before writing any export data. With CL 36170, we started identifying additional functions while exporting function bodies. As a consequence, we cannot use a range-based for loop for iterating over function bodies anymore. Fixes #18895. Change-Id: I9cbefa8d311ca8c9898c8272b2ac365976b02396 Reviewed-on: https://go-review.googlesource.com/45817 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
-
Keith Randall authored
These are used by DIV[U] and MOD[U] assembly instructions. Add a test in the stdlib so we actually exercise linking to these routines. Update #19507 Change-Id: I0d8e19a53e3744abc0c661ea95486f94ec67585e Reviewed-on: https://go-review.googlesource.com/45703Reviewed-by: Cherry Zhang <cherryyz@google.com>
-
Kale Blankenship authored
Restores functionality added in https://golang.org/cl/35564/ which was lost in https://golang.org/cl/36798/ by the addition of the custom fetcher to src/cmd/pprof/pprof.go. The custom fetcher overrides the upstream default. Change-Id: Ic71e5e475d043276d916298ab5acb5c9b9ad063e Reviewed-on: https://go-review.googlesource.com/45812Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Brad Fitzpatrick authored
I thought I was almost done, but had forgot the tools section, hidden in comments. Move the comments to a <pre> block, so it's visible in the HTML. Updates #20587 Change-Id: I1dc22c63d9ee297e44bbb742f03b4a722247dbe8 Reviewed-on: https://go-review.googlesource.com/45811Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Russ Cox authored
Copy-and-paste bug was putting scripts in the categories map. Fixes #18186. Change-Id: Ife9d9bdd346fe24e578dbb2a0aac7ef6e889ae68 Reviewed-on: https://go-review.googlesource.com/45830 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
- 14 Jun, 2017 30 commits
-
-
Brad Fitzpatrick authored
Only one TODO remains, for pprof changes. Updates #20587 Change-Id: Ib67b23adc7851cc96455b0c20649c8e565a4f92a Reviewed-on: https://go-review.googlesource.com/45810Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Brad Fitzpatrick authored
Updates #18059 Updates #20587 Change-Id: Icbb4c7cb201ac51d2cc6066620b47ba09ff6fe65 Reviewed-on: https://go-review.googlesource.com/45780Reviewed-by: Chris Broadfoot <cbro@golang.org>
-
Brad Fitzpatrick authored
Updates to CL 45698 Updates #19510 Change-Id: Iec7a455b6c4d5f96d0b674459bf1455c99102d62 Reviewed-on: https://go-review.googlesource.com/45779Reviewed-by: Rob Pike <r@golang.org>
-
Robert Griesemer authored
The existing code used Type.String() to obtain the name of a type; specifically type reflect.Method in this case. However, Type.String() formatting is intended for error messages and uses the format pkgpath.name instead of pkgname.name if a package (in this case package reflect) is imported multiple times. As a result, the reflect.Method type detection failed under peculiar circumstances (see the included test case). Thanks to https://github.com/ericlagergren for tracking down an easy way to make the bug disappear (which in turn directly led to the underlying cause). Fixes #19028. Change-Id: I1b9c5dfd183260a9be74969fe916a94146fc36da Reviewed-on: https://go-review.googlesource.com/45777Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
-
Brad Fitzpatrick authored
The check that the go tool version matched the go compiler version was too aggressive and didn't cover the bootstrapping case with make.bash. We never noticed because we never had a VERSION file in place. Repro: $ echo "go1.9beta1" > $GOROOT/VERSION $ cd $GOROOT/src $ ./make.bash No test, because x/build/cmd/release catches it. Updates #19064 Fixes #20674 Change-Id: Ibdd7a92377f4cc77d71ed548f02d48bde6550f67 Reviewed-on: https://go-review.googlesource.com/45778Reviewed-by: Chris Broadfoot <cbro@golang.org>
-
Brad Fitzpatrick authored
Update x/net/http2 to git rev 6b17b9baf5 for: http2: stop rejecting outgoing paths beginning with two slashes https://golang.org/cl/45773 This also uses an updated version of x/tools/cmd/bundle (CL 45190) that fixes an edge case where it used to drop some comments. Updates #20627 Fixes #19103 Change-Id: I450d61485e66098f4f8a79954f729f7bcd85856f Reviewed-on: https://go-review.googlesource.com/45700 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Chris Broadfoot <cbro@golang.org>
-
Chris Broadfoot authored
Change-Id: I27aa87607aa82b400411a60c6bdb6f9a42ff97c1 Reviewed-on: https://go-review.googlesource.com/45776 Run-TryBot: Chris Broadfoot <cbro@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Chris Broadfoot authored
Change-Id: I824fc5a62977140ccc62d55e8b42cfd01da935e9 Reviewed-on: https://go-review.googlesource.com/45774Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Brad Fitzpatrick authored
Add Adam Bender (corporate CLA for Google Inc.) Add Ahmet Alp Balkan (corporate CLA for Google Inc.) Add Aishraj Dahal (individual CLA) Add Alexey Neganov (individual CLA) Add Andrew Benton (individual CLA) Add Bartosz Grzybowski (individual CLA) Add Ben Shi (individual CLA) Add Brandon Bennett (corporate CLA for Facebook, Inc.) Add Brian Starke (individual CLA) Add Bulat Gaifullin (individual CLA) Add Carl Henrik Lunde (individual CLA) Add Carlisia Campos (individual CLA) Add Carlo Alberto Ferraris (individual CLA) Add Carolyn Van Slyck (individual CLA) Add Chew Choon Keat (individual CLA) Add Chris Biscardi (individual CLA) Add Damien Lespiau (corporate CLA for Intel Corporation) Add David NewHamlet (individual CLA) Add Dieter Plaetinck (corporate CLA for RainTank) Add Dominic Green (individual CLA) Add Eitan Adler (individual CLA) Add Evgeniy Polyakov (individual CLA) Add Ewan Valentine (individual CLA) Add Fangming Fang (corporate CLA for ARM Ltd.) Add Felipe Oliveira (individual CLA) Add Filip Gruszczyński (individual CLA) Add Gengliang Wang (individual CLA) Add George Gkirtsou (individual CLA) Add Gregory Man (individual CLA) Add Hauke Löffler (individual CLA) Add Heschi Kreinick (corporate CLA for Google Inc.) Add Hongfei Tan (individual CLA) Add Hugues Bruant (individual CLA) Add Ibrahim AshShohail (individual CLA) Add James Neve (individual CLA) Add James Smith (individual CLA) Add Jamie Stackhouse (individual CLA) Add Jan Berktold (individual CLA) Add Jeff Johnson (corporate CLA for Google Inc.) Add Joe Richey (corporate CLA for Google Inc.) Add Johan Brandhorst (individual CLA) Add Jonathan Stacks (individual CLA) Add Jordan Krage (individual CLA) Add Josselin Costanzi (individual CLA) Add Joël Stemmer (corporate CLA for Google Inc.) Add Julio Montes (corporate CLA for Intel Corporation) Add Kamil Chmielewski (individual CLA) Add Karoly Negyesi (individual CLA) Add Keiji Yoshida (individual CLA) Add Kirill Smelkov (corporate CLA for Nexedi) Add Koichi Shiraishi (individual CLA) Add Kris Nova (individual CLA) Add Kyrylo Silin (individual CLA) Add Lars Jeppesen (individual CLA) Add Lars Wiegman (individual CLA) Add Laurie Clark-Michalek (individual CLA) Add Lion Yang (individual CLA) Add Lorenzo Masini (individual CLA) Add Lucas Clemente (corporate CLA for Google Inc.) Add Marcelo E. Magallon (individual CLA) Add Mark Adams (individual CLA) Add Mark Harrison (corporate CLA for Google Inc.) Add Mark Ryan (corporate CLA for Intel Corporation) Add Martin Lindhe (individual CLA) Add Marwan Sulaiman (individual CLA) Add Matt Blair (individual CLA) Add Matt Harden (individual CLA) Add Matt Strong (individual CLA) Add Mike Wiacek (corporate CLA for Google Inc.) Add Milutin Jovanović (individual CLA) Add Monis Khan (corporate CLA for Red Hat, Inc.) Add Mostyn Bramley-Moore (individual CLA) Add Mura Li (individual CLA) Add Máté Gulyás (individual CLA) Add Nathan Caza (individual CLA) Add Nicholas Maniscalco (individual CLA) Add Nick Kubala (corporate CLA for Google Inc.) Add Nick Miyake (individual CLA) Add Niklas Schnelle (individual CLA) Add Patrick Pelletier (individual CLA) Add Paul Jolly (individual CLA) Add Paulo Flabiano Smorigo (corporate CLA for IBM) Add Peter Nguyen (individual CLA) Add Pravendra Singh (individual CLA) Add Raymond Kazlauskas (individual CLA) Add Remi Gillig (individual CLA) Add Sam Boyer (individual CLA) Add Sean Chittenden (corporate CLA for Joyent, Inc.) Add Sean Christopherson (corporate CLA for Intel Corporation) Add Shintaro Kaneko (individual CLA) Add Takuto Ikuta (corporate CLA for Google Inc.) Add Thomas Bonfort (individual CLA) Add Toshiki Shima (individual CLA) Add Trey Roessig (individual CLA) Add Wade Simmons (individual CLA) Add Wei Xiao (corporate CLA for ARM Ltd.) Add Weichao Tang (individual CLA) Add Will Storey (individual CLA) Add Wu Yunzhou (individual CLA) Add Xu Fee (individual CLA) Add Zach Bintliff (individual CLA) Add Zak (individual CLA) Add Zellyn Hunter (corporate CLA for Square, Inc.) Add Максим Федосеев (individual CLA) Add 张嵩 (individual CLA) Updates #12042 Change-Id: I43922a9489828e519e480f8fc1abc92863e0abcc Reviewed-on: https://go-review.googlesource.com/45770Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Brad Fitzpatrick authored
Fixes #19695 Change-Id: Ie5103f7905969e25dba6e5fb37344b70e807fc69 Reviewed-on: https://go-review.googlesource.com/45702 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Brad Fitzpatrick authored
Fixes #17615 Change-Id: I7f88c0c6579c79007492e765d1b5ca4f28d19575 Reviewed-on: https://go-review.googlesource.com/45771Reviewed-by: Russ Cox <rsc@golang.org>
-
thoeni authored
Marshal must process unexported embedded fields of struct type, looking for exported fields in those structs. However, it must not process unexported embedded fields of non-struct type. For example, consider: type t1 struct { X int } type t2 int type T struct { t1 t2 } When considering T, Marshal must process t1 to find t1.X. Marshal must not process t2, but it was. Fix that. Fixes #18009 Change-Id: I62ba0b65ba30fd927990e101a26405a9998787a3 Reviewed-on: https://go-review.googlesource.com/33773 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
-
Brad Fitzpatrick authored
Updates #15418 (the original bug, fixed by https://golang.org/cl/23570) Fixes #19460 (round two) Change-Id: Iac4447daabb56e3b470046c489c22d588c20163e Reviewed-on: https://go-review.googlesource.com/45697Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Heschi Kreinick authored
Change-Id: I956873854724e8afed460f7ff3a657d68ec20fa1 Reviewed-on: https://go-review.googlesource.com/45755Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Keith Randall authored
Also add runtime· prefixes to the code that is still used. Fixes #19507 Change-Id: Ib6da6b2a9e398061d3f93958ee1258295b6cc33b Reviewed-on: https://go-review.googlesource.com/45699Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Ian Lance Taylor authored
The test requires pthreads. Fixes #20666. Change-Id: Icb2400250a80cdad6680cd1ef6c18ef7343d5e29 Reviewed-on: https://go-review.googlesource.com/45701 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-
Brad Fitzpatrick authored
Fixes #19510 (good details therein) Change-Id: Id28b66d91435d839fd79eeed486527cc77257c12 Reviewed-on: https://go-review.googlesource.com/45698Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Ian Lance Taylor authored
With current GCC a macro that refers to another macro can report an error on the macro definition line, with a note on the use. When cgo is trying to decide which line an error refers to, it is looking at the uses. So if we see an error on a line that we don't recognize followed by a note on a line that we do recognize, treat the note as an error. Fixes #20125. Change-Id: I389cd0eb7d56ad2d54bef70e278d9f76c4d36448 Reviewed-on: https://go-review.googlesource.com/44290 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Hiroshi Ioka <hirochachacha@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Brad Fitzpatrick authored
Fixes #17802 Change-Id: I245552534c3e21d95c569ac7118ba289244ba11d Reviewed-on: https://go-review.googlesource.com/45652Reviewed-by: Steve Francia <spf@golang.org>
-
Samuel Tan authored
Predefined escapers (i.e. "html" and "urlquery") should only occur in Identifier nodes, and never in Field or Chain nodes, since these are global functions that return string values (see inline comments for more details). Therefore, skip Chain and Field nodes when searching for predefined escapers in template pipelines. Also, make a non-functional change two existing test cases to avoid giving the impression that it is valid to reference a field of a predefined escaper. Fixes #20323 Change-Id: I34f722f443c778699fcdd575dc3e0fd1fd6f2eb3 Reviewed-on: https://go-review.googlesource.com/43296Reviewed-by: Samuel Tan <samueltan@google.com> Reviewed-by: Mike Samuel <mikesamuel@gmail.com> Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-
Alberto Donizetti authored
Updates #20587 Change-Id: I3d65a0124157990b302db8879ee1a4941124ea11 Reviewed-on: https://go-review.googlesource.com/45730Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-
Austin Clements authored
Currently, semrelease1 readies the next waiter before recording a mutex event. However, if the next waiter is expecting to look at the mutex profile, as is the case in TestMutexProfile, this may delay recording the event too much. Swap the order of these operations so semrelease1 records the mutex event before readying the next waiter. This also means readying the next waiter is the very last thing semrelease1 does, which seems appropriate. Fixes #19139. Change-Id: I1a62063599fdb5d49bd86061a180c0a2d659474b Reviewed-on: https://go-review.googlesource.com/45751 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Peter Weinberger <pjw@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
-
Lynn Boger authored
When using golang on ppc64le there have been issues when building executables that generate extremely large text sections. This is due to the call instruction and the limitation on the offset field, which is smaller than most platforms. If the size of the call target offset is too big for the offset field in the call instruction, then link errors can occur. The original solution to this problem in golang was to split the text section when it became too large, allowing the external (GNU) linker to insert the necessary stub to handle the long call. That worked fine until the another size limit for the program size was hit, where a plt_branch was created instead of a long branch. In that case the plt_branch code sequence expects r2 to contain the address of the TOC, but when golang creates dynamic executables by default (-buildmode=exe) r2 does not always contain the address of the TOC and as a result when building programs that reach this extremely large size, a runtime SEGV or SIGILL can occur due to branching to a bad address. When using internal linking, trampolines are generated to handle the long calls but the text sections are not split. With this change, text sections will still be split approrpriately with external linking but if the buildmode being used does not maintain r2 as the TOC addresses, then trampolines will be created for those calls. Fixes #20497 Change-Id: If5400b0f86c2c08e106b332be6db0b259b07d93d Reviewed-on: https://go-review.googlesource.com/45130 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
-
Ian Lance Taylor authored
Block all signals during a fork. In the parent process, after the fork, restore the signal mask. In the child process, reset all currently handled signals to the default handler, and then restore the signal mask. The effect of this is that the child will be operating using the same signal regime as the program it is about to exec, as exec resets all non-ignored signals to the default, and preserves the signal mask. We do this so that in the case of a signal sent to the process group, the child process will not try to run a signal handler while in the precarious state after a fork. Fixes #18600. Change-Id: I9f39aaa3884035908d687ee323c975f349d5faaa Reviewed-on: https://go-review.googlesource.com/45471 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
-
Alan Donovan authored
Before, all accesses to the lines and infos tables of each File were serialized by the lock of the owning FileSet, causing parsers running in parallel to contend. Now, each File has its own mutex. This fixes a data race in (*File).PositionFor, which used to call f.position then f.unpack without holding the mutex's lock. Fixes golang/go#18348 Change-Id: Iaa5989b2eba88a7fb2e91c1a0a8bc1e7f6497f2b Reviewed-on: https://go-review.googlesource.com/34591Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-
Brad Fitzpatrick authored
Updates #20587 Change-Id: I7effe922242db45f3ce74882d07511aaaac2f634 Reviewed-on: https://go-review.googlesource.com/45613Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Josh Bleecher Snyder authored
I was surprised to see readvarint show up in a cpu profile. Use a few simple optimizations to speed up stack copying: * Avoid making a copy of the cache.entries array or any of its elements. * Use a shift instead of a signed division in stackmapdata. * Change readvarint to return the number of bytes consumed rather than an updated slice. * Make some minor optimizations to readvarint to help the compiler. * Avoid called readvarint when the value fits in a single byte. The first and last optimizations are the most significant, although they all contribute a little. Add a benchmark for stack copying that includes lots of different functions in a recursive loop, to bust the cache. This might speed up other runtime operations as well; I only benchmarked stack copying. name old time/op new time/op delta StackCopy-8 96.4ms ± 2% 82.7ms ± 1% -14.24% (p=0.000 n=20+19) StackCopyNoCache-8 167ms ± 1% 131ms ± 1% -21.58% (p=0.000 n=20+20) Change-Id: I13d5c455c65073c73b656acad86cf8e8e3c9807b Reviewed-on: https://go-review.googlesource.com/43150 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
-
Brad Fitzpatrick authored
The path package has a reference to the path/filepath package, so add a reverse reference. And clarify the path package doesn't do Windows paths. Fixes #20117 Change-Id: I65c5ce24e600b32ea20c5821b744bd89f6aff98c Reviewed-on: https://go-review.googlesource.com/45653Reviewed-by: Jaana Burcu Dogan <jbd@google.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-
Austin Clements authored
There are currently two arrays indexed by P ID: allp and pdesc. Consolidate these by moving the pdesc fields into type p so they can be indexed off allp along with all other per-P state. For #15131. Change-Id: Ib6c4e6e7612281a1171ba4a0d62e52fd59e960b4 Reviewed-on: https://go-review.googlesource.com/45572 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
-
Hiroshi Ioka authored
Current CommentedNode cannot handle associated comments which satisfy node.End() < comment.Pos() This CL solves it. Fixes #20635 Change-Id: I58e2e3703999bb38a6ce37112e986c4b1b2eace0 Reviewed-on: https://go-review.googlesource.com/45292 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
-
- 13 Jun, 2017 4 commits
-
-
Ian Lance Taylor authored
Updates #20266. Fixes #20664. Change-Id: Ifca30409fc7971497efb6d84f3f98760157c2233 Reviewed-on: https://go-review.googlesource.com/45650Reviewed-by: Austin Clements <austin@google.com>
-
Austin Clements authored
Currently MaxGomaxprocs is 256. The previous CL saved enough per-P static space that we can quadruple MaxGomaxprocs (and hence the static size of allp) and still come out ahead. This is safe for Go 1.9. In Go 1.10 we'll eliminate the hard-coded limit entirely. Updates #15131. Change-Id: I919ea821c1ce64c27812541dccd7cd7db4122d16 Reviewed-on: https://go-review.googlesource.com/45673 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
-
Pravendra Singh authored
According to the language spec, a struct field name should be an identifier. identifier = letter { letter | unicode_digit } . letter = unicode_letter | "_" . Implements a function 'isValidFieldName(fieldName string) bool'. To check if the field name is a valid identifier or not. It will panic if the field name is invalid. It uses the non-exported function implementation 'isLetter' from the package 'scanner', used to parse an identifier. Fixes #20600. Change-Id: I1db7db1ad88cab5dbea6565be15cc7461cc56c44 Reviewed-on: https://go-review.googlesource.com/45590Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-
Emmanuel Odeke authored
I accidentally set the wrong pattern mask as * []byte("\x4F\x67\x67\x53\x00") --> "OggS", the byte pattern itself. instead of * []byte("\xFF\xFF\xFF\xFF\xFF") which was a copy-paste error. The correct pattern is described at https://mimesniff.spec.whatwg.org/#matching-an-audio-or-video-type-pattern which I was using as a reference but I mistyped. Fixes #20513 Change-Id: Ie9cb60ac7edbf03075070878775b964116ce92d0 Reviewed-on: https://go-review.googlesource.com/44336 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
-