mirror of
https://github.com/golang/go.git
synced 2026-01-29 23:22:06 +03:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9706f510a5 | ||
|
|
f50cde9a70 | ||
|
|
b616f745ef | ||
|
|
a5fb3b1f3d | ||
|
|
33e86004f1 | ||
|
|
09b28977f5 | ||
|
|
76a89d6ca0 | ||
|
|
60fdbce6fd | ||
|
|
a269e5f939 | ||
|
|
0ffc5672df | ||
|
|
b990aa0ed7 | ||
|
|
01af46f7cc | ||
|
|
eb07103a08 | ||
|
|
1fa328f8fb | ||
|
|
19c8546cd9 | ||
|
|
45265c210c | ||
|
|
b1253d24e1 | ||
|
|
8bf83b323c | ||
|
|
f454f70344 | ||
|
|
f2b7109989 | ||
|
|
9c17883f28 | ||
|
|
46a34f93a2 | ||
|
|
91de29ec8f | ||
|
|
0fdc3801bf | ||
|
|
cbc69e89b1 | ||
|
|
c4f8cb43ca | ||
|
|
fd4126ae7f | ||
|
|
3e8f6b0791 |
131
CONTRIBUTORS
131
CONTRIBUTORS
@@ -31,6 +31,7 @@ Aaron Cannon <cannona@fireantproductions.com>
|
||||
Aaron France <aaron.l.france@gmail.com>
|
||||
Aaron Jacobs <jacobsa@google.com>
|
||||
Aaron Kemp <kemp.aaron@gmail.com>
|
||||
Aaron Patterson <tenderlove@ruby-lang.org>
|
||||
Aaron Stein <aaronstein12@gmail.com>
|
||||
Aaron Torres <tcboox@gmail.com>
|
||||
Aaron Zinman <aaron@azinman.com>
|
||||
@@ -58,6 +59,7 @@ Adrian Hesketh <adrianhesketh@hushmail.com>
|
||||
Adrian Nos <nos.adrian@gmail.com>
|
||||
Adrian O'Grady <elpollouk@gmail.com>
|
||||
Adrien Bustany <adrien-xx-google@bustany.org>
|
||||
Adrien Delorme <adrien.delorme@icloud.com>
|
||||
Adrien Petel <peteladrien@gmail.com>
|
||||
Aécio Júnior <aeciodantasjunior@gmail.com>
|
||||
Aeneas Rekkas (arekkas) <aeneas@ory.am>
|
||||
@@ -114,6 +116,7 @@ Alex Zhirov <azhirov@google.com>
|
||||
Alexander Demakin <alexander.demakin@gmail.com>
|
||||
Alexander Döring <email@alexd.ch>
|
||||
Alexander F Rødseth <alexander.rodseth@appeartv.com>
|
||||
Alexander Greim <alexxx@iltempo.de>
|
||||
Alexander Guz <kalimatas@gmail.com>
|
||||
Alexander Kauer <alexander@affine.space>
|
||||
Alexander Kucherenko <alxkchr@gmail.com>
|
||||
@@ -122,6 +125,7 @@ Alexander Lourier <aml@rulezz.ru>
|
||||
Alexander Menzhinsky <amenzhinsky@gmail.com>
|
||||
Alexander Morozov <lk4d4math@gmail.com>
|
||||
Alexander Neumann <alexander@bumpern.de>
|
||||
Alexander Nohe <alex.nohe427@gmail.com>
|
||||
Alexander Orlov <alexander.orlov@loxal.net>
|
||||
Alexander Pantyukhin <apantykhin@gmail.com>
|
||||
Alexander Polcyn <apolcyn@google.com>
|
||||
@@ -149,6 +153,7 @@ Alexey Semenyuk <alexsemenyuk88@gmail.com>
|
||||
Alexis Hildebrandt <surryhill@gmail.com>
|
||||
Alexis Hunt <lexer@google.com>
|
||||
Alexis Imperial-Legrand <ail@google.com>
|
||||
Ali Farooq <ali.farooq0@pm.me>
|
||||
Ali Rizvi-Santiago <arizvisa@gmail.com>
|
||||
Aliaksandr Valialkin <valyala@gmail.com>
|
||||
Alif Rachmawadi <subosito@gmail.com>
|
||||
@@ -156,14 +161,17 @@ Allan Simon <allan.simon@supinfo.com>
|
||||
Allen Li <ayatane@google.com>
|
||||
Alok Menghrajani <alok.menghrajani@gmail.com>
|
||||
Aman Gupta <aman@tmm1.net>
|
||||
Amarjeet Anand <amarjeetanandsingh@gmail.com>
|
||||
Amir Mohammad Saied <amir@gluegadget.com>
|
||||
Amr Mohammed <merodiro@gmail.com>
|
||||
Amrut Joshi <amrut.joshi@gmail.com>
|
||||
An Long <aisk1988@gmail.com>
|
||||
An Xiao <hac@zju.edu.cn>
|
||||
Anand K. Mistry <anand@mistry.ninja>
|
||||
Anders Pearson <anders@columbia.edu>
|
||||
Anderson Queiroz <contato@andersonq.eti.br>
|
||||
André Carvalho <asantostc@gmail.com>
|
||||
André Martins <aanm90@gmail.com>
|
||||
Andre Nathan <andrenth@gmail.com>
|
||||
Andrea Nodari <andrea.nodari91@gmail.com>
|
||||
Andrea Spadaccini <spadaccio@google.com>
|
||||
@@ -187,9 +195,11 @@ Andrew Braunstein <awbraunstein@gmail.com>
|
||||
Andrew Bursavich <abursavich@gmail.com>
|
||||
Andrew Ekstedt <andrew.ekstedt@gmail.com>
|
||||
Andrew Etter <andrew.etter@gmail.com>
|
||||
Andrew G. Morgan <agm@google.com>
|
||||
Andrew Gerrand <adg@golang.org>
|
||||
Andrew Harding <andrew@spacemonkey.com>
|
||||
Andrew Jackura <ajackura@google.com>
|
||||
Andrew Louis <alouis@digitalocean.com>
|
||||
Andrew Lutomirski <andy@luto.us>
|
||||
Andrew Medvedev <andrew.y.medvedev@gmail.com>
|
||||
Andrew Pilloud <andrewpilloud@igneoussystems.com>
|
||||
@@ -219,6 +229,7 @@ Andy Lindeman <andy@lindeman.io>
|
||||
Andy Maloney <asmaloney@gmail.com>
|
||||
Andy Pan <panjf2000@gmail.com>
|
||||
Andy Walker <walkeraj@gmail.com>
|
||||
Andy Wang <cbeuw.andy@gmail.com>
|
||||
Andzej Maciusovic <andzej.maciusovic@gmail.com>
|
||||
Anfernee Yongkun Gui <anfernee.gui@gmail.com>
|
||||
Angelo Bulfone <mbulfone@gmail.com>
|
||||
@@ -226,6 +237,7 @@ Anh Hai Trinh <anh.hai.trinh@gmail.com>
|
||||
Anit Gandhi <anitgandhi@gmail.com>
|
||||
Ankit Goyal <ankit3goyal@gmail.com>
|
||||
Anmol Sethi <anmol@aubble.com>
|
||||
Annirudh Prasad <annirudh@wandb.com>
|
||||
Anschel Schaffer-Cohen <anschelsc@gmail.com>
|
||||
Anthony Alves <cvballa3g0@gmail.com>
|
||||
Anthony Canino <anthony.canino1@gmail.com>
|
||||
@@ -239,15 +251,18 @@ Anthony Woods <awoods@raintank.io>
|
||||
Antoine GIRARD <sapk@sapk.fr>
|
||||
Antoine Martin <antoine97.martin@gmail.com>
|
||||
Anton Gyllenberg <anton@iki.fi>
|
||||
Anton Kuklin <anton.a.kuklin@gmail.com>
|
||||
Antonin Amand <antonin.amand@gmail.com>
|
||||
Antonio Antelo <aantelov87@gmail.com>
|
||||
Antonio Bibiano <antbbn@gmail.com>
|
||||
Antonio Huete Jimenez <tuxillo@quantumachine.net>
|
||||
Antonio Murdaca <runcom@redhat.com>
|
||||
Antonio Troina <thoeni@gmail.com>
|
||||
Anze Kolar <me@akolar.com>
|
||||
Aofei Sheng <aofei@aofeisheng.com>
|
||||
Apisak Darakananda <pongad@gmail.com>
|
||||
Aram Hăvărneanu <aram@mgk.ro>
|
||||
Araragi Hokuto <kanseihonbucho@protonmail.com>
|
||||
Arash Bina <arash@arash.io>
|
||||
Arda Güçlü <ardaguclu@gmail.com>
|
||||
Areski Belaid <areski@gmail.com>
|
||||
@@ -273,6 +288,7 @@ Audrius Butkevicius <audrius.butkevicius@gmail.com>
|
||||
Augusto Roman <aroman@gmail.com>
|
||||
Aulus Egnatius Varialus <varialus@gmail.com>
|
||||
Aurélien Rainone <aurelien.rainone@gmail.com>
|
||||
Aurélio A. Heckert <aurium@gmail.com>
|
||||
Austin Clements <austin@google.com> <aclements@csail.mit.edu>
|
||||
Avi Flax <avi@timehop.com>
|
||||
awaw fumin <awawfumin@gmail.com>
|
||||
@@ -315,6 +331,7 @@ Benoit Sigoure <tsunanet@gmail.com>
|
||||
Berengar Lehr <Berengar.Lehr@gmx.de>
|
||||
Berkant Ipek <41230766+0xbkt@users.noreply.github.com>
|
||||
Bharath Thiruveedula <tbharath91@gmail.com>
|
||||
Bhavin Gandhi <bhavin7392@gmail.com>
|
||||
Bill Neubauer <wcn@golang.org> <wcn@google.com> <bill.neubauer@gmail.com>
|
||||
Bill O'Farrell <billo@ca.ibm.com>
|
||||
Bill Prin <waprin@google.com>
|
||||
@@ -322,6 +339,7 @@ Bill Thiede <couchmoney@gmail.com>
|
||||
Bill Zissimopoulos <billziss@navimatics.com>
|
||||
Billie Harold Cleek <bhcleek@gmail.com>
|
||||
Billy Lynch <wlynch@google.com>
|
||||
Billy Zaelani Malik <m.billyzaelani@gmail.com>
|
||||
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
|
||||
Bjorn Tillenius <bjorn@tillenius.me>
|
||||
Bjorn Tipling <bjorn.tipling@gmail.com>
|
||||
@@ -331,12 +349,15 @@ Blake Mesdag <blakemesdag@gmail.com>
|
||||
Blake Mizerany <blake.mizerany@gmail.com>
|
||||
Blixt <me@blixt.nyc>
|
||||
Bob Briski <rbriski@gmail.com>
|
||||
Bob McNaughton <bobmcn@gmail.com>
|
||||
Bob Potter <bobby.potter@gmail.com>
|
||||
Bobby DeSimone <bobbydesimone@gmail.com>
|
||||
Bobby Powers <bobbypowers@gmail.com>
|
||||
Boqin Qin <bobbqqin@gmail.com>
|
||||
Boris Nagaev <nagaev@google.com>
|
||||
Borja Clemente <borja.clemente@gmail.com>
|
||||
Brad Burch <brad.burch@gmail.com>
|
||||
Brad Erickson <bderickson@gmail.com>
|
||||
Brad Fitzpatrick <bradfitz@golang.org> <bradfitz@gmail.com>
|
||||
Brad Garcia <bgarcia@golang.org>
|
||||
Brad Jones <rbjones@google.com>
|
||||
@@ -351,6 +372,7 @@ Brandon Bennett <bbennett@fb.com>
|
||||
Brandon Gilmore <varz@google.com>
|
||||
Brandon Philips <brandon@ifup.org>
|
||||
Brandon Ryan <bjryan19@gmail.com>
|
||||
Brayden Cloud <bcloud@google.com>
|
||||
Brendan Daniel Tracey <tracey.brendan@gmail.com>
|
||||
Brendan O'Dea <bod@golang.org>
|
||||
Brett Cannon <bcannon@gmail.com>
|
||||
@@ -390,6 +412,7 @@ Carlos Castillo <cookieo9@gmail.com>
|
||||
Carlos Cirello <uldericofilho@gmail.com>
|
||||
Carlos Eduardo <me@carlosedp.com>
|
||||
Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
|
||||
Carlos Iriarte <ciriarte@gmail.com>
|
||||
Carlos Souza <carloshrsouza@gmail.com>
|
||||
Carolyn Van Slyck <me@carolynvanslyck.com>
|
||||
Carrie Bynon <cbynon@gmail.com>
|
||||
@@ -405,6 +428,7 @@ Chad Rosier <mrosier.qdt@qualcommdatacenter.com>
|
||||
ChaiShushan <chaishushan@gmail.com>
|
||||
Changkun Ou <hi@changkun.us>
|
||||
Channing Kimble-Brown <channing@golang.org>
|
||||
Chao Xu <xuchao@google.com>
|
||||
Charles Fenwick Elliott <Charles@FenwickElliott.io>
|
||||
Charles Kenney <charlesc.kenney@gmail.com>
|
||||
Charles L. Dorian <cldorian@gmail.com>
|
||||
@@ -426,6 +450,7 @@ Chris Howey <howeyc@gmail.com>
|
||||
Chris Hundt <hundt@google.com>
|
||||
Chris Jones <chris@cjones.org> <chris.jones.yar@gmail.com>
|
||||
Chris Kastorff <encryptio@gmail.com>
|
||||
Chris Le Roy <brompwnie@users.noreply.github.com>
|
||||
Chris Lennert <calennert@gmail.com>
|
||||
Chris Liles <caveryliles@gmail.com>
|
||||
Chris Manghane <cmang@golang.org>
|
||||
@@ -475,6 +500,7 @@ Conrad Meyer <cemeyer@cs.washington.edu>
|
||||
Conrado Gouvea <conradoplg@gmail.com>
|
||||
Constantin Konstantinidis <constantinkonstantinidis@gmail.com>
|
||||
Corey Thomasson <cthom.lists@gmail.com>
|
||||
Corne van der Plas <vdplas@gmail.com>
|
||||
Cosmos Nicolaou <cnicolaou@google.com>
|
||||
Costin Chirvasuta <ctin@google.com>
|
||||
Craig Citro <craigcitro@google.com>
|
||||
@@ -506,9 +532,11 @@ Daniel Ingram <ingramds@appstate.edu>
|
||||
Daniel Johansson <dajo2002@gmail.com>
|
||||
Daniel Kerwin <d.kerwin@gini.net>
|
||||
Daniel Krech <eikeon@eikeon.com>
|
||||
Daniel Kumor <rdkumor@gmail.com>
|
||||
Daniel Langner <s8572327@gmail.com>
|
||||
Daniel Lidén <daniel.liden.87@gmail.com>
|
||||
Daniel Lublin <daniel@lublin.se>
|
||||
Daniel Mangum <georgedanielmangum@gmail.com>
|
||||
Daniel Martí <mvdan@mvdan.cc>
|
||||
Daniel Morsing <daniel.morsing@gmail.com>
|
||||
Daniel Nadasi <dnadasi@google.com>
|
||||
@@ -519,6 +547,8 @@ Daniel Speichert <daniel@speichert.pl>
|
||||
Daniel Theophanes <kardianos@gmail.com>
|
||||
Daniel Upton <daniel@floppy.co>
|
||||
Daniela Petruzalek <daniela.petruzalek@gmail.com>
|
||||
Danish Dua <danishdua@google.com>
|
||||
Danish Prakash <grafitykoncept@gmail.com>
|
||||
Danny Rosseau <daniel.rosseau@gmail.com>
|
||||
Daria Kolistratova <daria.kolistratova@intel.com>
|
||||
Darien Raymond <admin@v2ray.com>
|
||||
@@ -542,6 +572,7 @@ David Brophy <dave@brophy.uk>
|
||||
David Bürgin <676c7473@gmail.com>
|
||||
David Calavera <david.calavera@gmail.com>
|
||||
David Carlier <devnexen@gmail.com>
|
||||
David Carter <fresco.raja@gmail.com>
|
||||
David Chase <drchase@google.com>
|
||||
David Covert <davidhcovert@gmail.com>
|
||||
David Crawshaw <david.crawshaw@zentus.com> <crawshaw@google.com> <crawshaw@golang.org>
|
||||
@@ -550,6 +581,7 @@ David Finkel <david.finkel@gmail.com>
|
||||
David Forsythe <dforsythe@gmail.com>
|
||||
David G. Andersen <dave.andersen@gmail.com>
|
||||
David Glasser <glasser@meteor.com>
|
||||
David Golden <david@autopragmatic.com>
|
||||
David Heuschmann <heuschmann.d@gmail.com>
|
||||
David Howden <dhowden@gmail.com>
|
||||
David Hubbard <dsp@google.com>
|
||||
@@ -574,6 +606,7 @@ David Volquartz Lebech <david@lebech.info>
|
||||
David Wimmer <davidlwimmer@gmail.com>
|
||||
Davies Liu <davies.liu@gmail.com>
|
||||
Davor Kapsa <davor.kapsa@gmail.com>
|
||||
Dean Eigenmann <7621705+decanus@users.noreply.github.com>
|
||||
Dean Prichard <dean.prichard@gmail.com>
|
||||
Deepak Jois <deepak.jois@gmail.com>
|
||||
Denis Bernard <db047h@gmail.com>
|
||||
@@ -619,6 +652,7 @@ Dmitry Mottl <dmitry.mottl@gmail.com>
|
||||
Dmitry Neverov <dmitry.neverov@gmail.com>
|
||||
Dmitry Savintsev <dsavints@gmail.com>
|
||||
Dmitry Yakunin <nonamezeil@gmail.com>
|
||||
Doga Fincan <doga@icloud.com>
|
||||
Domas Tamašauskas <puerdomus@gmail.com>
|
||||
Domen Ipavec <domen@ipavec.net>
|
||||
Dominic Green <dominicgreen1@gmail.com>
|
||||
@@ -642,6 +676,7 @@ Dustin Sallings <dsallings@gmail.com>
|
||||
Dustin Shields-Cloues <dcloues@gmail.com>
|
||||
Dvir Volk <dvir@everything.me> <dvirsky@gmail.com>
|
||||
Dylan Waits <dylan@waits.io>
|
||||
Ed Schouten <ed@nuxi.nl>
|
||||
Edan Bedrik <3d4nb3@gmail.com>
|
||||
Eddie Scholtz <escholtz@google.com>
|
||||
Eden Li <eden.li@gmail.com>
|
||||
@@ -659,11 +694,13 @@ Elena Grahovac <elena@grahovac.me>
|
||||
Eli Bendersky <eliben@google.com>
|
||||
Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
|
||||
Elliot Morrison-Reed <elliotmr@gmail.com>
|
||||
Ellison Leão <ellisonleao@gmail.com>
|
||||
Emerson Lin <linyintor@gmail.com>
|
||||
Emil Hessman <emil@hessman.se>
|
||||
Emil Mursalimov <mursalimovemeel@gmail.com>
|
||||
Emilien Kenler <hello@emilienkenler.com>
|
||||
Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
|
||||
Emrecan Bati <emrecanbati@gmail.com>
|
||||
Eno Compton <enocom@google.com>
|
||||
Eoghan Sherry <ejsherry@gmail.com>
|
||||
Eric Biggers <ebiggers@google.com>
|
||||
@@ -682,6 +719,7 @@ Eric Rescorla <ekr@rtfm.com>
|
||||
Eric Roshan-Eisner <eric.d.eisner@gmail.com>
|
||||
Eric Rutherford <erutherford@gmail.com>
|
||||
Eric Rykwalder <e.rykwalder@gmail.com>
|
||||
Erick Tryzelaar <etryzelaar@google.com>
|
||||
Erik Aigner <aigner.erik@gmail.com>
|
||||
Erik Dubbelboer <erik@dubbelboer.com>
|
||||
Erik St. Martin <alakriti@gmail.com>
|
||||
@@ -694,6 +732,7 @@ Esko Luontola <esko.luontola@gmail.com>
|
||||
Ethan Burns <eaburns@google.com>
|
||||
Ethan Miller <eamiller@us.ibm.com>
|
||||
Euan Kemp <euank@euank.com>
|
||||
Eugene Formanenko <mo4islona@gmail.com>
|
||||
Eugene Kalinin <e.v.kalinin@gmail.com>
|
||||
Evan Broder <evan@stripe.com>
|
||||
Evan Brown <evanbrown@google.com>
|
||||
@@ -705,6 +744,7 @@ Evan Kroske <evankroske@google.com>
|
||||
Evan Martin <evan.martin@gmail.com>
|
||||
Evan Phoenix <evan@phx.io>
|
||||
Evan Shaw <chickencha@gmail.com>
|
||||
Evgeniy Kulikov <tuxuls@gmail.com>
|
||||
Evgeniy Polyakov <zbr@ioremap.net>
|
||||
Ewan Chou <coocood@gmail.com>
|
||||
Ewan Valentine <ewan.valentine89@gmail.com>
|
||||
@@ -725,8 +765,10 @@ Fedor Indutny <fedor@indutny.com>
|
||||
Fedor Korotkiy <dartslon@gmail.com>
|
||||
Felipe Oliveira <felipeweb.programador@gmail.com>
|
||||
Felix Bünemann <Felix.Buenemann@gmail.com>
|
||||
Felix Cornelius <9767036+fcornelius@users.noreply.github.com>
|
||||
Felix Geisendörfer <haimuiba@gmail.com>
|
||||
Felix Kollmann <fk@konsorten.de>
|
||||
Ferenc Szabo <frncmx@gmail.com>
|
||||
Filip Gruszczyński <gruszczy@gmail.com>
|
||||
Filip Haglund <drathier@users.noreply.github.com>
|
||||
Filip Stanis <fstanis@google.com>
|
||||
@@ -774,6 +816,7 @@ Gary Elliott <garyelliott@google.com>
|
||||
Gaurish Sharma <contact@gaurishsharma.com>
|
||||
Gautham Thambidorai <gautham.dorai@gmail.com>
|
||||
Gauthier Jolly <gauthier.jolly@gmail.com>
|
||||
Gawen Arab <gawen.arab@c.zen.ly>
|
||||
Geert-Johan Riemer <gjr19912@gmail.com>
|
||||
Genevieve Luyt <genevieve.luyt@gmail.com>
|
||||
Gengliang Wang <ltnwgl@gmail.com>
|
||||
@@ -795,6 +838,7 @@ Gianguido Sora` <g.sora4@gmail.com>
|
||||
Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
|
||||
Giles Lean <giles.lean@pobox.com>
|
||||
Giovanni Bajo <rasky@develer.com>
|
||||
GitHub User @aca (50316549) <acadx0@gmail.com>
|
||||
GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
|
||||
GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
|
||||
GitHub User @alkesh26 (1019076) <alkesh26@gmail.com>
|
||||
@@ -805,12 +849,18 @@ GitHub User @bakape (7851952) <bakape@gmail.com>
|
||||
GitHub User @bgadrian (830001) <aditza8@gmail.com>
|
||||
GitHub User @bontequero (2674999) <bontequero@gmail.com>
|
||||
GitHub User @cch123 (384546) <buaa.cch@gmail.com>
|
||||
GitHub User @chainhelen (7046329) <chainhelen@gmail.com>
|
||||
GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
|
||||
GitHub User @cncal (23520240) <flycalvin@qq.com>
|
||||
GitHub User @DQNEO (188741) <dqneoo@gmail.com>
|
||||
GitHub User @Dreamacro (8615343) <chuainian@gmail.com>
|
||||
GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
|
||||
GitHub User @erifan (31343225) <eric.fang@arm.com>
|
||||
GitHub User @esell (9735165) <eujon.sellers@gmail.com>
|
||||
GitHub User @fatedier (7346661) <fatedier@gmail.com>
|
||||
GitHub User @frennkie (6499251) <mail@rhab.de>
|
||||
GitHub User @geedchin (11672310) <geedchin@gmail.com>
|
||||
GitHub User @GrigoriyMikhalkin (3637857) <grigoriymikhalkin@gmail.com>
|
||||
GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
|
||||
GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
|
||||
GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
|
||||
@@ -820,11 +870,13 @@ GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
|
||||
GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
|
||||
GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
|
||||
GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
|
||||
GitHub User @ly303550688 (11519839) <yang.liu636@gmail.com>
|
||||
GitHub User @madiganz (18340029) <zacharywmadigan@gmail.com>
|
||||
GitHub User @maltalex (10195391) <code@bit48.net>
|
||||
GitHub User @Matts966 (28551465) <Matts966@users.noreply.github.com>
|
||||
GitHub User @micnncim (21333876) <micnncim@gmail.com>
|
||||
GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com>
|
||||
GitHub User @nu50218 (40682920) <nu_ll@icloud.com>
|
||||
GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
|
||||
GitHub User @pityonline (438222) <pityonline@gmail.com>
|
||||
GitHub User @po3rin (29445112) <abctail30@gmail.com>
|
||||
@@ -836,6 +888,7 @@ GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
|
||||
GitHub User @skanehira (7888591) <sho19921005@gmail.com>
|
||||
GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
|
||||
GitHub User @tell-k (26263) <ffk2005@gmail.com>
|
||||
GitHub User @tennashi (10219626) <tennashio@gmail.com>
|
||||
GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
|
||||
GitHub User @uropek (39370426) <uropek@gmail.com>
|
||||
GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
|
||||
@@ -861,6 +914,7 @@ Greg Thelen <gthelen@google.com>
|
||||
Greg Ward <greg@gerg.ca>
|
||||
Grégoire Delattre <gregoire.delattre@gmail.com>
|
||||
Gregory Man <man.gregory@gmail.com>
|
||||
Gregory Petrosyan <gregory.petrosyan@gmail.com>
|
||||
Guilherme Caruso <gui.martinscaruso@gmail.com>
|
||||
Guilherme Garnier <guilherme.garnier@gmail.com>
|
||||
Guilherme Goncalves <guilhermeaugustosg@gmail.com>
|
||||
@@ -917,6 +971,7 @@ Hitoshi Mitake <mitake.hitoshi@gmail.com>
|
||||
Holden Huang <ttyh061@gmail.com>
|
||||
Hong Ruiqi <hongruiqi@gmail.com>
|
||||
Hongfei Tan <feilengcui008@gmail.com>
|
||||
Horacio Duran <horacio.duran@gmail.com>
|
||||
Horst Rutter <hhrutter@gmail.com>
|
||||
Hossein Sheikh Attar <hattar@google.com>
|
||||
Howard Zhang <howard.zhang@arm.com>
|
||||
@@ -927,6 +982,7 @@ Huan Du <i@huandu.me>
|
||||
Hugues Bruant <hugues.bruant@gmail.com>
|
||||
Huy Le <huy.dinh.le.89@gmail.com>
|
||||
Hyang-Ah Hana Kim <hakim@google.com> <hyangah@gmail.com>
|
||||
Hyoyoung Chang <hyoyoung@gmail.com>
|
||||
Ian Cottrell <iancottrell@google.com>
|
||||
Ian Davis <nospam@iandavis.com>
|
||||
Ian Gudger <ian@loosescre.ws>
|
||||
@@ -986,6 +1042,7 @@ Jake B <doogie1012@gmail.com>
|
||||
Jakob Borg <jakob@nym.se>
|
||||
Jakob Weisblat <jakobw@mit.edu>
|
||||
Jakub Čajka <jcajka@redhat.com>
|
||||
Jakub Kaczmarzyk <jakubk@mit.edu>
|
||||
Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
|
||||
Jamal Carvalho <jamal.a.carvalho@gmail.com>
|
||||
James Aguilar <jaguilar@google.com>
|
||||
@@ -1032,6 +1089,7 @@ Jan Steinke <jan.steinke@gmail.com>
|
||||
Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
|
||||
Jani Monoses <jani.monoses@ubuntu.com> <jani.monoses@gmail.com>
|
||||
Jannis Andrija Schnitzer <jannis@schnitzer.im>
|
||||
Jared Allard <jaredallard@users.noreply.github.com>
|
||||
Jared Culp <jculp14@gmail.com>
|
||||
Jaroslavas Počepko <jp@webmaster.ms>
|
||||
Jason A. Donenfeld <Jason@zx2c4.com>
|
||||
@@ -1086,8 +1144,11 @@ Jerrin Shaji George <jerrinsg@gmail.com>
|
||||
Jess Frazelle <me@jessfraz.com>
|
||||
Jesse Szwedko <jesse.szwedko@gmail.com>
|
||||
Jesús Espino <jespinog@gmail.com>
|
||||
Jia Zhan <jzhan@uber.com>
|
||||
Jiacai Liu <jiacai2050@gmail.com>
|
||||
Jianing Yu <jnyu@google.com>
|
||||
Jianqiao Li <jianqiaoli@google.com>
|
||||
Jie Ma <jienius@outlook.com>
|
||||
Jihyun Yu <yjh0502@gmail.com>
|
||||
Jim Cote <jfcote87@gmail.com>
|
||||
Jim Kingdon <jim@bolt.me>
|
||||
@@ -1135,6 +1196,7 @@ John Howard Palevich <jack.palevich@gmail.com>
|
||||
John Jeffery <jjeffery@sp.com.au>
|
||||
John Jenkins <twodopeshaggy@gmail.com>
|
||||
John Leidegren <john.leidegren@gmail.com>
|
||||
John McCabe <john@johnmccabe.net>
|
||||
John Moore <johnkenneth.moore@gmail.com>
|
||||
John Newlin <jnewlin@google.com>
|
||||
John Papandriopoulos <jpap.code@gmail.com>
|
||||
@@ -1146,6 +1208,7 @@ John Tuley <john@tuley.org>
|
||||
John Weldon <johnweldon4@gmail.com>
|
||||
Johnny Luo <johnnyluo1980@gmail.com>
|
||||
Jon Chen <jchen@justin.tv>
|
||||
Jon Johnson <jonjohnson@google.com>
|
||||
Jonas Bernoulli <jonas@bernoul.li>
|
||||
Jonathan Allie <jonallie@google.com>
|
||||
Jonathan Amsterdam <jba@google.com>
|
||||
@@ -1165,6 +1228,7 @@ Jonathon Lacher <jonathon.lacher@gmail.com>
|
||||
Jongmin Kim <atomaths@gmail.com>
|
||||
Joonas Kuorilehto <joneskoo@derbian.fi>
|
||||
Joop Kiefte <ikojba@gmail.com> <joop@kiefte.net>
|
||||
Jordan Christiansen <xordspar0@gmail.com>
|
||||
Jordan Krage <jmank88@gmail.com>
|
||||
Jordan Lewis <jordanthelewis@gmail.com>
|
||||
Jordan Liggitt <liggitt@google.com>
|
||||
@@ -1177,6 +1241,7 @@ Josa Gesell <josa@gesell.me>
|
||||
Jose Luis Vázquez González <josvazg@gmail.com>
|
||||
Joseph Bonneau <jcb@google.com>
|
||||
Joseph Holsten <joseph@josephholsten.com>
|
||||
Josh Baum <joshbaum@google.com>
|
||||
Josh Bleecher Snyder <josharian@gmail.com>
|
||||
Josh Chorlton <jchorlton@gmail.com>
|
||||
Josh Deprez <josh.deprez@gmail.com>
|
||||
@@ -1185,8 +1250,10 @@ Josh Hoak <jhoak@google.com>
|
||||
Josh Holland <jrh@joshh.co.uk>
|
||||
Josh Roppo <joshroppo@gmail.com>
|
||||
Josh Varga <josh.varga@gmail.com>
|
||||
Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com>
|
||||
Joshua Boelter <joshua.boelter@intel.com>
|
||||
Joshua Chase <jcjoshuachase@gmail.com>
|
||||
Joshua Crowgey <jcrowgey@uw.edu>
|
||||
Joshua M. Clulow <josh.clulow@joyent.com>
|
||||
Joshua Rubin <joshua@rubixconsulting.com>
|
||||
Josselin Costanzi <josselin@costanzi.fr>
|
||||
@@ -1265,6 +1332,7 @@ Kenji Yano <kenji.yano@gmail.com>
|
||||
Kenneth Shaw <kenshaw@gmail.com>
|
||||
Kenny Grant <kennygrant@gmail.com>
|
||||
Kenta Mori <zoncoen@gmail.com>
|
||||
Kerollos Magdy <kerolloz@yahoo.com>
|
||||
Ketan Parmar <ketanbparmar@gmail.com>
|
||||
Kevan Swanberg <kevswanberg@gmail.com>
|
||||
Kevin Ballard <kevin@sb.org>
|
||||
@@ -1277,10 +1345,14 @@ Kevin Malachowski <chowski@google.com>
|
||||
Kevin Ruffin <kruffin@gmail.com>
|
||||
Kevin Vu <kevin.m.vu@gmail.com>
|
||||
Kevin Zita <bleedgreenandgold@gmail.com>
|
||||
Keyan Pishdadian <kpishdadian@gmail.com>
|
||||
Kezhu Wang <kezhuw@gmail.com>
|
||||
Khosrow Moossavi <khos2ow@gmail.com>
|
||||
Kieran Colford <kieran@kcolford.com>
|
||||
Kim Shrier <kshrier@racktopsystems.com>
|
||||
Kim Yongbin <kybinz@gmail.com>
|
||||
Kir Kolyshkin <kolyshkin@gmail.com>
|
||||
Kirill Korotaev <kirillx@gmail.com>
|
||||
Kirill Motkov <Motkov.Kirill@gmail.com>
|
||||
Kirill Smelkov <kirr@nexedi.com>
|
||||
Kirill Tatchihin <kirabsuir@gmail.com>
|
||||
@@ -1308,6 +1380,7 @@ Kyle Consalus <consalus@gmail.com>
|
||||
Kyle Isom <kyle@gokyle.net>
|
||||
Kyle Jones <kyle@kyledj.com>
|
||||
Kyle Lemons <kyle@kylelemons.net> <kevlar@google.com>
|
||||
Kyle Nusbaum <kyle@datadog.com>
|
||||
Kyle Shannon <kyle@pobox.com>
|
||||
Kyle Spiers <eiais@google.com>
|
||||
Kyle Wood <kyle@kylewood.cc>
|
||||
@@ -1339,6 +1412,8 @@ Leonardo Comelli <leonardo.comelli@gmail.com>
|
||||
Leonel Quinteros <leonel.quinteros@gmail.com>
|
||||
Lev Shamardin <shamardin@gmail.com>
|
||||
Lewin Bormann <lewin.bormann@gmail.com>
|
||||
Liam Haworth <liam@haworth.id.au>
|
||||
Lily Chung <lilithkchung@gmail.com>
|
||||
Lion Yang <lion@aosc.xyz>
|
||||
Liz Rice <liz@lizrice.com>
|
||||
Lloyd Dewolf <foolswisdom@gmail.com>
|
||||
@@ -1396,6 +1471,7 @@ Marcel van Lohuizen <mpvl@golang.org>
|
||||
Marcelo Cantos <marcelo.cantos@gmail.com>
|
||||
Marcelo E. Magallon <marcelo.magallon@gmail.com>
|
||||
Marco Hennings <marco.hennings@freiheit.com>
|
||||
Marcus Weiner <marcus.weiner@gmail.com>
|
||||
Marcus Willock <crazcalm@gmail.com>
|
||||
Marga Manterola <marga@google.com>
|
||||
Mariano Cano <mariano@smallstep.com>
|
||||
@@ -1426,6 +1502,7 @@ Markus Duft <markus.duft@salomon.at>
|
||||
Markus Sonderegger <marraison@gmail.com>
|
||||
Markus Zimmermann <zimmski@gmail.com>
|
||||
Marten Seemann <martenseemann@gmail.com>
|
||||
Martin Asquino <martin.asquino@gmail.com>
|
||||
Martin Bertschler <mbertschler@gmail.com>
|
||||
Martin Garton <garton@gmail.com>
|
||||
Martin Habbecke <marhab@google.com>
|
||||
@@ -1449,6 +1526,7 @@ Maryan Hratson <gmarik@gmail.com>
|
||||
Masahiro Furudate <masahiro.furudate@gmail.com>
|
||||
Masahiro Wakame <vvakame@gmail.com>
|
||||
Masaki Yoshida <yoshida.masaki@gmail.com>
|
||||
Masaya Watanabe <sfbgwm30@gmail.com>
|
||||
Mat Byczkowski <mbyczkowski@gmail.com>
|
||||
Mat Ryer <thatmatryer@gmail.com>
|
||||
Máté Gulyás <mgulyas86@gmail.com>
|
||||
@@ -1495,6 +1573,7 @@ Max Ushakov <ushmax@gmail.com>
|
||||
Maxim Eryomenko <moeryomenko@gmail.com>
|
||||
Maxim Khitrov <max@mxcrypt.com>
|
||||
Maxim Pimenov <mpimenov@google.com>
|
||||
Maxim Pugachev <pugachev.mm@gmail.com>
|
||||
Maxim Ushakov <ushakov@google.com>
|
||||
Maxime de Roucy <maxime.deroucy@gmail.com>
|
||||
Máximo Cuadros Ortiz <mcuadros@gmail.com>
|
||||
@@ -1549,6 +1628,7 @@ Michal Bohuslávek <mbohuslavek@gmail.com>
|
||||
Michal Cierniak <cierniak@google.com>
|
||||
Michał Derkacz <ziutek@lnet.pl>
|
||||
Michal Franc <lam.michal.franc@gmail.com>
|
||||
Michał Łowicki <mlowicki@gmail.com>
|
||||
Michal Pristas <michal.pristas@gmail.com>
|
||||
Michal Rostecki <mrostecki@suse.de>
|
||||
Michalis Kargakis <michaliskargakis@gmail.com>
|
||||
@@ -1556,6 +1636,7 @@ Michel Lespinasse <walken@google.com>
|
||||
Mickael Kerjean <mickael.kerjean@gmail.com>
|
||||
Mickey Reiss <mickeyreiss@gmail.com>
|
||||
Miek Gieben <miek@miek.nl> <remigius.gieben@gmail.com>
|
||||
Miguel Acero <acero@google.com>
|
||||
Miguel Mendez <stxmendez@gmail.com>
|
||||
Miguel Molina <hi@mvader.me>
|
||||
Mihai Borobocea <MihaiBorobocea@gmail.com>
|
||||
@@ -1582,6 +1663,7 @@ Mikio Hara <mikioh.mikioh@gmail.com>
|
||||
Mikkel Krautz <mikkel@krautz.dk> <krautz@gmail.com>
|
||||
Mikołaj Baranowski <mikolajb@gmail.com>
|
||||
Milan Knezevic <milan.knezevic@mips.com>
|
||||
Milan Patel <bicelot3@gmail.com>
|
||||
Milutin Jovanović <jovanovic.milutin@gmail.com>
|
||||
MinJae Kwon <mingrammer@gmail.com>
|
||||
Miquel Sabaté Solà <mikisabate@gmail.com>
|
||||
@@ -1603,8 +1685,10 @@ Mrunal Patel <mrunalp@gmail.com>
|
||||
Muhammad Falak R Wani <falakreyaz@gmail.com>
|
||||
Muhammed Uluyol <uluyol0@gmail.com>
|
||||
Muir Manders <muir@mnd.rs>
|
||||
Mukesh Sharma <sharma.mukesh439@gmail.com>
|
||||
Mura Li <mura_li@castech.com.tw>
|
||||
Mykhailo Lesyk <mikhail@lesyk.org>
|
||||
Naman Aggarwal <aggarwal.nam@gmail.com>
|
||||
Nan Deng <monnand@gmail.com>
|
||||
Nao Yonashiro <owan.orisano@gmail.com>
|
||||
Naoki Kanatani <k12naoki@gmail.com>
|
||||
@@ -1612,6 +1696,7 @@ Nate Wilkinson <nathanwilk7@gmail.com>
|
||||
Nathan Cantelmo <n.cantelmo@gmail.com>
|
||||
Nathan Caza <mastercactapus@gmail.com>
|
||||
Nathan Dias <nathan.dias@orijtech.com>
|
||||
Nathan Fiscaletti <nathan.fiscaletti@vrazo.com>
|
||||
Nathan Humphreys <nkhumphreys@gmail.com>
|
||||
Nathan John Youngman <nj@nathany.com>
|
||||
Nathan Otterness <otternes@cs.unc.edu>
|
||||
@@ -1621,6 +1706,7 @@ Nathan Youngman <git@nathany.com>
|
||||
Nathan(yinian) Hu <nathanhu@google.com>
|
||||
Nathaniel Cook <nvcook42@gmail.com>
|
||||
Naveen Kumar Sangi <naveenkumarsangi@protonmail.com>
|
||||
Neeilan Selvalingam <neeilan96@gmail.com>
|
||||
Neelesh Chandola <neelesh.c98@gmail.com>
|
||||
Neil Lyons <nwjlyons@googlemail.com>
|
||||
Neuman Vong <neuman.vong@gmail.com>
|
||||
@@ -1661,17 +1747,20 @@ Nikita Vanyasin <nikita.vanyasin@gmail.com>
|
||||
Niklas Schnelle <niklas.schnelle@gmail.com>
|
||||
Niko Dziemba <niko@dziemba.com>
|
||||
Nikolay Turpitko <nikolay@turpitko.com>
|
||||
Nikson Kanti Paul <nikson.sust@gmail.com>
|
||||
Nils Larsgård <nilsmagnus@gmail.com>
|
||||
Nir Soffer <nirsof@gmail.com>
|
||||
Niranjan Godbole <niranjan8192@gmail.com>
|
||||
Nishanth Shanmugham <nishanth.gerrard@gmail.com>
|
||||
Noah Campbell <noahcampbell@gmail.com>
|
||||
Noah Goldman <noahg34@gmail.com>
|
||||
Noble Johnson <noblepoly@gmail.com>
|
||||
Nodir Turakulov <nodir@google.com>
|
||||
Noel Georgi <git@frezbo.com>
|
||||
Norberto Lopes <nlopes.ml@gmail.com>
|
||||
Norman B. Lancaster <qbradq@gmail.com>
|
||||
Nuno Cruces <ncruces@users.noreply.github.com>
|
||||
Obeyda Djeffal <djefobey@gmail.com>
|
||||
Odin Ugedal <odin@ugedal.com>
|
||||
Oleg Bulatov <dmage@yandex-team.ru>
|
||||
Oleg Vakheta <helginet@gmail.com>
|
||||
@@ -1689,6 +1778,7 @@ Omar Jarjur <ojarjur@google.com>
|
||||
Oryan Moshe <iamoryanmoshe@gmail.com>
|
||||
Osamu TONOMORI <osamingo@gmail.com>
|
||||
Özgür Kesim <oec-go@kesim.org>
|
||||
Pablo Caderno <kaderno@gmail.com>
|
||||
Pablo Lalloni <plalloni@gmail.com>
|
||||
Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
|
||||
Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
|
||||
@@ -1702,6 +1792,8 @@ Parker Moore <parkrmoore@gmail.com>
|
||||
Parminder Singh <parmsingh101@gmail.com>
|
||||
Pascal Dierich <pascal@pascaldierich.com>
|
||||
Pascal S. de Kloe <pascal@quies.net>
|
||||
Paschalis Tsilias <paschalis.tsilias@gmail.com>
|
||||
Pasi Tähkäpää <pasi.tahkapaa@gmail.com>
|
||||
Pat Moroney <pat@pat.email>
|
||||
Patrick Barker <barkerp@vmware.com>
|
||||
Patrick Crosby <patrick@stathat.com>
|
||||
@@ -1718,6 +1810,7 @@ Paul A Querna <paul.querna@gmail.com>
|
||||
Paul Borman <borman@google.com>
|
||||
Paul Boyd <boyd.paul2@gmail.com>
|
||||
Paul Chang <paulchang@google.com>
|
||||
Paul D. Weber <x0bdev@gmail.com>
|
||||
Paul Hammond <paul@paulhammond.org>
|
||||
Paul Hankin <paulhankin@google.com>
|
||||
Paul Jolly <paul@myitcv.org.uk>
|
||||
@@ -1743,8 +1836,10 @@ Pavel Zinovkin <pavel.zinovkin@gmail.com>
|
||||
Pavlo Sumkin <ymkins@gmail.com>
|
||||
Pawel Knap <pawelknap88@gmail.com>
|
||||
Pawel Szczur <filemon@google.com>
|
||||
Pei Xian Chee <luciolas1991@gmail.com>
|
||||
Percy Wegmann <ox.to.a.cart@gmail.com>
|
||||
Perry Abbott <perry.j.abbott@gmail.com>
|
||||
Petar Dambovaliev <petar.atanasov.1987@gmail.com>
|
||||
Petar Maymounkov <petarm@gmail.com>
|
||||
Peter Armitage <peter.armitage@gmail.com>
|
||||
Peter Bourgon <peter@bourgon.org>
|
||||
@@ -1781,6 +1876,7 @@ Philip Hofer <phofer@umich.edu>
|
||||
Philip K. Warren <pkwarren@gmail.com>
|
||||
Philip Nelson <me@pnelson.ca>
|
||||
Philipp Stephani <phst@google.com>
|
||||
Pierre Carru <pierre.carru@eshard.com>
|
||||
Pierre Durand <pierredurand@gmail.com>
|
||||
Pierre Prinetti <pierreprinetti@gmail.com>
|
||||
Pierre Roullon <pierre.roullon@gmail.com>
|
||||
@@ -1789,11 +1885,14 @@ Pieter Droogendijk <pieter@binky.org.uk>
|
||||
Pietro Gagliardi <pietro10@mac.com>
|
||||
Piyush Mishra <piyush@codeitout.com>
|
||||
Plekhanov Maxim <kishtatix@gmail.com>
|
||||
Polina Osadcha <polliosa@google.com>
|
||||
Pontus Leitzler <leitzler@gmail.com>
|
||||
Povilas Versockas <p.versockas@gmail.com>
|
||||
Prasanga Siripala <pj@pjebs.com.au>
|
||||
Prasanna Swaminathan <prasanna@mediamath.com>
|
||||
Prashant Agrawal <prashant.a.vjti@gmail.com>
|
||||
Prashant Varanasi <prashant@prashantv.com>
|
||||
Praveen Kumar <praveen+git@kumar.in>
|
||||
Pravendra Singh <hackpravj@gmail.com>
|
||||
Preetam Jinka <pj@preet.am>
|
||||
Pure White <wu.purewhite@gmail.com>
|
||||
@@ -1804,6 +1903,7 @@ Quan Yong Zhai <qyzhai@gmail.com>
|
||||
Quentin Perez <qperez@ocs.online.net>
|
||||
Quentin Renard <contact@asticode.com>
|
||||
Quentin Smith <quentin@golang.org>
|
||||
Quey-Liang Kao <s101062801@m101.nthu.edu.tw>
|
||||
Quinn Slack <sqs@sourcegraph.com>
|
||||
Quinten Yearsley <qyearsley@chromium.org>
|
||||
Quoc-Viet Nguyen <afelion@gmail.com>
|
||||
@@ -1831,6 +1931,7 @@ Reilly Watson <reillywatson@gmail.com>
|
||||
Reinaldo de Souza Jr <juniorz@gmail.com>
|
||||
Remi Gillig <remigillig@gmail.com>
|
||||
Rémy Oudompheng <oudomphe@phare.normalesup.org> <remyoudompheng@gmail.com>
|
||||
Ren Ogaki <re.yuz77777@gmail.com>
|
||||
Rens Rikkerink <Ikkerens@users.noreply.github.com>
|
||||
Rhys Hiltner <rhys@justin.tv>
|
||||
Ricardo Padilha <ricardospadilha@gmail.com>
|
||||
@@ -1842,6 +1943,8 @@ Richard Eric Gavaletz <gavaletz@gmail.com>
|
||||
Richard Gibson <richard.gibson@gmail.com>
|
||||
Richard Miller <miller.research@gmail.com>
|
||||
Richard Musiol <mail@richard-musiol.de> <neelance@gmail.com>
|
||||
Richard Ulmer <codesoap@mailbox.org>
|
||||
Richard Wilkes <wilkes@me.com>
|
||||
Rick Arnold <rickarnoldjr@gmail.com>
|
||||
Rick Hudson <rlh@golang.org>
|
||||
Rick Sayre <whorfin@gmail.com>
|
||||
@@ -1860,6 +1963,7 @@ Robert Figueiredo <robfig@gmail.com>
|
||||
Robert Griesemer <gri@golang.org>
|
||||
Robert Hencke <robert.hencke@gmail.com>
|
||||
Robert Iannucci <iannucci@google.com>
|
||||
Robert Kuska <rkuska@gmail.com>
|
||||
Robert Obryk <robryk@gmail.com>
|
||||
Robert Sesek <rsesek@google.com>
|
||||
Robert Snedegar <roberts@google.com>
|
||||
@@ -1878,6 +1982,7 @@ Roger Pau Monné <royger@gmail.com>
|
||||
Roger Peppe <rogpeppe@gmail.com>
|
||||
Rohan Challa <rohan@golang.org>
|
||||
Rohan Verma <rohanverma2004@gmail.com>
|
||||
Rohith Ravi <entombedvirus@gmail.com>
|
||||
Roland Illig <roland.illig@gmx.de>
|
||||
Roland Shoemaker <rolandshoemaker@gmail.com>
|
||||
Romain Baugue <romain.baugue@elwinar.com>
|
||||
@@ -1887,6 +1992,7 @@ Roman Shchekin <mrqtros@gmail.com>
|
||||
Ron Hashimoto <mail@h2so5.net>
|
||||
Ron Minnich <rminnich@gmail.com>
|
||||
Ross Chater <rdchater@gmail.com>
|
||||
Ross Kinsey <rossikinsey@gmail.com>
|
||||
Ross Light <light@google.com> <rlight2@gmail.com>
|
||||
Ross Smith II <ross@smithii.com>
|
||||
Rowan Marshall <rowanajmarshall@gmail.com>
|
||||
@@ -1921,6 +2027,8 @@ Sakeven Jiang <jc5930@sina.cn>
|
||||
Salmān Aljammāz <s@0x65.net>
|
||||
Sam Arnold <sarnold64@bloomberg.net>
|
||||
Sam Boyer <tech@samboyer.org>
|
||||
Sam Chen <chenxsan@gmail.com>
|
||||
Sam Cross <samgcdev@gmail.com>
|
||||
Sam Ding <samding@ca.ibm.com>
|
||||
Sam Hug <samuel.b.hug@gmail.com>
|
||||
Sam Thorogood <thorogood@google.com> <sam.thorogood@gmail.com>
|
||||
@@ -1972,6 +2080,7 @@ Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
|
||||
Sergey Arseev <sergey.arseev@intel.com>
|
||||
Sergey Dobrodey <sergey.dobrodey@synesis.ru>
|
||||
Sergey Frolov <sfrolov@google.com>
|
||||
Sergey Glushchenko <gsserge@gmail.com>
|
||||
Sergey Ivanov <ser1325@gmail.com>
|
||||
Sergey Lukjanov <me@slukjanov.name>
|
||||
Sergey Mishin <sergeymishine@gmail.com>
|
||||
@@ -1987,7 +2096,9 @@ Seth Vargo <sethvargo@gmail.com>
|
||||
Shahar Kohanim <skohanim@gmail.com>
|
||||
Shamil Garatuev <garatuev@gmail.com>
|
||||
Shane Hansen <shanemhansen@gmail.com>
|
||||
Shang Jian Ding <sding3@ncsu.edu>
|
||||
Shaozhen Ding <dsz0111@gmail.com>
|
||||
Shaquille Wyan Que <shaqqywyan@gmail.com>
|
||||
Shaun Dunning <shaun.dunning@uservoice.com>
|
||||
Shawn Elliott <selliott@microsoft.com>
|
||||
Shawn Ledbetter <sledbetter@google.com>
|
||||
@@ -2008,6 +2119,7 @@ Shubham Sharma <shubham.sha12@gmail.com>
|
||||
Shun Fan <sfan@google.com>
|
||||
Silvan Jegen <s.jegen@gmail.com>
|
||||
Simarpreet Singh <simar@linux.com>
|
||||
Simon Drake <simondrake1990@gmail.com>
|
||||
Simon Ferquel <simon.ferquel@docker.com>
|
||||
Simon Jefford <simon.jefford@gmail.com>
|
||||
Simon Rawet <simon@rawet.se>
|
||||
@@ -2018,6 +2130,8 @@ Sina Siadat <siadat@gmail.com>
|
||||
Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
|
||||
Sokolov Yura <funny.falcon@gmail.com>
|
||||
Song Gao <song@gao.io>
|
||||
Soojin Nam <jsunam@gmail.com>
|
||||
Søren L. Hansen <soren@linux2go.dk>
|
||||
Spencer Kocot <spencerkocot@gmail.com>
|
||||
Spencer Nelson <s@spenczar.com>
|
||||
Spencer Tung <spencertung@google.com>
|
||||
@@ -2074,6 +2188,7 @@ Taavi Kivisik <taavi.kivisik@gmail.com>
|
||||
Tad Fisher <tadfisher@gmail.com>
|
||||
Tad Glines <tad.glines@gmail.com>
|
||||
Tadas Valiukas <tadovas@gmail.com>
|
||||
Tadeo Kondrak <me@tadeo.ca>
|
||||
Taesu Pyo <pyotaesu@gmail.com>
|
||||
Tai Le <letientai299@gmail.com>
|
||||
Taj Khattra <taj.khattra@gmail.com>
|
||||
@@ -2083,6 +2198,7 @@ Takeshi YAMANASHI <9.nashi@gmail.com>
|
||||
Takuto Ikuta <tikuta@google.com>
|
||||
Takuya Ueda <uedatakuya@gmail.com>
|
||||
Tal Shprecher <tshprecher@gmail.com>
|
||||
Tamás Gulácsi <tgulacsi78@gmail.com>
|
||||
Tamir Duberstein <tamird@gmail.com>
|
||||
Tao Qingyun <qingyunha@gmail.com>
|
||||
Tao Shen <shentaoskyking@gmail.com>
|
||||
@@ -2102,6 +2218,7 @@ Tetsuo Kiso <tetsuokiso9@gmail.com>
|
||||
Than McIntosh <thanm@google.com>
|
||||
Thanabodee Charoenpiriyakij <wingyminus@gmail.com>
|
||||
Thanatat Tamtan <acoshift@gmail.com>
|
||||
The Hatsune Daishi <nao20010128@gmail.com>
|
||||
Thiago Avelino <t@avelino.xxx>
|
||||
Thiago Fransosi Farina <thiago.farina@gmail.com> <tfarina@chromium.org>
|
||||
Thomas Alan Copeland <talan.copeland@gmail.com>
|
||||
@@ -2128,9 +2245,11 @@ Tim Ebringer <tim.ebringer@gmail.com>
|
||||
Tim Heckman <t@heckman.io>
|
||||
Tim Henderson <tim.tadh@gmail.com>
|
||||
Tim Hockin <thockin@google.com>
|
||||
Tim Möhlmann <muhlemmer@gmail.com>
|
||||
Tim Swast <swast@google.com>
|
||||
Tim Wright <tenortim@gmail.com>
|
||||
Tim Xu <xiaoxubeii@gmail.com>
|
||||
Timmy Douglas <timmyd983@gmail.com>
|
||||
Timo Savola <timo.savola@gmail.com>
|
||||
Timo Truyts <alkaloid.btx@gmail.com>
|
||||
Timothy Studd <tim@timstudd.com>
|
||||
@@ -2149,6 +2268,7 @@ Tom Lanyon <tomlanyon@google.com>
|
||||
Tom Levy <tomlevy93@gmail.com>
|
||||
Tom Limoncelli <tal@whatexit.org>
|
||||
Tom Linford <tomlinford@gmail.com>
|
||||
Tom Parkin <tom.parkin@gmail.com>
|
||||
Tom Payne <twpayne@gmail.com>
|
||||
Tom Szymanski <tgs@google.com>
|
||||
Tom Thorogood <me+google@tomthorogood.co.uk>
|
||||
@@ -2162,6 +2282,7 @@ Tony Reix <tony.reix@bull.net>
|
||||
Tony Walker <walkert.uk@gmail.com>
|
||||
Tooru Takahashi <tooru.takahashi134@gmail.com>
|
||||
Tor Andersson <tor.andersson@gmail.com>
|
||||
Torben Schinke <torben.schinke@neotos.de>
|
||||
Tormod Erevik Lea <tormodlea@gmail.com>
|
||||
Toshihiro Shiino <shiino.toshihiro@gmail.com>
|
||||
Toshiki Shima <hayabusa1419@gmail.com>
|
||||
@@ -2178,12 +2299,15 @@ Tristan Ooohry <ooohry@gmail.com>
|
||||
Tristan Rice <rice@fn.lc>
|
||||
Troels Thomsen <troels@thomsen.io>
|
||||
Trung Nguyen <trung.n.k@gmail.com>
|
||||
Tsuji Daishiro <dram.dt.shonan@gmail.com>
|
||||
Tudor Golubenco <tudor.g@gmail.com>
|
||||
Tugdual Saunier <tugdual.saunier@gmail.com>
|
||||
Tuo Shan <sturbo89@gmail.com> <shantuo@google.com>
|
||||
Tyler Bui-Palsulich <tpalsulich@google.com>
|
||||
Tyler Bunnell <tylerbunnell@gmail.com>
|
||||
Tyler Treat <ttreat31@gmail.com>
|
||||
Tyson Andre <tysonandre775@gmail.com>
|
||||
Tzach Shabtay <tzachshabtay@gmail.com>
|
||||
Tzu-Jung Lee <roylee17@currant.com>
|
||||
Udalov Max <re.udalov@gmail.com>
|
||||
Ugorji Nwoke <ugorji@gmail.com>
|
||||
@@ -2217,6 +2341,7 @@ Visweswara R <r.visweswara@gmail.com>
|
||||
Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
|
||||
Vitor De Mario <vitordemario@gmail.com>
|
||||
Vivek Sekhar <vsekhar@google.com>
|
||||
Vivian Liang <vliang88@gmail.com>
|
||||
Vlad Krasnov <vlad@cloudflare.com>
|
||||
Vladimir Evgrafov <evgrafov.vladimir@gmail.com>
|
||||
Vladimir Kovpak <cn007b@gmail.com>
|
||||
@@ -2231,6 +2356,7 @@ Volodymyr Paprotski <vpaprots@ca.ibm.com>
|
||||
W. Trevor King <wking@tremily.us>
|
||||
Wade Simmons <wade@wades.im>
|
||||
Wagner Riffel <wgrriffel@gmail.com>
|
||||
Walt Della <walt@javins.net>
|
||||
Walter Poupore <wpoupore@google.com>
|
||||
Wander Lairson Costa <wcosta@mozilla.com>
|
||||
Wang Xuerui <git@xen0n.name>
|
||||
@@ -2274,12 +2400,15 @@ Xudong Zheng <7pkvm5aw@slicealias.com>
|
||||
Xuyang Kang <xuyangkang@gmail.com>
|
||||
Yamagishi Kazutoshi <ykzts@desire.sh>
|
||||
Yan Zou <yzou@google.com>
|
||||
Yang Hau <vulxj0j8j8@gmail.com>
|
||||
Yang Tian <linuxty@gmail.com>
|
||||
Yann Hodique <yhodique@google.com>
|
||||
Yann Kerhervé <yann.kerherve@gmail.com>
|
||||
Yann Salaün <yannsalaun1@gmail.com>
|
||||
Yannic Bonenberger <contact@yannic-bonenberger.com>
|
||||
Yao Zhang <lunaria21@gmail.com>
|
||||
Yaron de Leeuw <jarondl@google.com>
|
||||
Yaroslav Vorobiov <yar.vorobiov@gmail.com>
|
||||
Yasha Bubnov <girokompass@gmail.com>
|
||||
Yasser Abdolmaleki <yasser@yasser.ca>
|
||||
Yasuharu Goto <matope.ono@gmail.com>
|
||||
@@ -2298,6 +2427,7 @@ Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
|
||||
Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
|
||||
Yu Heng Zhang <annita.zhang@cn.ibm.com>
|
||||
Yu Xuan Zhang <zyxsh@cn.ibm.com>
|
||||
Yuichi Kishimoto <yk2220s@gmail.com>
|
||||
Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
|
||||
Yuji Yaginuma <yuuji.yaginuma@gmail.com>
|
||||
Yuki OKUSHI <huyuumi.dev@gmail.com>
|
||||
@@ -2318,6 +2448,7 @@ Zak <zrjknill@gmail.com>
|
||||
Zakatell Kanda <hi@zkanda.io>
|
||||
Zellyn Hunter <zellyn@squareup.com> <zellyn@gmail.com>
|
||||
Zev Goldstein <zev.goldstein@gmail.com>
|
||||
Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Zheng Dayu <davidzheng23@gmail.com>
|
||||
Zheng Xu <zheng.xu@arm.com>
|
||||
Zhengyu He <hzy@google.com>
|
||||
|
||||
@@ -609,6 +609,12 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
If a program needs to accept invalid numbers like the empty string,
|
||||
consider wrapping the type with <a href="/pkg/encoding/json/#Unmarshaler"><code>Unmarshaler</code></a>.
|
||||
</p>
|
||||
|
||||
<p><!-- CL 200237 -->
|
||||
<a href="/pkg/encoding/json/#Unmarshal"><code>Unmarshal</code></a>
|
||||
can now support map keys with string underlying type which implement
|
||||
<a href="/pkg/encoding/#TextUnmarshaler"><code>encoding.TextUnmarshaler</code></a>.
|
||||
</p>
|
||||
</dd>
|
||||
</dl><!-- encoding/json -->
|
||||
|
||||
|
||||
@@ -14,13 +14,21 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
main ul li { margin: 0.5em 0; }
|
||||
</style>
|
||||
|
||||
<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.15</h2>
|
||||
<h2 id="introduction">Introduction to Go 1.15</h2>
|
||||
|
||||
<p>
|
||||
<strong>
|
||||
Go 1.15 is not yet released. These are work-in-progress
|
||||
release notes. Go 1.15 is expected to be released in August 2020.
|
||||
</strong>
|
||||
The latest Go release, version 1.15, arrives six months after <a href="go1.14">Go 1.14</a>.
|
||||
Most of its changes are in the implementation of the toolchain, runtime, and libraries.
|
||||
As always, the release maintains the Go 1 <a href="/doc/go1compat.html">promise of compatibility</a>.
|
||||
We expect almost all Go programs to continue to compile and run as before.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Go 1.15 includes <a href="#linker">substantial improvements to the linker</a>,
|
||||
improves <a href="#runtime">allocation for small objects at high core counts</a>, and
|
||||
deprecates <a href="#commonname">X.509 CommonName</a>.
|
||||
<code>GOPROXY</code> now supports skipping proxies that return errors and
|
||||
a new <a href="#time/tzdata">embedded tzdata package</a> has been added.
|
||||
</p>
|
||||
|
||||
<h2 id="language">Changes to the language</h2>
|
||||
@@ -349,7 +357,10 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
The linker now defaults to internal linking mode
|
||||
for <code>-buildmode=pie</code> on
|
||||
<code>linux/amd64</code> and <code>linux/arm64</code>, so these
|
||||
configurations no longer require a C linker.
|
||||
configurations no longer require a C linker. External linking
|
||||
mode (which was the default in Go 1.14 for
|
||||
<code>-buildmode=pie</code>) can still be requested with
|
||||
<code>-ldflags=-linkmode=external</code> flag.
|
||||
</p>
|
||||
|
||||
<h2 id="objdump">Objdump</h2>
|
||||
@@ -425,6 +436,19 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
</dd>
|
||||
</dl><!-- bufio -->
|
||||
|
||||
<dl id="context"><dt><a href="/pkg/context/">context</a></dt>
|
||||
<dd>
|
||||
<p><!-- CL 223777 -->
|
||||
Creating a derived <code>Context</code> using a nil parent is now explicitly
|
||||
disallowed. Any attempt to do so with the
|
||||
<a href="/pkg/context/#WithValue"><code>WithValue</code></a>,
|
||||
<a href="/pkg/context/#WithDeadline"><code>WithDeadline</code></a>, or
|
||||
<a href="/pkg/context/#WithCancel"><code>WithCancel</code></a> functions
|
||||
will cause a panic.
|
||||
</p>
|
||||
</dd>
|
||||
</dl><!-- context -->
|
||||
|
||||
<dl id="crypto"><dt><a href="/pkg/crypto/">crypto</a></dt>
|
||||
<dd>
|
||||
<p><!-- CL 231417, CL 225460 -->
|
||||
@@ -524,6 +548,17 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
fields <code>OCSPResponse</code> and <code>SignedCertificateTimestamps</code>
|
||||
are now repopulated on client-side resumed connections.
|
||||
</p>
|
||||
|
||||
<p><!-- CL 227840 -->
|
||||
<a href="/pkg/crypto/tls/#Conn"><code>tls.Conn</code></a>
|
||||
now returns an opaque error on permanently broken connections, wrapping
|
||||
the temporary
|
||||
<a href="/pkg/net/http/#Error"><code>net.Error</code></a>. To access the
|
||||
original <code>net.Error</code>, use
|
||||
<a href="/pkg/errors/#As"><code>errors.As</code></a> (or
|
||||
<a href="/pkg/errors/#Unwrap"><code>errors.Unwrap</code></a>) instead of a
|
||||
type assertion.
|
||||
</p>
|
||||
</dd>
|
||||
</dl><!-- crypto/tls -->
|
||||
|
||||
@@ -638,11 +673,6 @@ Do not send CLs removing the interior tags from such phrases.
|
||||
|
||||
<dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt>
|
||||
<dd>
|
||||
<p><!-- CL 191783 -->
|
||||
Decoding a JSON array into a slice no longer reuses any existing slice elements,
|
||||
following the rules that the package documentation already stated.
|
||||
</p>
|
||||
|
||||
<p><!-- CL 199837 -->
|
||||
The package now has an internal limit to the maximum depth of
|
||||
nesting when decoding. This reduces the possibility that a
|
||||
|
||||
@@ -141,8 +141,8 @@ const (
|
||||
nodeInitorder, _ // tracks state during init1; two bits
|
||||
_, _ // second nodeInitorder bit
|
||||
_, nodeHasBreak
|
||||
_, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only
|
||||
_, nodeImplicit
|
||||
_, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only
|
||||
_, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND
|
||||
_, nodeIsDDD // is the argument variadic
|
||||
_, nodeDiag // already printed error about this
|
||||
_, nodeColas // OAS resulting from :=
|
||||
|
||||
@@ -968,6 +968,7 @@ opswitch:
|
||||
case OANDNOT:
|
||||
n.Left = walkexpr(n.Left, init)
|
||||
n.Op = OAND
|
||||
n.SetImplicit(true) // for walkCheckPtrArithmetic
|
||||
n.Right = nod(OBITNOT, n.Right, nil)
|
||||
n.Right = typecheck(n.Right, ctxExpr)
|
||||
n.Right = walkexpr(n.Right, init)
|
||||
@@ -3993,8 +3994,12 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node {
|
||||
case OADD:
|
||||
walk(n.Left)
|
||||
walk(n.Right)
|
||||
case OSUB, OANDNOT:
|
||||
case OSUB:
|
||||
walk(n.Left)
|
||||
case OAND:
|
||||
if n.Implicit() { // was OANDNOT
|
||||
walk(n.Left)
|
||||
}
|
||||
case OCONVNOP:
|
||||
if n.Left.Type.Etype == TUNSAFEPTR {
|
||||
n.Left = cheapexpr(n.Left, init)
|
||||
|
||||
@@ -645,9 +645,9 @@ func init() {
|
||||
{name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
|
||||
|
||||
// LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
|
||||
// It preserves R0 through R15, g, and its arguments R20 and R21,
|
||||
// It preserves R0 through R17 (except special registers R1, R2, R11, R12, R13), g, and its arguments R20 and R21,
|
||||
// but may clobber anything else, including R31 (REGTMP).
|
||||
{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
|
||||
{name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
|
||||
|
||||
// There are three of these functions so that they can have three different register inputs.
|
||||
// When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
|
||||
|
||||
@@ -26885,7 +26885,7 @@ var opcodeTable = [...]opInfo{
|
||||
{0, 1048576}, // R20
|
||||
{1, 2097152}, // R21
|
||||
},
|
||||
clobbers: 576460746931503104, // R16 R17 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
|
||||
clobbers: 576460746931312640, // R11 R12 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -154,7 +154,7 @@ func phioptint(v *Value, b0 *Block, reverse int) {
|
||||
}
|
||||
v.AddArg(a)
|
||||
|
||||
cvt := v.Block.NewValue1(v.Pos, OpCvtBoolToUint8, a.Type, a)
|
||||
cvt := v.Block.NewValue1(v.Pos, OpCvtBoolToUint8, v.Block.Func.Config.Types.UInt8, a)
|
||||
switch v.Type.Size() {
|
||||
case 1:
|
||||
v.reset(OpCopy)
|
||||
|
||||
@@ -1334,7 +1334,7 @@ func removeBranch(b *Block, branch branch) {
|
||||
// isNonNegative reports whether v is known to be greater or equal to zero.
|
||||
func isNonNegative(v *Value) bool {
|
||||
if !v.Type.IsInteger() {
|
||||
panic("isNonNegative bad type")
|
||||
v.Fatalf("isNonNegative bad type: %v", v.Type)
|
||||
}
|
||||
// TODO: return true if !v.Type.IsSigned()
|
||||
// SSA isn't type-safe enough to do that now (issue 37753).
|
||||
|
||||
@@ -1079,9 +1079,13 @@ func (c *runCache) builderRunTest(b *work.Builder, a *work.Action) error {
|
||||
}
|
||||
|
||||
var stdout io.Writer = os.Stdout
|
||||
var err error
|
||||
if testJSON {
|
||||
json := test2json.NewConverter(lockedStdout{}, a.Package.ImportPath, test2json.Timestamp)
|
||||
defer json.Close()
|
||||
defer func() {
|
||||
json.Exited(err)
|
||||
json.Close()
|
||||
}()
|
||||
stdout = json
|
||||
}
|
||||
|
||||
@@ -1185,7 +1189,7 @@ func (c *runCache) builderRunTest(b *work.Builder, a *work.Action) error {
|
||||
}
|
||||
|
||||
t0 := time.Now()
|
||||
err := cmd.Start()
|
||||
err = cmd.Start()
|
||||
|
||||
// This is a last-ditch deadline to detect and
|
||||
// stop wedged test binaries, to keep the builders
|
||||
|
||||
@@ -214,9 +214,13 @@ func testFlags(args []string) (packageNames, passToTest []string) {
|
||||
|
||||
explicitArgs := make([]string, 0, len(args))
|
||||
inPkgList := false
|
||||
afterFlagWithoutValue := false
|
||||
for len(args) > 0 {
|
||||
f, remainingArgs, err := cmdflag.ParseOne(&CmdTest.Flag, args)
|
||||
|
||||
wasAfterFlagWithoutValue := afterFlagWithoutValue
|
||||
afterFlagWithoutValue = false // provisionally
|
||||
|
||||
if errors.Is(err, flag.ErrHelp) {
|
||||
exitWithUsage()
|
||||
}
|
||||
@@ -233,10 +237,24 @@ func testFlags(args []string) (packageNames, passToTest []string) {
|
||||
if nf := (cmdflag.NonFlagError{}); errors.As(err, &nf) {
|
||||
if !inPkgList && packageNames != nil {
|
||||
// We already saw the package list previously, and this argument is not
|
||||
// a flag, so it — and everything after it — must be a literal argument
|
||||
// to the test binary.
|
||||
explicitArgs = append(explicitArgs, args...)
|
||||
break
|
||||
// a flag, so it — and everything after it — must be either a value for
|
||||
// a preceding flag or a literal argument to the test binary.
|
||||
if wasAfterFlagWithoutValue {
|
||||
// This argument could syntactically be a flag value, so
|
||||
// optimistically assume that it is and keep looking for go command
|
||||
// flags after it.
|
||||
//
|
||||
// (If we're wrong, we'll at least be consistent with historical
|
||||
// behavior; see https://golang.org/issue/40763.)
|
||||
explicitArgs = append(explicitArgs, nf.RawArg)
|
||||
args = remainingArgs
|
||||
continue
|
||||
} else {
|
||||
// This argument syntactically cannot be a flag value, so it must be a
|
||||
// positional argument, and so must everything after it.
|
||||
explicitArgs = append(explicitArgs, args...)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
inPkgList = true
|
||||
@@ -272,6 +290,9 @@ func testFlags(args []string) (packageNames, passToTest []string) {
|
||||
|
||||
explicitArgs = append(explicitArgs, nd.RawArg)
|
||||
args = remainingArgs
|
||||
if !nd.HasValue {
|
||||
afterFlagWithoutValue = true
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
35
src/cmd/go/testdata/script/test_flags.txt
vendored
35
src/cmd/go/testdata/script/test_flags.txt
vendored
@@ -10,7 +10,7 @@ stdout '\Aok\s+example.com/x\s+[0-9.s]+\n\z'
|
||||
! stderr .
|
||||
|
||||
# For backward-compatibility with previous releases of the 'go' command,
|
||||
# arguments that appear after unrecognized flags should not be treated
|
||||
# arguments that appear after unrecognized flags should not be treated
|
||||
# as packages, even if they are unambiguously not arguments to flags.
|
||||
# Even though ./x looks like a package path, the real package should be
|
||||
# the implicit '.'.
|
||||
@@ -18,6 +18,22 @@ stdout '\Aok\s+example.com/x\s+[0-9.s]+\n\z'
|
||||
stderr '^no Go files in .+$'
|
||||
! stderr '/x'
|
||||
|
||||
# However, *flags* that appear after unrecognized flags should still be
|
||||
# interpreted as flags, under the (possibly-erroneous) assumption that
|
||||
# unrecognized flags are non-boolean.
|
||||
|
||||
go test -v -x ./x -timeout 24h -boolflag=true foo -timeout 25h
|
||||
stdout 'args: foo -timeout 25h'
|
||||
stdout 'timeout: 24h0m0s$' # -timeout is unambiguously not a flag, so the real flag wins.
|
||||
|
||||
go test -v -x ./x -timeout 24h -boolflag foo -timeout 25h
|
||||
stdout 'args: foo -test\.timeout=25h0m0s' # For legacy reasons, '-timeout ' is erroneously rewritten to -test.timeout; see https://golang.org/issue/40763.
|
||||
stdout 'timeout: 24h0m0s$' # Actual flag wins.
|
||||
|
||||
go test -v -x ./x -timeout 24h -stringflag foo -timeout 25h
|
||||
stdout 'args: $'
|
||||
stdout 'timeout: 25h0m0s$' # Later flag wins.
|
||||
|
||||
# An explicit '-outputdir=' argument should set test.outputdir
|
||||
# to the 'go' command's working directory, not zero it out
|
||||
# for the test binary.
|
||||
@@ -30,23 +46,23 @@ exists ./cover.out
|
||||
# with the 'test.' prefix in the GOFLAGS entry...
|
||||
env GOFLAGS='-test.timeout=24h0m0s -count=1'
|
||||
go test -v -x ./x
|
||||
stdout '.*: 24h0m0s$'
|
||||
stdout 'timeout: 24h0m0s$'
|
||||
stderr '-test.count=1'
|
||||
|
||||
# ...or without.
|
||||
env GOFLAGS='-timeout=24h0m0s -count=1'
|
||||
go test -v -x ./x
|
||||
stdout '.*: 24h0m0s$'
|
||||
stdout 'timeout: 24h0m0s$'
|
||||
stderr '-test.count=1'
|
||||
|
||||
# Arguments from the command line should override GOFLAGS...
|
||||
go test -v -x -timeout=25h0m0s ./x
|
||||
stdout '.*: 25h0m0s$'
|
||||
stdout 'timeout: 25h0m0s$'
|
||||
stderr '-test.count=1'
|
||||
|
||||
# ...even if they use a different flag name.
|
||||
go test -v -x -test.timeout=26h0m0s ./x
|
||||
stdout '.*: 26h0m0s$'
|
||||
stdout 'timeout: 26h0m0s$'
|
||||
stderr '-test\.timeout=26h0m0s'
|
||||
! stderr 'timeout=24h0m0s'
|
||||
stderr '-test.count=1'
|
||||
@@ -99,11 +115,18 @@ package x
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var _ = flag.String("usage_message", "", "dummy flag to check usage message")
|
||||
var boolflag = flag.Bool("boolflag", false, "ignored boolean flag")
|
||||
var stringflag = flag.String("stringflag", "", "ignored string flag")
|
||||
|
||||
func TestLogTimeout(t *testing.T) {
|
||||
t.Log(flag.Lookup("test.timeout").Value)
|
||||
t.Logf("timeout: %v", flag.Lookup("test.timeout").Value)
|
||||
}
|
||||
|
||||
func TestLogArgs(t *testing.T) {
|
||||
t.Logf("args: %s", strings.Join(flag.Args(), " "))
|
||||
}
|
||||
|
||||
102
src/cmd/go/testdata/script/test_json_exit.txt
vendored
Normal file
102
src/cmd/go/testdata/script/test_json_exit.txt
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
[short] skip
|
||||
|
||||
go test -c -o mainpanic.exe ./mainpanic &
|
||||
go test -c -o mainexit0.exe ./mainexit0 &
|
||||
go test -c -o testpanic.exe ./testpanic &
|
||||
go test -c -o testbgpanic.exe ./testbgpanic &
|
||||
wait
|
||||
|
||||
# Test binaries that panic in TestMain should be marked as failing.
|
||||
|
||||
! go test -json ./mainpanic
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
! go tool test2json ./mainpanic.exe
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
# Test binaries that exit with status 0 should be marked as passing.
|
||||
|
||||
go test -json ./mainexit0
|
||||
stdout '"Action":"pass"'
|
||||
! stdout '"Action":"fail"'
|
||||
|
||||
go tool test2json ./mainexit0.exe
|
||||
stdout '"Action":"pass"'
|
||||
! stdout '"Action":"fail"'
|
||||
|
||||
# Test functions that panic should never be marked as passing
|
||||
# (https://golang.org/issue/40132).
|
||||
|
||||
! go test -json ./testpanic
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
! go tool test2json ./testpanic.exe -test.v
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
! go tool test2json ./testpanic.exe
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
# Tests that panic in a background goroutine should be marked as failing.
|
||||
|
||||
! go test -json ./testbgpanic
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
! go tool test2json ./testbgpanic.exe -test.v
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
! go tool test2json ./testbgpanic.exe
|
||||
stdout '"Action":"fail"'
|
||||
! stdout '"Action":"pass"'
|
||||
|
||||
-- go.mod --
|
||||
module m
|
||||
go 1.14
|
||||
-- mainpanic/mainpanic_test.go --
|
||||
package mainpanic_test
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
panic("haha no")
|
||||
}
|
||||
-- mainexit0/mainexit0_test.go --
|
||||
package mainexit0_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
fmt.Println("nothing to do")
|
||||
os.Exit(0)
|
||||
}
|
||||
-- testpanic/testpanic_test.go --
|
||||
package testpanic_test
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestPanic(*testing.T) {
|
||||
panic("haha no")
|
||||
}
|
||||
-- testbgpanic/testbgpanic_test.go --
|
||||
package testbgpanic_test
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestPanicInBackground(*testing.T) {
|
||||
c := make(chan struct{})
|
||||
go func() {
|
||||
panic("haha no")
|
||||
close(c)
|
||||
}()
|
||||
<-c
|
||||
}
|
||||
27
src/cmd/go/testdata/script/test_json_interleaved.txt
vendored
Normal file
27
src/cmd/go/testdata/script/test_json_interleaved.txt
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
# Regression test for https://golang.org/issue/40657: output from the main test
|
||||
# function should be attributed correctly even if interleaved with the PAUSE
|
||||
# line for a new parallel subtest.
|
||||
|
||||
[short] skip
|
||||
|
||||
go test -json
|
||||
stdout '"Test":"TestWeirdTiming","Output":"[^"]* logging to outer again\\n"'
|
||||
|
||||
-- go.mod --
|
||||
module example.com
|
||||
go 1.15
|
||||
-- main_test.go --
|
||||
package main
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestWeirdTiming(outer *testing.T) {
|
||||
outer.Run("pauser", func(pauser *testing.T) {
|
||||
outer.Logf("logging to outer")
|
||||
pauser.Parallel()
|
||||
})
|
||||
|
||||
outer.Logf("logging to outer again")
|
||||
}
|
||||
21
src/cmd/go/testdata/script/testing_issue40908.txt
vendored
Normal file
21
src/cmd/go/testdata/script/testing_issue40908.txt
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
[short] skip
|
||||
[!race] skip
|
||||
|
||||
go test -race testrace
|
||||
|
||||
-- testrace/race_test.go --
|
||||
package testrace
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestRace(t *testing.T) {
|
||||
helperDone := make(chan struct{})
|
||||
go func() {
|
||||
t.Logf("Something happened before cleanup.")
|
||||
close(helperDone)
|
||||
}()
|
||||
|
||||
t.Cleanup(func() {
|
||||
<-helperDone
|
||||
})
|
||||
}
|
||||
@@ -327,6 +327,9 @@ var optab = []Optab{
|
||||
{obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0, 0},
|
||||
{obj.AFUNCDATA, C_LCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, // nop variants, see #40689
|
||||
{obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
|
||||
{obj.ADUFFZERO, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL
|
||||
{obj.ADUFFCOPY, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL
|
||||
{obj.AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0, 0, 0, 0},
|
||||
|
||||
@@ -276,67 +276,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
|
||||
/*
|
||||
* find leaf subroutines
|
||||
* strip NOPs
|
||||
* expand RET
|
||||
* expand BECOME pseudo
|
||||
*/
|
||||
var q1 *obj.Prog
|
||||
var q *obj.Prog
|
||||
for p := cursym.Func.Text; p != nil; p = p.Link {
|
||||
switch p.As {
|
||||
case obj.ATEXT:
|
||||
p.Mark |= LEAF
|
||||
|
||||
case obj.ARET:
|
||||
break
|
||||
|
||||
case ADIV, ADIVU, AMOD, AMODU:
|
||||
q = p
|
||||
cursym.Func.Text.Mark &^= LEAF
|
||||
continue
|
||||
|
||||
case obj.ANOP:
|
||||
q1 = p.Link
|
||||
q.Link = q1 /* q is non-nop */
|
||||
if q1 != nil {
|
||||
q1.Mark |= p.Mark
|
||||
}
|
||||
continue
|
||||
|
||||
case ABL,
|
||||
ABX,
|
||||
obj.ADUFFZERO,
|
||||
obj.ADUFFCOPY:
|
||||
cursym.Func.Text.Mark &^= LEAF
|
||||
fallthrough
|
||||
|
||||
case AB,
|
||||
ABEQ,
|
||||
ABNE,
|
||||
ABCS,
|
||||
ABHS,
|
||||
ABCC,
|
||||
ABLO,
|
||||
ABMI,
|
||||
ABPL,
|
||||
ABVS,
|
||||
ABVC,
|
||||
ABHI,
|
||||
ABLS,
|
||||
ABGE,
|
||||
ABLT,
|
||||
ABGT,
|
||||
ABLE:
|
||||
q1 = p.Pcond
|
||||
if q1 != nil {
|
||||
for q1.As == obj.ANOP {
|
||||
q1 = q1.Link
|
||||
p.Pcond = q1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
q = p
|
||||
}
|
||||
|
||||
var q2 *obj.Prog
|
||||
|
||||
@@ -837,6 +837,9 @@ var optab = []Optab{
|
||||
{obj.APCDATA, C_VCON, C_NONE, C_NONE, C_VCON, 0, 0, 0, 0, 0},
|
||||
{obj.AFUNCDATA, C_VCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
|
||||
{obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_VREG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL
|
||||
{obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL
|
||||
{obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // align code
|
||||
|
||||
@@ -468,73 +468,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
|
||||
/*
|
||||
* find leaf subroutines
|
||||
* strip NOPs
|
||||
* expand RET
|
||||
*/
|
||||
q := (*obj.Prog)(nil)
|
||||
var q1 *obj.Prog
|
||||
for p := c.cursym.Func.Text; p != nil; p = p.Link {
|
||||
switch p.As {
|
||||
case obj.ATEXT:
|
||||
p.Mark |= LEAF
|
||||
|
||||
case obj.ARET:
|
||||
break
|
||||
|
||||
case obj.ANOP:
|
||||
if p.Link != nil {
|
||||
q1 = p.Link
|
||||
q.Link = q1 /* q is non-nop */
|
||||
q1.Mark |= p.Mark
|
||||
}
|
||||
continue
|
||||
|
||||
case ABL,
|
||||
obj.ADUFFZERO,
|
||||
obj.ADUFFCOPY:
|
||||
c.cursym.Func.Text.Mark &^= LEAF
|
||||
fallthrough
|
||||
|
||||
case ACBNZ,
|
||||
ACBZ,
|
||||
ACBNZW,
|
||||
ACBZW,
|
||||
ATBZ,
|
||||
ATBNZ,
|
||||
AB,
|
||||
ABEQ,
|
||||
ABNE,
|
||||
ABCS,
|
||||
ABHS,
|
||||
ABCC,
|
||||
ABLO,
|
||||
ABMI,
|
||||
ABPL,
|
||||
ABVS,
|
||||
ABVC,
|
||||
ABHI,
|
||||
ABLS,
|
||||
ABGE,
|
||||
ABLT,
|
||||
ABGT,
|
||||
ABLE,
|
||||
AADR, /* strange */
|
||||
AADRP:
|
||||
q1 = p.Pcond
|
||||
|
||||
if q1 != nil {
|
||||
for q1.As == obj.ANOP {
|
||||
q1 = q1.Link
|
||||
p.Pcond = q1
|
||||
}
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
q = p
|
||||
}
|
||||
|
||||
var q *obj.Prog
|
||||
var q1 *obj.Prog
|
||||
var retjmp *obj.LSym
|
||||
for p := c.cursym.Func.Text; p != nil; p = p.Link {
|
||||
o := p.As
|
||||
|
||||
@@ -391,6 +391,9 @@ var optab = []Optab{
|
||||
{obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0},
|
||||
{obj.AFUNCDATA, C_SCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
|
||||
{obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
|
||||
{obj.ADUFFZERO, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
|
||||
{obj.ADUFFCOPY, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
|
||||
|
||||
|
||||
@@ -158,19 +158,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
|
||||
/*
|
||||
* find leaf subroutines
|
||||
* strip NOPs
|
||||
* expand RET
|
||||
* expand BECOME pseudo
|
||||
*/
|
||||
|
||||
var q *obj.Prog
|
||||
var q1 *obj.Prog
|
||||
for p := c.cursym.Func.Text; p != nil; p = p.Link {
|
||||
switch p.As {
|
||||
/* too hard, just leave alone */
|
||||
case obj.ATEXT:
|
||||
q = p
|
||||
|
||||
p.Mark |= LABEL | LEAF | SYNC
|
||||
if p.Link != nil {
|
||||
p.Link.Mark |= LABEL
|
||||
@@ -179,7 +174,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
/* too hard, just leave alone */
|
||||
case AMOVW,
|
||||
AMOVV:
|
||||
q = p
|
||||
if p.To.Type == obj.TYPE_REG && p.To.Reg >= REG_SPECIAL {
|
||||
p.Mark |= LABEL | SYNC
|
||||
break
|
||||
@@ -195,11 +189,9 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
ATLBWI,
|
||||
ATLBP,
|
||||
ATLBR:
|
||||
q = p
|
||||
p.Mark |= LABEL | SYNC
|
||||
|
||||
case ANOR:
|
||||
q = p
|
||||
if p.To.Type == obj.TYPE_REG {
|
||||
if p.To.Reg == REGZERO {
|
||||
p.Mark |= LABEL | SYNC
|
||||
@@ -235,8 +227,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
} else {
|
||||
p.Mark |= BRANCH
|
||||
}
|
||||
q = p
|
||||
q1 = p.Pcond
|
||||
q1 := p.Pcond
|
||||
if q1 != nil {
|
||||
for q1.As == obj.ANOP {
|
||||
q1 = q1.Link
|
||||
@@ -254,24 +245,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
if q1 != nil {
|
||||
q1.Mark |= LABEL
|
||||
}
|
||||
continue
|
||||
|
||||
case ARET:
|
||||
q = p
|
||||
if p.Link != nil {
|
||||
p.Link.Mark |= LABEL
|
||||
}
|
||||
continue
|
||||
|
||||
case obj.ANOP:
|
||||
q1 = p.Link
|
||||
q.Link = q1 /* q is non-nop */
|
||||
q1.Mark |= p.Mark
|
||||
continue
|
||||
|
||||
default:
|
||||
q = p
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,6 +262,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
mov = AMOVW
|
||||
}
|
||||
|
||||
var q *obj.Prog
|
||||
var q1 *obj.Prog
|
||||
autosize := int32(0)
|
||||
var p1 *obj.Prog
|
||||
var p2 *obj.Prog
|
||||
|
||||
@@ -613,6 +613,9 @@ var optab = []Optab{
|
||||
{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
|
||||
{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
|
||||
{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
|
||||
{obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // NOP operand variations added for #40689
|
||||
{obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // to preserve previous behavior
|
||||
{obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
|
||||
{obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
|
||||
{obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
|
||||
{obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // align code
|
||||
|
||||
@@ -427,7 +427,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
|
||||
/*
|
||||
* find leaf subroutines
|
||||
* strip NOPs
|
||||
* expand RET
|
||||
* expand BECOME pseudo
|
||||
*/
|
||||
@@ -557,10 +556,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
q = p
|
||||
q1 = p.Pcond
|
||||
if q1 != nil {
|
||||
for q1.As == obj.ANOP {
|
||||
q1 = q1.Link
|
||||
p.Pcond = q1
|
||||
}
|
||||
// NOPs are not removed due to #40689.
|
||||
|
||||
if q1.Mark&LEAF == 0 {
|
||||
q1.Mark |= LABEL
|
||||
@@ -587,9 +583,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
||||
continue
|
||||
|
||||
case obj.ANOP:
|
||||
q1 = p.Link
|
||||
q.Link = q1 /* q is non-nop */
|
||||
q1.Mark |= p.Mark
|
||||
// NOPs are not removed due to
|
||||
// #40689
|
||||
continue
|
||||
|
||||
default:
|
||||
|
||||
@@ -45,10 +45,10 @@ type textBytes []byte
|
||||
|
||||
func (b textBytes) MarshalText() ([]byte, error) { return b, nil }
|
||||
|
||||
// A converter holds the state of a test-to-JSON conversion.
|
||||
// A Converter holds the state of a test-to-JSON conversion.
|
||||
// It implements io.WriteCloser; the caller writes test output in,
|
||||
// and the converter writes JSON output to w.
|
||||
type converter struct {
|
||||
type Converter struct {
|
||||
w io.Writer // JSON output stream
|
||||
pkg string // package to name in events
|
||||
mode Mode // mode bits
|
||||
@@ -100,9 +100,9 @@ var (
|
||||
//
|
||||
// The pkg string, if present, specifies the import path to
|
||||
// report in the JSON stream.
|
||||
func NewConverter(w io.Writer, pkg string, mode Mode) io.WriteCloser {
|
||||
c := new(converter)
|
||||
*c = converter{
|
||||
func NewConverter(w io.Writer, pkg string, mode Mode) *Converter {
|
||||
c := new(Converter)
|
||||
*c = Converter{
|
||||
w: w,
|
||||
pkg: pkg,
|
||||
mode: mode,
|
||||
@@ -122,11 +122,20 @@ func NewConverter(w io.Writer, pkg string, mode Mode) io.WriteCloser {
|
||||
}
|
||||
|
||||
// Write writes the test input to the converter.
|
||||
func (c *converter) Write(b []byte) (int, error) {
|
||||
func (c *Converter) Write(b []byte) (int, error) {
|
||||
c.input.write(b)
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
// Exited marks the test process as having exited with the given error.
|
||||
func (c *Converter) Exited(err error) {
|
||||
if err == nil {
|
||||
c.result = "pass"
|
||||
} else {
|
||||
c.result = "fail"
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
// printed by test on successful run.
|
||||
bigPass = []byte("PASS\n")
|
||||
@@ -160,7 +169,7 @@ var (
|
||||
// handleInputLine handles a single whole test output line.
|
||||
// It must write the line to c.output but may choose to do so
|
||||
// before or after emitting other events.
|
||||
func (c *converter) handleInputLine(line []byte) {
|
||||
func (c *Converter) handleInputLine(line []byte) {
|
||||
// Final PASS or FAIL.
|
||||
if bytes.Equal(line, bigPass) || bytes.Equal(line, bigFail) || bytes.HasPrefix(line, bigFailErrorPrefix) {
|
||||
c.flushReport(0)
|
||||
@@ -286,7 +295,7 @@ func (c *converter) handleInputLine(line []byte) {
|
||||
}
|
||||
|
||||
// flushReport flushes all pending PASS/FAIL reports at levels >= depth.
|
||||
func (c *converter) flushReport(depth int) {
|
||||
func (c *Converter) flushReport(depth int) {
|
||||
c.testName = ""
|
||||
for len(c.report) > depth {
|
||||
e := c.report[len(c.report)-1]
|
||||
@@ -298,23 +307,22 @@ func (c *converter) flushReport(depth int) {
|
||||
// Close marks the end of the go test output.
|
||||
// It flushes any pending input and then output (only partial lines at this point)
|
||||
// and then emits the final overall package-level pass/fail event.
|
||||
func (c *converter) Close() error {
|
||||
func (c *Converter) Close() error {
|
||||
c.input.flush()
|
||||
c.output.flush()
|
||||
e := &event{Action: "pass"}
|
||||
if c.result != "" {
|
||||
e.Action = c.result
|
||||
e := &event{Action: c.result}
|
||||
if c.mode&Timestamp != 0 {
|
||||
dt := time.Since(c.start).Round(1 * time.Millisecond).Seconds()
|
||||
e.Elapsed = &dt
|
||||
}
|
||||
c.writeEvent(e)
|
||||
}
|
||||
if c.mode&Timestamp != 0 {
|
||||
dt := time.Since(c.start).Round(1 * time.Millisecond).Seconds()
|
||||
e.Elapsed = &dt
|
||||
}
|
||||
c.writeEvent(e)
|
||||
return nil
|
||||
}
|
||||
|
||||
// writeOutputEvent writes a single output event with the given bytes.
|
||||
func (c *converter) writeOutputEvent(out []byte) {
|
||||
func (c *Converter) writeOutputEvent(out []byte) {
|
||||
c.writeEvent(&event{
|
||||
Action: "output",
|
||||
Output: (*textBytes)(&out),
|
||||
@@ -323,7 +331,7 @@ func (c *converter) writeOutputEvent(out []byte) {
|
||||
|
||||
// writeEvent writes a single event.
|
||||
// It adds the package, time (if requested), and test name (if needed).
|
||||
func (c *converter) writeEvent(e *event) {
|
||||
func (c *Converter) writeEvent(e *event) {
|
||||
e.Package = c.pkg
|
||||
if c.mode&Timestamp != 0 {
|
||||
t := time.Now()
|
||||
|
||||
@@ -4,4 +4,3 @@
|
||||
{"Action":"output","Output":"# but to avoid questions of timing, we just use a file with no \\n at all.\n"}
|
||||
{"Action":"output","Output":"BenchmarkFoo \t"}
|
||||
{"Action":"output","Output":"10000 early EOF"}
|
||||
{"Action":"pass"}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
{"Action":"pass"}
|
||||
|
||||
@@ -118,12 +118,16 @@ func main() {
|
||||
w := &countWriter{0, c}
|
||||
cmd.Stdout = w
|
||||
cmd.Stderr = w
|
||||
if err := cmd.Run(); err != nil {
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
if w.n > 0 {
|
||||
// Assume command printed why it failed.
|
||||
} else {
|
||||
fmt.Fprintf(c, "test2json: %v\n", err)
|
||||
}
|
||||
}
|
||||
c.Exited(err)
|
||||
if err != nil {
|
||||
c.Close()
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err
|
||||
// use copy_file_range(2) again.
|
||||
atomic.StoreInt32(©FileRangeSupported, 0)
|
||||
return 0, false, nil
|
||||
case syscall.EXDEV, syscall.EINVAL:
|
||||
case syscall.EXDEV, syscall.EINVAL, syscall.EOPNOTSUPP, syscall.EPERM:
|
||||
// Prior to Linux 5.3, it was not possible to
|
||||
// copy_file_range across file systems. Similarly to
|
||||
// the ENOSYS case above, if we see EXDEV, we have
|
||||
@@ -52,6 +52,14 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err
|
||||
// dst or src refer to a pipe rather than a regular
|
||||
// file. This is another case where no data has been
|
||||
// transfered, so we consider it unhandled.
|
||||
//
|
||||
// If the file is on NFS, we can see EOPNOTSUPP.
|
||||
// See issue #40731.
|
||||
//
|
||||
// If the process is running inside a Docker container,
|
||||
// we might see EPERM instead of ENOSYS. See issue
|
||||
// #40893. Since EPERM might also be a legitimate error,
|
||||
// don't mark copy_file_range(2) as unsupported.
|
||||
return 0, false, nil
|
||||
case nil:
|
||||
if n == 0 {
|
||||
|
||||
@@ -163,10 +163,12 @@ func Serve(handler http.Handler) error {
|
||||
}
|
||||
|
||||
type response struct {
|
||||
req *http.Request
|
||||
header http.Header
|
||||
bufw *bufio.Writer
|
||||
headerSent bool
|
||||
req *http.Request
|
||||
header http.Header
|
||||
code int
|
||||
wroteHeader bool
|
||||
wroteCGIHeader bool
|
||||
bufw *bufio.Writer
|
||||
}
|
||||
|
||||
func (r *response) Flush() {
|
||||
@@ -178,26 +180,38 @@ func (r *response) Header() http.Header {
|
||||
}
|
||||
|
||||
func (r *response) Write(p []byte) (n int, err error) {
|
||||
if !r.headerSent {
|
||||
if !r.wroteHeader {
|
||||
r.WriteHeader(http.StatusOK)
|
||||
}
|
||||
if !r.wroteCGIHeader {
|
||||
r.writeCGIHeader(p)
|
||||
}
|
||||
return r.bufw.Write(p)
|
||||
}
|
||||
|
||||
func (r *response) WriteHeader(code int) {
|
||||
if r.headerSent {
|
||||
if r.wroteHeader {
|
||||
// Note: explicitly using Stderr, as Stdout is our HTTP output.
|
||||
fmt.Fprintf(os.Stderr, "CGI attempted to write header twice on request for %s", r.req.URL)
|
||||
return
|
||||
}
|
||||
r.headerSent = true
|
||||
fmt.Fprintf(r.bufw, "Status: %d %s\r\n", code, http.StatusText(code))
|
||||
r.wroteHeader = true
|
||||
r.code = code
|
||||
}
|
||||
|
||||
// Set a default Content-Type
|
||||
if _, hasType := r.header["Content-Type"]; !hasType {
|
||||
r.header.Add("Content-Type", "text/html; charset=utf-8")
|
||||
// writeCGIHeader finalizes the header sent to the client and writes it to the output.
|
||||
// p is not written by writeHeader, but is the first chunk of the body
|
||||
// that will be written. It is sniffed for a Content-Type if none is
|
||||
// set explicitly.
|
||||
func (r *response) writeCGIHeader(p []byte) {
|
||||
if r.wroteCGIHeader {
|
||||
return
|
||||
}
|
||||
r.wroteCGIHeader = true
|
||||
fmt.Fprintf(r.bufw, "Status: %d %s\r\n", r.code, http.StatusText(r.code))
|
||||
if _, hasType := r.header["Content-Type"]; !hasType {
|
||||
r.header.Set("Content-Type", http.DetectContentType(p))
|
||||
}
|
||||
|
||||
r.header.Write(r.bufw)
|
||||
r.bufw.WriteString("\r\n")
|
||||
r.bufw.Flush()
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
package cgi
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -148,3 +153,67 @@ func TestRequestWithoutRemotePort(t *testing.T) {
|
||||
t.Errorf("RemoteAddr: got %q; want %q", g, e)
|
||||
}
|
||||
}
|
||||
|
||||
type countingWriter int
|
||||
|
||||
func (c *countingWriter) Write(p []byte) (int, error) {
|
||||
*c += countingWriter(len(p))
|
||||
return len(p), nil
|
||||
}
|
||||
func (c *countingWriter) WriteString(p string) (int, error) {
|
||||
*c += countingWriter(len(p))
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func TestResponse(t *testing.T) {
|
||||
var tests = []struct {
|
||||
name string
|
||||
body string
|
||||
wantCT string
|
||||
}{
|
||||
{
|
||||
name: "no body",
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "html",
|
||||
body: "<html><head><title>test page</title></head><body>This is a body</body></html>",
|
||||
wantCT: "text/html; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "text",
|
||||
body: strings.Repeat("gopher", 86),
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "jpg",
|
||||
body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024),
|
||||
wantCT: "image/jpeg",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
resp := response{
|
||||
req: httptest.NewRequest("GET", "/", nil),
|
||||
header: http.Header{},
|
||||
bufw: bufio.NewWriter(&buf),
|
||||
}
|
||||
n, err := resp.Write([]byte(tt.body))
|
||||
if err != nil {
|
||||
t.Errorf("Write: unexpected %v", err)
|
||||
}
|
||||
if want := len(tt.body); n != want {
|
||||
t.Errorf("reported short Write: got %v want %v", n, want)
|
||||
}
|
||||
resp.writeCGIHeader(nil)
|
||||
resp.Flush()
|
||||
if got := resp.Header().Get("Content-Type"); got != tt.wantCT {
|
||||
t.Errorf("wrong content-type: got %q, want %q", got, tt.wantCT)
|
||||
}
|
||||
if !bytes.HasSuffix(buf.Bytes(), []byte(tt.body)) {
|
||||
t.Errorf("body was not correctly written")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,9 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
@@ -52,7 +54,7 @@ func TestHostingOurselves(t *testing.T) {
|
||||
}
|
||||
replay := runCgiTest(t, h, "GET /test.go?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
|
||||
|
||||
if expected, got := "text/html; charset=utf-8", replay.Header().Get("Content-Type"); got != expected {
|
||||
if expected, got := "text/plain; charset=utf-8", replay.Header().Get("Content-Type"); got != expected {
|
||||
t.Errorf("got a Content-Type of %q; expected %q", got, expected)
|
||||
}
|
||||
if expected, got := "X-Test-Value", replay.Header().Get("X-Test-Header"); got != expected {
|
||||
@@ -152,6 +154,51 @@ func TestChildOnlyHeaders(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestChildContentType(t *testing.T) {
|
||||
testenv.MustHaveExec(t)
|
||||
|
||||
h := &Handler{
|
||||
Path: os.Args[0],
|
||||
Root: "/test.go",
|
||||
Args: []string{"-test.run=TestBeChildCGIProcess"},
|
||||
}
|
||||
var tests = []struct {
|
||||
name string
|
||||
body string
|
||||
wantCT string
|
||||
}{
|
||||
{
|
||||
name: "no body",
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "html",
|
||||
body: "<html><head><title>test page</title></head><body>This is a body</body></html>",
|
||||
wantCT: "text/html; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "text",
|
||||
body: strings.Repeat("gopher", 86),
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "jpg",
|
||||
body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024),
|
||||
wantCT: "image/jpeg",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
expectedMap := map[string]string{"_body": tt.body}
|
||||
req := fmt.Sprintf("GET /test.go?exact-body=%s HTTP/1.0\nHost: example.com\n\n", url.QueryEscape(tt.body))
|
||||
replay := runCgiTest(t, h, req, expectedMap)
|
||||
if got := replay.Header().Get("Content-Type"); got != tt.wantCT {
|
||||
t.Errorf("got a Content-Type of %q; expected it to start with %q", got, tt.wantCT)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// golang.org/issue/7198
|
||||
func Test500WithNoHeaders(t *testing.T) { want500Test(t, "/immediate-disconnect") }
|
||||
func Test500WithNoContentType(t *testing.T) { want500Test(t, "/no-content-type") }
|
||||
@@ -203,6 +250,10 @@ func TestBeChildCGIProcess(t *testing.T) {
|
||||
if req.FormValue("no-body") == "1" {
|
||||
return
|
||||
}
|
||||
if eb, ok := req.Form["exact-body"]; ok {
|
||||
io.WriteString(rw, eb[0])
|
||||
return
|
||||
}
|
||||
if req.FormValue("write-forever") == "1" {
|
||||
io.Copy(rw, neverEnding('a'))
|
||||
for {
|
||||
|
||||
@@ -74,10 +74,12 @@ func (r *request) parseParams() {
|
||||
|
||||
// response implements http.ResponseWriter.
|
||||
type response struct {
|
||||
req *request
|
||||
header http.Header
|
||||
w *bufWriter
|
||||
wroteHeader bool
|
||||
req *request
|
||||
header http.Header
|
||||
code int
|
||||
wroteHeader bool
|
||||
wroteCGIHeader bool
|
||||
w *bufWriter
|
||||
}
|
||||
|
||||
func newResponse(c *child, req *request) *response {
|
||||
@@ -92,11 +94,14 @@ func (r *response) Header() http.Header {
|
||||
return r.header
|
||||
}
|
||||
|
||||
func (r *response) Write(data []byte) (int, error) {
|
||||
func (r *response) Write(p []byte) (n int, err error) {
|
||||
if !r.wroteHeader {
|
||||
r.WriteHeader(http.StatusOK)
|
||||
}
|
||||
return r.w.Write(data)
|
||||
if !r.wroteCGIHeader {
|
||||
r.writeCGIHeader(p)
|
||||
}
|
||||
return r.w.Write(p)
|
||||
}
|
||||
|
||||
func (r *response) WriteHeader(code int) {
|
||||
@@ -104,22 +109,34 @@ func (r *response) WriteHeader(code int) {
|
||||
return
|
||||
}
|
||||
r.wroteHeader = true
|
||||
r.code = code
|
||||
if code == http.StatusNotModified {
|
||||
// Must not have body.
|
||||
r.header.Del("Content-Type")
|
||||
r.header.Del("Content-Length")
|
||||
r.header.Del("Transfer-Encoding")
|
||||
} else if r.header.Get("Content-Type") == "" {
|
||||
r.header.Set("Content-Type", "text/html; charset=utf-8")
|
||||
}
|
||||
|
||||
if r.header.Get("Date") == "" {
|
||||
r.header.Set("Date", time.Now().UTC().Format(http.TimeFormat))
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Fprintf(r.w, "Status: %d %s\r\n", code, http.StatusText(code))
|
||||
// writeCGIHeader finalizes the header sent to the client and writes it to the output.
|
||||
// p is not written by writeHeader, but is the first chunk of the body
|
||||
// that will be written. It is sniffed for a Content-Type if none is
|
||||
// set explicitly.
|
||||
func (r *response) writeCGIHeader(p []byte) {
|
||||
if r.wroteCGIHeader {
|
||||
return
|
||||
}
|
||||
r.wroteCGIHeader = true
|
||||
fmt.Fprintf(r.w, "Status: %d %s\r\n", r.code, http.StatusText(r.code))
|
||||
if _, hasType := r.header["Content-Type"]; r.code != http.StatusNotModified && !hasType {
|
||||
r.header.Set("Content-Type", http.DetectContentType(p))
|
||||
}
|
||||
r.header.Write(r.w)
|
||||
r.w.WriteString("\r\n")
|
||||
r.w.Flush()
|
||||
}
|
||||
|
||||
func (r *response) Flush() {
|
||||
@@ -290,6 +307,8 @@ func (c *child) serveRequest(req *request, body io.ReadCloser) {
|
||||
httpReq = httpReq.WithContext(envVarCtx)
|
||||
c.handler.ServeHTTP(r, httpReq)
|
||||
}
|
||||
// Make sure we serve something even if nothing was written to r
|
||||
r.Write(nil)
|
||||
r.Close()
|
||||
c.mu.Lock()
|
||||
delete(c.requests, req.reqId)
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -344,3 +345,55 @@ func TestChildServeReadsEnvVars(t *testing.T) {
|
||||
<-done
|
||||
}
|
||||
}
|
||||
|
||||
func TestResponseWriterSniffsContentType(t *testing.T) {
|
||||
t.Skip("this test is flaky, see Issue 41167")
|
||||
var tests = []struct {
|
||||
name string
|
||||
body string
|
||||
wantCT string
|
||||
}{
|
||||
{
|
||||
name: "no body",
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "html",
|
||||
body: "<html><head><title>test page</title></head><body>This is a body</body></html>",
|
||||
wantCT: "text/html; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "text",
|
||||
body: strings.Repeat("gopher", 86),
|
||||
wantCT: "text/plain; charset=utf-8",
|
||||
},
|
||||
{
|
||||
name: "jpg",
|
||||
body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024),
|
||||
wantCT: "image/jpeg",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
input := make([]byte, len(streamFullRequestStdin))
|
||||
copy(input, streamFullRequestStdin)
|
||||
rc := nopWriteCloser{bytes.NewBuffer(input)}
|
||||
done := make(chan bool)
|
||||
var resp *response
|
||||
c := newChild(rc, http.HandlerFunc(func(
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
) {
|
||||
io.WriteString(w, tt.body)
|
||||
resp = w.(*response)
|
||||
done <- true
|
||||
}))
|
||||
defer c.cleanUp()
|
||||
go c.serve()
|
||||
<-done
|
||||
if got := resp.Header().Get("Content-Type"); got != tt.wantCT {
|
||||
t.Errorf("got a Content-Type of %q; expected it to start with %q", got, tt.wantCT)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -279,9 +279,6 @@ func (p *addrParser) parseAddressList() ([]*Address, error) {
|
||||
if p.consume(',') {
|
||||
continue
|
||||
}
|
||||
if p.empty() {
|
||||
break
|
||||
}
|
||||
|
||||
addrs, err := p.parseAddress(true)
|
||||
if err != nil {
|
||||
@@ -295,9 +292,17 @@ func (p *addrParser) parseAddressList() ([]*Address, error) {
|
||||
if p.empty() {
|
||||
break
|
||||
}
|
||||
if !p.consume(',') {
|
||||
if p.peek() != ',' {
|
||||
return nil, errors.New("mail: expected comma")
|
||||
}
|
||||
|
||||
// Skip empty entries for obs-addr-list.
|
||||
for p.consume(',') {
|
||||
p.skipSpace()
|
||||
}
|
||||
if p.empty() {
|
||||
break
|
||||
}
|
||||
}
|
||||
return list, nil
|
||||
}
|
||||
|
||||
@@ -445,6 +445,19 @@ func TestAddressParsing(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
` , joe@where.test,,John <jdoe@one.test>,,`,
|
||||
[]*Address{
|
||||
{
|
||||
Name: "",
|
||||
Address: "joe@where.test",
|
||||
},
|
||||
{
|
||||
Name: "John",
|
||||
Address: "jdoe@one.test",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
`Group1: <addr1@example.com>;, Group 2: addr2@example.com;, John <addr3@example.com>`,
|
||||
[]*Address{
|
||||
@@ -1067,3 +1080,22 @@ func TestAddressFormattingAndParsing(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEmptyAddress(t *testing.T) {
|
||||
parsed, err := ParseAddress("")
|
||||
if parsed != nil || err == nil {
|
||||
t.Errorf(`ParseAddress("") = %v, %v, want nil, error`, parsed, err)
|
||||
}
|
||||
list, err := ParseAddressList("")
|
||||
if len(list) > 0 || err == nil {
|
||||
t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err)
|
||||
}
|
||||
list, err = ParseAddressList(",")
|
||||
if len(list) > 0 || err == nil {
|
||||
t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err)
|
||||
}
|
||||
list, err = ParseAddressList("a@b c@d")
|
||||
if len(list) > 0 || err == nil {
|
||||
t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -916,23 +916,23 @@ TEXT ·checkASM(SB),NOSPLIT,$0-1
|
||||
// - R20 is the destination of the write
|
||||
// - R21 is the value being written at R20.
|
||||
// It clobbers condition codes.
|
||||
// It does not clobber R0 through R15,
|
||||
// It does not clobber R0 through R17 (except special registers),
|
||||
// but may clobber any other register, *including* R31.
|
||||
TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$112
|
||||
// The standard prologue clobbers R31.
|
||||
// We use R16 and R17 as scratch registers.
|
||||
MOVD g_m(g), R16
|
||||
MOVD m_p(R16), R16
|
||||
MOVD (p_wbBuf+wbBuf_next)(R16), R17
|
||||
// We use R18 and R19 as scratch registers.
|
||||
MOVD g_m(g), R18
|
||||
MOVD m_p(R18), R18
|
||||
MOVD (p_wbBuf+wbBuf_next)(R18), R19
|
||||
// Increment wbBuf.next position.
|
||||
ADD $16, R17
|
||||
MOVD R17, (p_wbBuf+wbBuf_next)(R16)
|
||||
MOVD (p_wbBuf+wbBuf_end)(R16), R16
|
||||
CMP R16, R17
|
||||
ADD $16, R19
|
||||
MOVD R19, (p_wbBuf+wbBuf_next)(R18)
|
||||
MOVD (p_wbBuf+wbBuf_end)(R18), R18
|
||||
CMP R18, R19
|
||||
// Record the write.
|
||||
MOVD R21, -16(R17) // Record value
|
||||
MOVD (R20), R16 // TODO: This turns bad writes into bad reads.
|
||||
MOVD R16, -8(R17) // Record *slot
|
||||
MOVD R21, -16(R19) // Record value
|
||||
MOVD (R20), R18 // TODO: This turns bad writes into bad reads.
|
||||
MOVD R18, -8(R19) // Record *slot
|
||||
// Is the buffer full? (flags set in CMP above)
|
||||
BEQ flush
|
||||
ret:
|
||||
@@ -956,11 +956,12 @@ flush:
|
||||
MOVD R8, (FIXED_FRAME+56)(R1)
|
||||
MOVD R9, (FIXED_FRAME+64)(R1)
|
||||
MOVD R10, (FIXED_FRAME+72)(R1)
|
||||
MOVD R11, (FIXED_FRAME+80)(R1)
|
||||
MOVD R12, (FIXED_FRAME+88)(R1)
|
||||
// R11, R12 may be clobbered by external-linker-inserted trampoline
|
||||
// R13 is REGTLS
|
||||
MOVD R14, (FIXED_FRAME+96)(R1)
|
||||
MOVD R15, (FIXED_FRAME+104)(R1)
|
||||
MOVD R14, (FIXED_FRAME+80)(R1)
|
||||
MOVD R15, (FIXED_FRAME+88)(R1)
|
||||
MOVD R16, (FIXED_FRAME+96)(R1)
|
||||
MOVD R17, (FIXED_FRAME+104)(R1)
|
||||
|
||||
// This takes arguments R20 and R21.
|
||||
CALL runtime·wbBufFlush(SB)
|
||||
@@ -975,10 +976,10 @@ flush:
|
||||
MOVD (FIXED_FRAME+56)(R1), R8
|
||||
MOVD (FIXED_FRAME+64)(R1), R9
|
||||
MOVD (FIXED_FRAME+72)(R1), R10
|
||||
MOVD (FIXED_FRAME+80)(R1), R11
|
||||
MOVD (FIXED_FRAME+88)(R1), R12
|
||||
MOVD (FIXED_FRAME+96)(R1), R14
|
||||
MOVD (FIXED_FRAME+104)(R1), R15
|
||||
MOVD (FIXED_FRAME+80)(R1), R14
|
||||
MOVD (FIXED_FRAME+88)(R1), R15
|
||||
MOVD (FIXED_FRAME+96)(R1), R16
|
||||
MOVD (FIXED_FRAME+104)(R1), R17
|
||||
JMP ret
|
||||
|
||||
// Note: these functions use a special calling convention to save generated code space.
|
||||
|
||||
@@ -27,6 +27,7 @@ func TestCheckPtr(t *testing.T) {
|
||||
{"CheckPtrAlignmentPtr", "fatal error: checkptr: misaligned pointer conversion\n"},
|
||||
{"CheckPtrAlignmentNoPtr", ""},
|
||||
{"CheckPtrArithmetic", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"},
|
||||
{"CheckPtrArithmetic2", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"},
|
||||
{"CheckPtrSize", "fatal error: checkptr: converted pointer straddles multiple allocations\n"},
|
||||
{"CheckPtrSmall", "fatal error: checkptr: pointer arithmetic computed bad pointer value\n"},
|
||||
}
|
||||
|
||||
@@ -18,19 +18,29 @@ func getLockRank(l *mutex) lockRank {
|
||||
return 0
|
||||
}
|
||||
|
||||
// The following functions may be called in nosplit context.
|
||||
// Nosplit is not strictly required for lockWithRank, unlockWithRank
|
||||
// and lockWithRankMayAcquire, but these nosplit annotations must
|
||||
// be kept consistent with the equivalent functions in lockrank_on.go.
|
||||
|
||||
//go:nosplit
|
||||
func lockWithRank(l *mutex, rank lockRank) {
|
||||
lock2(l)
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func acquireLockRank(rank lockRank) {
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func unlockWithRank(l *mutex) {
|
||||
unlock2(l)
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func releaseLockRank(rank lockRank) {
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func lockWithRankMayAcquire(l *mutex, rank lockRank) {
|
||||
}
|
||||
|
||||
@@ -36,7 +36,10 @@ const (
|
||||
//go:cgo_import_dynamic runtime._SetThreadContext SetThreadContext%2 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._LoadLibraryA LoadLibraryA%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._OpenProcess OpenProcess%3 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._PostQueuedCompletionStatus PostQueuedCompletionStatus%4 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._ProcessIdToSessionId ProcessIdToSessionId%2 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._QueryFullProcessImageNameA QueryFullProcessImageNameA%4 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._ResumeThread ResumeThread%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._SetErrorMode SetErrorMode%1 "kernel32.dll"
|
||||
@@ -84,7 +87,10 @@ var (
|
||||
_SetThreadContext,
|
||||
_LoadLibraryW,
|
||||
_LoadLibraryA,
|
||||
_OpenProcess,
|
||||
_PostQueuedCompletionStatus,
|
||||
_ProcessIdToSessionId,
|
||||
_QueryFullProcessImageNameA,
|
||||
_QueryPerformanceCounter,
|
||||
_QueryPerformanceFrequency,
|
||||
_ResumeThread,
|
||||
@@ -128,7 +134,8 @@ var (
|
||||
// Load ntdll.dll manually during startup, otherwise Mingw
|
||||
// links wrong printf function to cgo executable (see issue
|
||||
// 12030 for details).
|
||||
_NtWaitForSingleObject stdFunction
|
||||
_NtWaitForSingleObject stdFunction
|
||||
_NtQueryInformationProcess stdFunction
|
||||
|
||||
// These are from non-kernel32.dll, so we prefer to LoadLibraryEx them.
|
||||
_timeBeginPeriod,
|
||||
@@ -255,6 +262,7 @@ func loadOptionalSyscalls() {
|
||||
throw("ntdll.dll not found")
|
||||
}
|
||||
_NtWaitForSingleObject = windowsFindfunc(n32, []byte("NtWaitForSingleObject\000"))
|
||||
_NtQueryInformationProcess = windowsFindfunc(n32, []byte("NtQueryInformationProcess\000"))
|
||||
|
||||
if GOARCH == "arm" {
|
||||
_QueryPerformanceCounter = windowsFindfunc(k32, []byte("QueryPerformanceCounter\000"))
|
||||
@@ -995,6 +1003,63 @@ func usleep(us uint32) {
|
||||
onosstack(usleep2Addr, 10*us)
|
||||
}
|
||||
|
||||
// isWindowsService returns whether the process is currently executing as a
|
||||
// Windows service. The below technique looks a bit hairy, but it's actually
|
||||
// exactly what the .NET framework does for the similarly named function:
|
||||
// https://github.com/dotnet/extensions/blob/f4066026ca06984b07e90e61a6390ac38152ba93/src/Hosting/WindowsServices/src/WindowsServiceHelpers.cs#L26-L31
|
||||
// Specifically, it looks up whether the parent process has session ID zero
|
||||
// and is called "services".
|
||||
func isWindowsService() bool {
|
||||
const (
|
||||
_CURRENT_PROCESS = ^uintptr(0)
|
||||
_PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
|
||||
)
|
||||
// pbi is a PROCESS_BASIC_INFORMATION struct, where we just care about
|
||||
// the 6th pointer inside of it, which contains the pid of the process
|
||||
// parent:
|
||||
// https://github.com/wine-mirror/wine/blob/42cb7d2ad1caba08de235e6319b9967296b5d554/include/winternl.h#L1294
|
||||
var pbi [6]uintptr
|
||||
var pbiLen uint32
|
||||
err := stdcall5(_NtQueryInformationProcess, _CURRENT_PROCESS, 0, uintptr(unsafe.Pointer(&pbi[0])), uintptr(unsafe.Sizeof(pbi)), uintptr(unsafe.Pointer(&pbiLen)))
|
||||
if err != 0 {
|
||||
return false
|
||||
}
|
||||
var psid uint32
|
||||
err = stdcall2(_ProcessIdToSessionId, pbi[5], uintptr(unsafe.Pointer(&psid)))
|
||||
if err == 0 || psid != 0 {
|
||||
return false
|
||||
}
|
||||
pproc := stdcall3(_OpenProcess, _PROCESS_QUERY_LIMITED_INFORMATION, 0, pbi[5])
|
||||
if pproc == 0 {
|
||||
return false
|
||||
}
|
||||
defer stdcall1(_CloseHandle, pproc)
|
||||
// exeName gets the path to the executable image of the parent process
|
||||
var exeName [261]byte
|
||||
exeNameLen := uint32(len(exeName) - 1)
|
||||
err = stdcall4(_QueryFullProcessImageNameA, pproc, 0, uintptr(unsafe.Pointer(&exeName[0])), uintptr(unsafe.Pointer(&exeNameLen)))
|
||||
if err == 0 || exeNameLen == 0 {
|
||||
return false
|
||||
}
|
||||
servicesLower := "services.exe"
|
||||
servicesUpper := "SERVICES.EXE"
|
||||
i := int(exeNameLen) - 1
|
||||
j := len(servicesLower) - 1
|
||||
if i < j {
|
||||
return false
|
||||
}
|
||||
for {
|
||||
if j == -1 {
|
||||
return i == -1 || exeName[i] == '\\'
|
||||
}
|
||||
if exeName[i] != servicesLower[j] && exeName[i] != servicesUpper[j] {
|
||||
return false
|
||||
}
|
||||
i--
|
||||
j--
|
||||
}
|
||||
}
|
||||
|
||||
func ctrlhandler1(_type uint32) uint32 {
|
||||
var s uint32
|
||||
|
||||
@@ -1010,9 +1075,9 @@ func ctrlhandler1(_type uint32) uint32 {
|
||||
if sigsend(s) {
|
||||
return 1
|
||||
}
|
||||
if !islibrary && !isarchive {
|
||||
// Only exit the program if we don't have a DLL.
|
||||
// See https://golang.org/issues/35965.
|
||||
if !islibrary && !isarchive && !isWindowsService() {
|
||||
// Only exit the program if we don't have a DLL or service.
|
||||
// See https://golang.org/issues/35965 and https://golang.org/issues/40167
|
||||
exit(2) // SIGINT, SIGTERM, etc
|
||||
}
|
||||
return 0
|
||||
|
||||
@@ -222,7 +222,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0-16
|
||||
RET
|
||||
|
||||
// func walltime1() (sec int64, nsec int32)
|
||||
TEXT runtime·walltime1(SB), NOSPLIT, $0-12
|
||||
TEXT runtime·walltime1(SB), NOSPLIT, $8-12
|
||||
// We don't know how much stack space the VDSO code will need,
|
||||
// so switch to g0.
|
||||
|
||||
@@ -233,6 +233,13 @@ TEXT runtime·walltime1(SB), NOSPLIT, $0-12
|
||||
MOVL g_m(AX), SI // SI unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVL m_vdsoPC(SI), CX
|
||||
MOVL m_vdsoSP(SI), DX
|
||||
MOVL CX, 0(SP)
|
||||
MOVL DX, 4(SP)
|
||||
|
||||
LEAL sec+0(FP), DX
|
||||
MOVL -4(DX), CX
|
||||
MOVL CX, m_vdsoPC(SI)
|
||||
@@ -276,7 +283,15 @@ finish:
|
||||
MOVL 12(SP), BX // nsec
|
||||
|
||||
MOVL BP, SP // Restore real SP
|
||||
MOVL $0, m_vdsoSP(SI)
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVL 4(SP), CX
|
||||
MOVL CX, m_vdsoSP(SI)
|
||||
MOVL 0(SP), CX
|
||||
MOVL CX, m_vdsoPC(SI)
|
||||
|
||||
// sec is in AX, nsec in BX
|
||||
MOVL AX, sec_lo+0(FP)
|
||||
@@ -286,7 +301,7 @@ finish:
|
||||
|
||||
// int64 nanotime(void) so really
|
||||
// void nanotime(int64 *nsec)
|
||||
TEXT runtime·nanotime1(SB), NOSPLIT, $0-8
|
||||
TEXT runtime·nanotime1(SB), NOSPLIT, $8-8
|
||||
// Switch to g0 stack. See comment above in runtime·walltime.
|
||||
|
||||
MOVL SP, BP // Save old SP; BP unchanged by C code.
|
||||
@@ -296,6 +311,13 @@ TEXT runtime·nanotime1(SB), NOSPLIT, $0-8
|
||||
MOVL g_m(AX), SI // SI unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVL m_vdsoPC(SI), CX
|
||||
MOVL m_vdsoSP(SI), DX
|
||||
MOVL CX, 0(SP)
|
||||
MOVL DX, 4(SP)
|
||||
|
||||
LEAL ret+0(FP), DX
|
||||
MOVL -4(DX), CX
|
||||
MOVL CX, m_vdsoPC(SI)
|
||||
@@ -332,7 +354,15 @@ finish:
|
||||
MOVL 12(SP), BX // nsec
|
||||
|
||||
MOVL BP, SP // Restore real SP
|
||||
MOVL $0, m_vdsoSP(SI)
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVL 4(SP), CX
|
||||
MOVL CX, m_vdsoSP(SI)
|
||||
MOVL 0(SP), CX
|
||||
MOVL CX, m_vdsoPC(SI)
|
||||
|
||||
// sec is in AX, nsec in BX
|
||||
// convert to DX:AX nsec
|
||||
|
||||
@@ -206,7 +206,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0-28
|
||||
|
||||
// func walltime1() (sec int64, nsec int32)
|
||||
// non-zero frame-size means bp is saved and restored
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$8-12
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$16-12
|
||||
// We don't know how much stack space the VDSO code will need,
|
||||
// so switch to g0.
|
||||
// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n
|
||||
@@ -221,6 +221,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$8-12
|
||||
MOVQ g_m(AX), BX // BX unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVQ m_vdsoPC(BX), CX
|
||||
MOVQ m_vdsoSP(BX), DX
|
||||
MOVQ CX, 0(SP)
|
||||
MOVQ DX, 8(SP)
|
||||
|
||||
LEAQ sec+0(FP), DX
|
||||
MOVQ -8(DX), CX
|
||||
MOVQ CX, m_vdsoPC(BX)
|
||||
@@ -244,8 +251,17 @@ noswitch:
|
||||
CALL AX
|
||||
MOVQ 0(SP), AX // sec
|
||||
MOVQ 8(SP), DX // nsec
|
||||
ret:
|
||||
MOVQ BP, SP // Restore real SP
|
||||
MOVQ $0, m_vdsoSP(BX)
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVQ 8(SP), CX
|
||||
MOVQ CX, m_vdsoSP(BX)
|
||||
MOVQ 0(SP), CX
|
||||
MOVQ CX, m_vdsoPC(BX)
|
||||
MOVQ AX, sec+0(FP)
|
||||
MOVL DX, nsec+8(FP)
|
||||
RET
|
||||
@@ -257,15 +273,10 @@ fallback:
|
||||
MOVQ 0(SP), AX // sec
|
||||
MOVL 8(SP), DX // usec
|
||||
IMULQ $1000, DX
|
||||
MOVQ BP, SP // Restore real SP
|
||||
MOVQ $0, m_vdsoSP(BX)
|
||||
MOVQ AX, sec+0(FP)
|
||||
MOVL DX, nsec+8(FP)
|
||||
RET
|
||||
JMP ret
|
||||
|
||||
// func nanotime1() int64
|
||||
// non-zero frame-size means bp is saved and restored
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
|
||||
// Switch to g0 stack. See comment above in runtime·walltime.
|
||||
|
||||
MOVQ SP, BP // Save old SP; BP unchanged by C code.
|
||||
@@ -275,6 +286,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
|
||||
MOVQ g_m(AX), BX // BX unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVQ m_vdsoPC(BX), CX
|
||||
MOVQ m_vdsoSP(BX), DX
|
||||
MOVQ CX, 0(SP)
|
||||
MOVQ DX, 8(SP)
|
||||
|
||||
LEAQ ret+0(FP), DX
|
||||
MOVQ -8(DX), CX
|
||||
MOVQ CX, m_vdsoPC(BX)
|
||||
@@ -298,8 +316,17 @@ noswitch:
|
||||
CALL AX
|
||||
MOVQ 0(SP), AX // sec
|
||||
MOVQ 8(SP), DX // nsec
|
||||
ret:
|
||||
MOVQ BP, SP // Restore real SP
|
||||
MOVQ $0, m_vdsoSP(BX)
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVQ 8(SP), CX
|
||||
MOVQ CX, m_vdsoSP(BX)
|
||||
MOVQ 0(SP), CX
|
||||
MOVQ CX, m_vdsoPC(BX)
|
||||
// sec is in AX, nsec in DX
|
||||
// return nsec in AX
|
||||
IMULQ $1000000000, AX
|
||||
@@ -313,15 +340,8 @@ fallback:
|
||||
CALL AX
|
||||
MOVQ 0(SP), AX // sec
|
||||
MOVL 8(SP), DX // usec
|
||||
MOVQ BP, SP // Restore real SP
|
||||
MOVQ $0, m_vdsoSP(BX)
|
||||
IMULQ $1000, DX
|
||||
// sec is in AX, nsec in DX
|
||||
// return nsec in AX
|
||||
IMULQ $1000000000, AX
|
||||
ADDQ DX, AX
|
||||
MOVQ AX, ret+0(FP)
|
||||
RET
|
||||
JMP ret
|
||||
|
||||
TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-28
|
||||
MOVL how+0(FP), DI
|
||||
|
||||
@@ -242,7 +242,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0
|
||||
MOVW R0, ret+12(FP)
|
||||
RET
|
||||
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$0-12
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$8-12
|
||||
// We don't know how much stack space the VDSO code will need,
|
||||
// so switch to g0.
|
||||
|
||||
@@ -252,6 +252,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$0-12
|
||||
MOVW g_m(g), R5 // R5 is unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVW m_vdsoPC(R5), R1
|
||||
MOVW m_vdsoSP(R5), R2
|
||||
MOVW R1, 4(R13)
|
||||
MOVW R2, 8(R13)
|
||||
|
||||
MOVW LR, m_vdsoPC(R5)
|
||||
MOVW R13, m_vdsoSP(R5)
|
||||
|
||||
@@ -312,8 +319,15 @@ finish:
|
||||
MOVW 12(R13), R2 // nsec
|
||||
|
||||
MOVW R4, R13 // Restore real SP
|
||||
MOVW $0, R1
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVW 8(R13), R1
|
||||
MOVW R1, m_vdsoSP(R5)
|
||||
MOVW 4(R13), R1
|
||||
MOVW R1, m_vdsoPC(R5)
|
||||
|
||||
MOVW R0, sec_lo+0(FP)
|
||||
MOVW R1, sec_hi+4(FP)
|
||||
@@ -321,7 +335,7 @@ finish:
|
||||
RET
|
||||
|
||||
// int64 nanotime1(void)
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$0-8
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
|
||||
// Switch to g0 stack. See comment above in runtime·walltime.
|
||||
|
||||
// Save old SP. Use R13 instead of SP to avoid linker rewriting the offsets.
|
||||
@@ -330,6 +344,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$0-8
|
||||
MOVW g_m(g), R5 // R5 is unchanged by C code.
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVW m_vdsoPC(R5), R1
|
||||
MOVW m_vdsoSP(R5), R2
|
||||
MOVW R1, 4(R13)
|
||||
MOVW R2, 8(R13)
|
||||
|
||||
MOVW LR, m_vdsoPC(R5)
|
||||
MOVW R13, m_vdsoSP(R5)
|
||||
|
||||
@@ -390,8 +411,15 @@ finish:
|
||||
MOVW 12(R13), R2 // nsec
|
||||
|
||||
MOVW R4, R13 // Restore real SP
|
||||
MOVW $0, R4
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVW 8(R13), R4
|
||||
MOVW R4, m_vdsoSP(R5)
|
||||
MOVW 4(R13), R4
|
||||
MOVW R4, m_vdsoPC(R5)
|
||||
|
||||
MOVW $1000000000, R3
|
||||
MULLU R0, R3, (R1, R0)
|
||||
|
||||
@@ -214,6 +214,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$24-12
|
||||
MOVD g_m(g), R21 // R21 = m
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVD m_vdsoPC(R21), R2
|
||||
MOVD m_vdsoSP(R21), R3
|
||||
MOVD R2, 8(RSP)
|
||||
MOVD R3, 16(RSP)
|
||||
|
||||
MOVD LR, m_vdsoPC(R21)
|
||||
MOVD R20, m_vdsoSP(R21)
|
||||
|
||||
@@ -269,7 +276,15 @@ finish:
|
||||
MOVD 8(RSP), R5 // nsec
|
||||
|
||||
MOVD R20, RSP // restore SP
|
||||
MOVD $0, m_vdsoSP(R21) // clear vdsoSP
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVD 16(RSP), R1
|
||||
MOVD R1, m_vdsoSP(R21)
|
||||
MOVD 8(RSP), R1
|
||||
MOVD R1, m_vdsoPC(R21)
|
||||
|
||||
MOVD R3, sec+0(FP)
|
||||
MOVW R5, nsec+8(FP)
|
||||
@@ -282,6 +297,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$24-8
|
||||
MOVD g_m(g), R21 // R21 = m
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVD m_vdsoPC(R21), R2
|
||||
MOVD m_vdsoSP(R21), R3
|
||||
MOVD R2, 8(RSP)
|
||||
MOVD R3, 16(RSP)
|
||||
|
||||
MOVD LR, m_vdsoPC(R21)
|
||||
MOVD R20, m_vdsoSP(R21)
|
||||
|
||||
@@ -337,7 +359,15 @@ finish:
|
||||
MOVD 8(RSP), R5 // nsec
|
||||
|
||||
MOVD R20, RSP // restore SP
|
||||
MOVD $0, m_vdsoSP(R21) // clear vdsoSP
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVD 16(RSP), R1
|
||||
MOVD R1, m_vdsoSP(R21)
|
||||
MOVD 8(RSP), R1
|
||||
MOVD R1, m_vdsoPC(R21)
|
||||
|
||||
// sec is in R3, nsec in R5
|
||||
// return nsec in R3
|
||||
|
||||
@@ -214,13 +214,20 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
|
||||
RET
|
||||
|
||||
// func walltime1() (sec int64, nsec int32)
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$16
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$16-12
|
||||
MOVV R29, R16 // R16 is unchanged by C code
|
||||
MOVV R29, R1
|
||||
|
||||
MOVV g_m(g), R17 // R17 = m
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVV m_vdsoPC(R17), R2
|
||||
MOVV m_vdsoSP(R17), R3
|
||||
MOVV R2, 8(R29)
|
||||
MOVV R3, 16(R29)
|
||||
|
||||
MOVV R31, m_vdsoPC(R17)
|
||||
MOVV R29, m_vdsoSP(R17)
|
||||
|
||||
@@ -249,7 +256,15 @@ finish:
|
||||
MOVV 8(R29), R5 // nsec
|
||||
|
||||
MOVV R16, R29 // restore SP
|
||||
MOVV R0, m_vdsoSP(R17) // clear vdsoSP
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVV 16(R29), R1
|
||||
MOVV R1, m_vdsoSP(R17)
|
||||
MOVV 8(R29), R1
|
||||
MOVV R1, m_vdsoPC(R17)
|
||||
|
||||
MOVV R3, sec+0(FP)
|
||||
MOVW R5, nsec+8(FP)
|
||||
@@ -260,13 +275,20 @@ fallback:
|
||||
SYSCALL
|
||||
JMP finish
|
||||
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$16
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
|
||||
MOVV R29, R16 // R16 is unchanged by C code
|
||||
MOVV R29, R1
|
||||
|
||||
MOVV g_m(g), R17 // R17 = m
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVV m_vdsoPC(R17), R2
|
||||
MOVV m_vdsoSP(R17), R3
|
||||
MOVV R2, 8(R29)
|
||||
MOVV R3, 16(R29)
|
||||
|
||||
MOVV R31, m_vdsoPC(R17)
|
||||
MOVV R29, m_vdsoSP(R17)
|
||||
|
||||
@@ -295,7 +317,15 @@ finish:
|
||||
MOVV 8(R29), R5 // nsec
|
||||
|
||||
MOVV R16, R29 // restore SP
|
||||
MOVV R0, m_vdsoSP(R17) // clear vdsoSP
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVV 16(R29), R1
|
||||
MOVV R1, m_vdsoSP(R17)
|
||||
MOVV 8(R29), R1
|
||||
MOVV R1, m_vdsoPC(R17)
|
||||
|
||||
// sec is in R3, nsec in R5
|
||||
// return nsec in R3
|
||||
|
||||
@@ -185,7 +185,7 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
|
||||
RET
|
||||
|
||||
// func walltime1() (sec int64, nsec int32)
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$16
|
||||
TEXT runtime·walltime1(SB),NOSPLIT,$16-12
|
||||
MOVD R1, R15 // R15 is unchanged by C code
|
||||
MOVD g_m(g), R21 // R21 = m
|
||||
|
||||
@@ -196,6 +196,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16
|
||||
BEQ fallback
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVD m_vdsoPC(R21), R4
|
||||
MOVD m_vdsoSP(R21), R5
|
||||
MOVD R4, 32(R1)
|
||||
MOVD R5, 40(R1)
|
||||
|
||||
MOVD LR, R14
|
||||
MOVD R14, m_vdsoPC(R21)
|
||||
MOVD R15, m_vdsoSP(R21)
|
||||
@@ -214,11 +221,20 @@ noswitch:
|
||||
MOVD R1, R4
|
||||
BL (CTR) // Call from VDSO
|
||||
MOVD $0, R0 // Restore R0
|
||||
MOVD R0, m_vdsoSP(R21) // Clear vdsoSP
|
||||
MOVD 0(R1), R3 // sec
|
||||
MOVD 8(R1), R5 // nsec
|
||||
MOVD R15, R1 // Restore SP
|
||||
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVD 40(R1), R6
|
||||
MOVD R6, m_vdsoSP(R21)
|
||||
MOVD 32(R1), R6
|
||||
MOVD R6, m_vdsoPC(R21)
|
||||
|
||||
finish:
|
||||
MOVD R3, sec+0(FP)
|
||||
MOVW R5, nsec+8(FP)
|
||||
@@ -232,7 +248,7 @@ fallback:
|
||||
MOVD 40(R1), R5
|
||||
JMP finish
|
||||
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$16
|
||||
TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
|
||||
MOVD $1, R3 // CLOCK_MONOTONIC
|
||||
|
||||
MOVD R1, R15 // R15 is unchanged by C code
|
||||
@@ -243,6 +259,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$16
|
||||
BEQ fallback
|
||||
|
||||
// Set vdsoPC and vdsoSP for SIGPROF traceback.
|
||||
// Save the old values on stack and restore them on exit,
|
||||
// so this function is reentrant.
|
||||
MOVD m_vdsoPC(R21), R4
|
||||
MOVD m_vdsoSP(R21), R5
|
||||
MOVD R4, 32(R1)
|
||||
MOVD R5, 40(R1)
|
||||
|
||||
MOVD LR, R14 // R14 is unchanged by C code
|
||||
MOVD R14, m_vdsoPC(R21)
|
||||
MOVD R15, m_vdsoSP(R21)
|
||||
@@ -261,11 +284,20 @@ noswitch:
|
||||
MOVD R1, R4
|
||||
BL (CTR) // Call from VDSO
|
||||
MOVD $0, R0 // Restore R0
|
||||
MOVD $0, m_vdsoSP(R21) // Clear vdsoSP
|
||||
MOVD 0(R1), R3 // sec
|
||||
MOVD 8(R1), R5 // nsec
|
||||
MOVD R15, R1 // Restore SP
|
||||
|
||||
// Restore vdsoPC, vdsoSP
|
||||
// We don't worry about being signaled between the two stores.
|
||||
// If we are not in a signal handler, we'll restore vdsoSP to 0,
|
||||
// and no one will care about vdsoPC. If we are in a signal handler,
|
||||
// we cannot receive another signal.
|
||||
MOVD 40(R1), R6
|
||||
MOVD R6, m_vdsoSP(R21)
|
||||
MOVD 32(R1), R6
|
||||
MOVD R6, m_vdsoPC(R21)
|
||||
|
||||
finish:
|
||||
// sec is in R3, nsec in R5
|
||||
// return nsec in R3
|
||||
|
||||
8
src/runtime/testdata/testprog/checkptr.go
vendored
8
src/runtime/testdata/testprog/checkptr.go
vendored
@@ -10,6 +10,7 @@ func init() {
|
||||
register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr)
|
||||
register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr)
|
||||
register("CheckPtrArithmetic", CheckPtrArithmetic)
|
||||
register("CheckPtrArithmetic2", CheckPtrArithmetic2)
|
||||
register("CheckPtrSize", CheckPtrSize)
|
||||
register("CheckPtrSmall", CheckPtrSmall)
|
||||
}
|
||||
@@ -32,6 +33,13 @@ func CheckPtrArithmetic() {
|
||||
sink2 = (*int)(unsafe.Pointer(i))
|
||||
}
|
||||
|
||||
func CheckPtrArithmetic2() {
|
||||
var x [2]int64
|
||||
p := unsafe.Pointer(&x[1])
|
||||
var one uintptr = 1
|
||||
sink2 = unsafe.Pointer(uintptr(p) & ^one)
|
||||
}
|
||||
|
||||
func CheckPtrSize() {
|
||||
p := new(int64)
|
||||
sink2 = p
|
||||
|
||||
@@ -274,6 +274,7 @@ func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) {
|
||||
e, ok = read.m[key]
|
||||
if !ok && read.amended {
|
||||
e, ok = m.dirty[key]
|
||||
delete(m.dirty, key)
|
||||
// Regardless of whether the entry was present, record a miss: this key
|
||||
// will take the slow path until the dirty map is promoted to the read
|
||||
// map.
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"reflect"
|
||||
"runtime"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"testing/quick"
|
||||
)
|
||||
@@ -171,3 +172,26 @@ func TestConcurrentRange(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIssue40999(t *testing.T) {
|
||||
var m sync.Map
|
||||
|
||||
// Since the miss-counting in missLocked (via Delete)
|
||||
// compares the miss count with len(m.dirty),
|
||||
// add an initial entry to bias len(m.dirty) above the miss count.
|
||||
m.Store(nil, struct{}{})
|
||||
|
||||
var finalized uint32
|
||||
|
||||
// Set finalizers that count for collected keys. A non-zero count
|
||||
// indicates that keys have not been leaked.
|
||||
for atomic.LoadUint32(&finalized) == 0 {
|
||||
p := new(int)
|
||||
runtime.SetFinalizer(p, func(*int) {
|
||||
atomic.AddUint32(&finalized, 1)
|
||||
})
|
||||
m.Store(p, struct{}{})
|
||||
m.Delete(p)
|
||||
runtime.GC()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,10 +357,19 @@ func (p *testPrinter) Fprint(w io.Writer, testName, out string) {
|
||||
defer p.lastNameMu.Unlock()
|
||||
|
||||
if !p.chatty ||
|
||||
strings.HasPrefix(out, "--- PASS") ||
|
||||
strings.HasPrefix(out, "--- FAIL") ||
|
||||
strings.HasPrefix(out, "=== CONT") ||
|
||||
strings.HasPrefix(out, "=== RUN") {
|
||||
strings.HasPrefix(out, "--- PASS: ") ||
|
||||
strings.HasPrefix(out, "--- FAIL: ") ||
|
||||
strings.HasPrefix(out, "--- SKIP: ") ||
|
||||
strings.HasPrefix(out, "=== RUN ") ||
|
||||
strings.HasPrefix(out, "=== CONT ") ||
|
||||
strings.HasPrefix(out, "=== PAUSE ") {
|
||||
// If we're buffering test output (!p.chatty), we don't really care which
|
||||
// test is emitting which line so long as they are serialized.
|
||||
//
|
||||
// If the message already implies an association with a specific new test,
|
||||
// we don't need to check what the old test name was or log an extra CONT
|
||||
// line for it. (We're updating it anyway, and the current message already
|
||||
// includes the test name.)
|
||||
p.lastName = testName
|
||||
fmt.Fprint(w, out)
|
||||
return
|
||||
@@ -851,11 +860,15 @@ func (c *common) Cleanup(f func()) {
|
||||
c.cleanup = func() {
|
||||
if oldCleanup != nil {
|
||||
defer func() {
|
||||
c.mu.Lock()
|
||||
c.cleanupPc = oldCleanupPc
|
||||
c.mu.Unlock()
|
||||
oldCleanup()
|
||||
}()
|
||||
}
|
||||
c.mu.Lock()
|
||||
c.cleanupName = callerName(0)
|
||||
c.mu.Unlock()
|
||||
f()
|
||||
}
|
||||
var pc [maxStackLen]uintptr
|
||||
@@ -976,7 +989,13 @@ func (t *T) Parallel() {
|
||||
for ; root.parent != nil; root = root.parent {
|
||||
}
|
||||
root.mu.Lock()
|
||||
fmt.Fprintf(root.w, "=== PAUSE %s\n", t.name)
|
||||
// Unfortunately, even though PAUSE indicates that the named test is *no
|
||||
// longer* running, cmd/test2json interprets it as changing the active test
|
||||
// for the purpose of log parsing. We could fix cmd/test2json, but that
|
||||
// won't fix existing deployments of third-party tools that already shell
|
||||
// out to older builds of cmd/test2json — so merely fixing cmd/test2json
|
||||
// isn't enough for now.
|
||||
printer.Fprint(root.w, t.name, fmt.Sprintf("=== PAUSE %s\n", t.name))
|
||||
root.mu.Unlock()
|
||||
}
|
||||
|
||||
|
||||
19
test/fixedbugs/issue40746.go
Normal file
19
test/fixedbugs/issue40746.go
Normal file
@@ -0,0 +1,19 @@
|
||||
// compile
|
||||
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package p
|
||||
|
||||
func f(x byte, b bool) byte {
|
||||
var c byte
|
||||
if b {
|
||||
c = 1
|
||||
}
|
||||
|
||||
if int8(c) < 0 {
|
||||
x++
|
||||
}
|
||||
return x
|
||||
}
|
||||
23
test/fixedbugs/issue40917.go
Normal file
23
test/fixedbugs/issue40917.go
Normal file
@@ -0,0 +1,23 @@
|
||||
// run -gcflags=-d=checkptr
|
||||
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func main() {
|
||||
var x [2]uint64
|
||||
a := unsafe.Pointer(&x[1])
|
||||
|
||||
b := a
|
||||
b = unsafe.Pointer(uintptr(b) + 2)
|
||||
b = unsafe.Pointer(uintptr(b) - 1)
|
||||
b = unsafe.Pointer(uintptr(b) &^ 1)
|
||||
|
||||
if a != b {
|
||||
panic("pointer arithmetic failed")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user