mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
Merge "[dev.typeparams] all: merge master (46fd547) into dev.typeparams" into dev.typeparams
This commit is contained in:
commit
4d3cc84774
136
CONTRIBUTORS
136
CONTRIBUTORS
@ -33,6 +33,7 @@ Aaron Jacobs <jacobsa@google.com>
|
|||||||
Aaron Jensen <jensen.aaro@gmail.com>
|
Aaron Jensen <jensen.aaro@gmail.com>
|
||||||
Aaron Kemp <kemp.aaron@gmail.com>
|
Aaron Kemp <kemp.aaron@gmail.com>
|
||||||
Aaron Patterson <tenderlove@ruby-lang.org>
|
Aaron Patterson <tenderlove@ruby-lang.org>
|
||||||
|
Aaron Sheah <aaronsheah@gmail.com>
|
||||||
Aaron Stein <aaronstein12@gmail.com>
|
Aaron Stein <aaronstein12@gmail.com>
|
||||||
Aaron Torres <tcboox@gmail.com>
|
Aaron Torres <tcboox@gmail.com>
|
||||||
Aaron Zinman <aaron@azinman.com>
|
Aaron Zinman <aaron@azinman.com>
|
||||||
@ -47,6 +48,7 @@ Adam Harvey <aharvey@php.net>
|
|||||||
Adam Kisala <adam.kisala@gmail.com>
|
Adam Kisala <adam.kisala@gmail.com>
|
||||||
Adam Langley <agl@golang.org>
|
Adam Langley <agl@golang.org>
|
||||||
Adam Medzinski <adam.medzinski@gmail.com>
|
Adam Medzinski <adam.medzinski@gmail.com>
|
||||||
|
Adam Mitha <adam.mitha@gmail.com>
|
||||||
Adam Shannon <adamkshannon@gmail.com>
|
Adam Shannon <adamkshannon@gmail.com>
|
||||||
Adam Shelton <aashelt90@gmail.com>
|
Adam Shelton <aashelt90@gmail.com>
|
||||||
Adam Sindelar <adamsh@google.com>
|
Adam Sindelar <adamsh@google.com>
|
||||||
@ -54,6 +56,8 @@ Adam Thomason <athomason@gmail.com>
|
|||||||
Adam Williams <pwnfactory@gmail.com>
|
Adam Williams <pwnfactory@gmail.com>
|
||||||
Adam Woodbeck <adam@woodbeck.net>
|
Adam Woodbeck <adam@woodbeck.net>
|
||||||
Adarsh Ravichandran <adarshravichandran91@gmail.com>
|
Adarsh Ravichandran <adarshravichandran91@gmail.com>
|
||||||
|
Adel Rodríguez <adel.rodriguez@leftfieldlabs.com>
|
||||||
|
Adin Scannell <ascannell@google.com>
|
||||||
Aditya Harindar <aditya.harindar@gmail.com>
|
Aditya Harindar <aditya.harindar@gmail.com>
|
||||||
Aditya Mukerjee <dev@chimeracoder.net>
|
Aditya Mukerjee <dev@chimeracoder.net>
|
||||||
Adrian Hesketh <adrianhesketh@hushmail.com>
|
Adrian Hesketh <adrianhesketh@hushmail.com>
|
||||||
@ -68,6 +72,7 @@ Afanasev Stanislav <phpprogger@gmail.com>
|
|||||||
Agis Anastasopoulos <agis.anast@gmail.com>
|
Agis Anastasopoulos <agis.anast@gmail.com>
|
||||||
Agniva De Sarker <agnivade@yahoo.co.in>
|
Agniva De Sarker <agnivade@yahoo.co.in>
|
||||||
Ahmed W. Mones <oneofone@gmail.com>
|
Ahmed W. Mones <oneofone@gmail.com>
|
||||||
|
Ahmet Aktürk <aakturk000@gmail.com>
|
||||||
Ahmet Alp Balkan <ahmetb@google.com>
|
Ahmet Alp Balkan <ahmetb@google.com>
|
||||||
Ahmet Soormally <ahmet@mangomm.co.uk>
|
Ahmet Soormally <ahmet@mangomm.co.uk>
|
||||||
Ahmy Yulrizka <yulrizka@gmail.com>
|
Ahmy Yulrizka <yulrizka@gmail.com>
|
||||||
@ -92,11 +97,13 @@ Alberto Bertogli <albertito@blitiri.com.ar>
|
|||||||
Alberto Donizetti <alb.donizetti@gmail.com>
|
Alberto Donizetti <alb.donizetti@gmail.com>
|
||||||
Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
|
Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
|
||||||
Alec Benzer <alec.benzer@gmail.com>
|
Alec Benzer <alec.benzer@gmail.com>
|
||||||
|
Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
|
||||||
Aleksa Sarai <cyphar@cyphar.com>
|
Aleksa Sarai <cyphar@cyphar.com>
|
||||||
Aleksandar Dezelin <dezelin@gmail.com>
|
Aleksandar Dezelin <dezelin@gmail.com>
|
||||||
Aleksandr Lukinykh <a.lukinykh@xsolla.com>
|
Aleksandr Lukinykh <a.lukinykh@xsolla.com>
|
||||||
Aleksandr Razumov <ar@cydev.ru>
|
Aleksandr Razumov <ar@cydev.ru>
|
||||||
Alekseev Artem <a.artem060@gmail.com>
|
Alekseev Artem <a.artem060@gmail.com>
|
||||||
|
Aleksei Tirman <aleksei.tirman@jetbrains.com>
|
||||||
Alessandro Arzilli <alessandro.arzilli@gmail.com>
|
Alessandro Arzilli <alessandro.arzilli@gmail.com>
|
||||||
Alessandro Baffa <alessandro.baffa@gmail.com>
|
Alessandro Baffa <alessandro.baffa@gmail.com>
|
||||||
Alex A Skinner <alex@lx.lc>
|
Alex A Skinner <alex@lx.lc>
|
||||||
@ -165,6 +172,7 @@ Ali Rizvi-Santiago <arizvisa@gmail.com>
|
|||||||
Aliaksandr Valialkin <valyala@gmail.com>
|
Aliaksandr Valialkin <valyala@gmail.com>
|
||||||
Alice Merrick <amerrick@google.com>
|
Alice Merrick <amerrick@google.com>
|
||||||
Alif Rachmawadi <subosito@gmail.com>
|
Alif Rachmawadi <subosito@gmail.com>
|
||||||
|
Allan Guwatudde <guwats10@gmail.com>
|
||||||
Allan Simon <allan.simon@supinfo.com>
|
Allan Simon <allan.simon@supinfo.com>
|
||||||
Allen Li <ayatane@google.com>
|
Allen Li <ayatane@google.com>
|
||||||
Alok Menghrajani <alok.menghrajani@gmail.com>
|
Alok Menghrajani <alok.menghrajani@gmail.com>
|
||||||
@ -172,6 +180,7 @@ Alwin Doss <alwindoss84@gmail.com>
|
|||||||
Aman Gupta <aman@tmm1.net>
|
Aman Gupta <aman@tmm1.net>
|
||||||
Amarjeet Anand <amarjeetanandsingh@gmail.com>
|
Amarjeet Anand <amarjeetanandsingh@gmail.com>
|
||||||
Amir Mohammad Saied <amir@gluegadget.com>
|
Amir Mohammad Saied <amir@gluegadget.com>
|
||||||
|
Amit Kumar <mittalmailbox@gmail.com>
|
||||||
Amr Mohammed <merodiro@gmail.com>
|
Amr Mohammed <merodiro@gmail.com>
|
||||||
Amrut Joshi <amrut.joshi@gmail.com>
|
Amrut Joshi <amrut.joshi@gmail.com>
|
||||||
An Long <aisk1988@gmail.com>
|
An Long <aisk1988@gmail.com>
|
||||||
@ -185,6 +194,7 @@ André Carvalho <asantostc@gmail.com>
|
|||||||
André Martins <aanm90@gmail.com>
|
André Martins <aanm90@gmail.com>
|
||||||
Andre Nathan <andrenth@gmail.com>
|
Andre Nathan <andrenth@gmail.com>
|
||||||
Andrea Nodari <andrea.nodari91@gmail.com>
|
Andrea Nodari <andrea.nodari91@gmail.com>
|
||||||
|
Andrea Simonini <andrea.simonini@gmail.com>
|
||||||
Andrea Spadaccini <spadaccio@google.com>
|
Andrea Spadaccini <spadaccio@google.com>
|
||||||
Andreas Auernhammer <aead@mail.de>
|
Andreas Auernhammer <aead@mail.de>
|
||||||
Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
|
Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
|
||||||
@ -244,6 +254,7 @@ Andy Pan <panjf2000@gmail.com> <panjf2000@golangcn.org> <i@andypan.me>
|
|||||||
Andy Walker <walkeraj@gmail.com>
|
Andy Walker <walkeraj@gmail.com>
|
||||||
Andy Wang <cbeuw.andy@gmail.com>
|
Andy Wang <cbeuw.andy@gmail.com>
|
||||||
Andy Williams <andy@andy.xyz>
|
Andy Williams <andy@andy.xyz>
|
||||||
|
Andy Zhao <andyzhao@google.com>
|
||||||
Andzej Maciusovic <andzej.maciusovic@gmail.com>
|
Andzej Maciusovic <andzej.maciusovic@gmail.com>
|
||||||
Anfernee Yongkun Gui <anfernee.gui@gmail.com>
|
Anfernee Yongkun Gui <anfernee.gui@gmail.com>
|
||||||
Angelo Bulfone <mbulfone@gmail.com>
|
Angelo Bulfone <mbulfone@gmail.com>
|
||||||
@ -269,6 +280,7 @@ Anton Kuklin <anton.a.kuklin@gmail.com>
|
|||||||
Antonin Amand <antonin.amand@gmail.com>
|
Antonin Amand <antonin.amand@gmail.com>
|
||||||
Antonio Antelo <aantelov87@gmail.com>
|
Antonio Antelo <aantelov87@gmail.com>
|
||||||
Antonio Bibiano <antbbn@gmail.com>
|
Antonio Bibiano <antbbn@gmail.com>
|
||||||
|
Antonio Garcia <garcia.olais@gmail.com>
|
||||||
Antonio Huete Jimenez <tuxillo@quantumachine.net>
|
Antonio Huete Jimenez <tuxillo@quantumachine.net>
|
||||||
Antonio Murdaca <runcom@redhat.com>
|
Antonio Murdaca <runcom@redhat.com>
|
||||||
Antonio Troina <thoeni@gmail.com>
|
Antonio Troina <thoeni@gmail.com>
|
||||||
@ -292,8 +304,10 @@ Artem Khvastunov <artem.khvastunov@jetbrains.com>
|
|||||||
Artem Kolin <artemkaxboy@gmail.com>
|
Artem Kolin <artemkaxboy@gmail.com>
|
||||||
Arthur Fabre <arthur@arthurfabre.com>
|
Arthur Fabre <arthur@arthurfabre.com>
|
||||||
Arthur Khashaev <arthur@khashaev.ru>
|
Arthur Khashaev <arthur@khashaev.ru>
|
||||||
|
Artur M. Wolff <artur.m.wolff@gmail.com>
|
||||||
Artyom Pervukhin <artyom.pervukhin@gmail.com>
|
Artyom Pervukhin <artyom.pervukhin@gmail.com>
|
||||||
Arvindh Rajesh Tamilmani <art@a-30.net>
|
Arvindh Rajesh Tamilmani <art@a-30.net>
|
||||||
|
Ashish Bhate <ab.listsubs@gmail.com>
|
||||||
Ashish Gandhi <ag@ashishgandhi.org>
|
Ashish Gandhi <ag@ashishgandhi.org>
|
||||||
Asim Shankar <asimshankar@gmail.com>
|
Asim Shankar <asimshankar@gmail.com>
|
||||||
Assel Meher <asselmeher@gmail.com>
|
Assel Meher <asselmeher@gmail.com>
|
||||||
@ -325,6 +339,7 @@ Baokun Lee <nototon@gmail.com> <bk@golangcn.org>
|
|||||||
Barnaby Keene <accounts@southcla.ws>
|
Barnaby Keene <accounts@southcla.ws>
|
||||||
Bartosz Grzybowski <melkorm@gmail.com>
|
Bartosz Grzybowski <melkorm@gmail.com>
|
||||||
Bartosz Oler <brtsz@google.com>
|
Bartosz Oler <brtsz@google.com>
|
||||||
|
Bassam Ojeil <bojeil@google.com>
|
||||||
Bastian Ike <bastian.ike@gmail.com>
|
Bastian Ike <bastian.ike@gmail.com>
|
||||||
Ben Burkert <ben@benburkert.com>
|
Ben Burkert <ben@benburkert.com>
|
||||||
Ben Cartwright-Cox <Ben@Benjojo.co.uk>
|
Ben Cartwright-Cox <Ben@Benjojo.co.uk>
|
||||||
@ -332,6 +347,7 @@ Ben Eitzen <eitzenb@golang.org>
|
|||||||
Ben Fried <ben.fried@gmail.com>
|
Ben Fried <ben.fried@gmail.com>
|
||||||
Ben Haines <bhainesva@gmail.com>
|
Ben Haines <bhainesva@gmail.com>
|
||||||
Ben Hoyt <benhoyt@gmail.com>
|
Ben Hoyt <benhoyt@gmail.com>
|
||||||
|
Ben Hutchings <ben.hutchings@essensium.com>
|
||||||
Ben Kraft <benkraft@khanacademy.org>
|
Ben Kraft <benkraft@khanacademy.org>
|
||||||
Ben Laurie <ben@links.org> <benl@google.com>
|
Ben Laurie <ben@links.org> <benl@google.com>
|
||||||
Ben Lubar <ben.lubar@gmail.com>
|
Ben Lubar <ben.lubar@gmail.com>
|
||||||
@ -430,6 +446,7 @@ Carl Henrik Lunde <chlunde@ifi.uio.no>
|
|||||||
Carl Jackson <carl@stripe.com>
|
Carl Jackson <carl@stripe.com>
|
||||||
Carl Johnson <me@carlmjohnson.net>
|
Carl Johnson <me@carlmjohnson.net>
|
||||||
Carl Mastrangelo <notcarl@google.com>
|
Carl Mastrangelo <notcarl@google.com>
|
||||||
|
Carl Menezes <carleeto@gmail.com>
|
||||||
Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
|
Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
|
||||||
Carlisia Campos <carlisia@grokkingtech.io>
|
Carlisia Campos <carlisia@grokkingtech.io>
|
||||||
Carlo Alberto Ferraris <cafxx@strayorange.com>
|
Carlo Alberto Ferraris <cafxx@strayorange.com>
|
||||||
@ -443,6 +460,7 @@ Carlos Iriarte <ciriarte@gmail.com>
|
|||||||
Carlos Souza <carloshrsouza@gmail.com>
|
Carlos Souza <carloshrsouza@gmail.com>
|
||||||
Carolyn Van Slyck <me@carolynvanslyck.com>
|
Carolyn Van Slyck <me@carolynvanslyck.com>
|
||||||
Carrie Bynon <cbynon@gmail.com>
|
Carrie Bynon <cbynon@gmail.com>
|
||||||
|
Carson Hoffman <c@rsonhoffman.com>
|
||||||
Cary Hull <chull@google.com>
|
Cary Hull <chull@google.com>
|
||||||
Case Nelson <case.nelson@gmail.com>
|
Case Nelson <case.nelson@gmail.com>
|
||||||
Casey Callendrello <squeed@gmail.com>
|
Casey Callendrello <squeed@gmail.com>
|
||||||
@ -462,6 +480,7 @@ Charles Kenney <charlesc.kenney@gmail.com>
|
|||||||
Charles L. Dorian <cldorian@gmail.com>
|
Charles L. Dorian <cldorian@gmail.com>
|
||||||
Charles Lee <zombie.fml@gmail.com>
|
Charles Lee <zombie.fml@gmail.com>
|
||||||
Charles Weill <weill@google.com>
|
Charles Weill <weill@google.com>
|
||||||
|
Charlie Moog <moogcharlie@gmail.com>
|
||||||
Charlotte Brandhorst-Satzkorn <catzkorn@gmail.com>
|
Charlotte Brandhorst-Satzkorn <catzkorn@gmail.com>
|
||||||
Chauncy Cullitan <chauncyc@google.com>
|
Chauncy Cullitan <chauncyc@google.com>
|
||||||
Chen Zhidong <njutczd@gmail.com>
|
Chen Zhidong <njutczd@gmail.com>
|
||||||
@ -516,6 +535,7 @@ Christopher Nelson <nadiasvertex@gmail.com>
|
|||||||
Christopher Nielsen <m4dh4tt3r@gmail.com>
|
Christopher Nielsen <m4dh4tt3r@gmail.com>
|
||||||
Christopher Redden <christopher.redden@gmail.com>
|
Christopher Redden <christopher.redden@gmail.com>
|
||||||
Christopher Swenson <cswenson@google.com>
|
Christopher Swenson <cswenson@google.com>
|
||||||
|
Christopher Thomas <53317512+chrisssthomas@users.noreply.github.com>
|
||||||
Christopher Wedgwood <cw@f00f.org>
|
Christopher Wedgwood <cw@f00f.org>
|
||||||
Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
|
Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
|
||||||
Christy Perez <christy@linux.vnet.ibm.com>
|
Christy Perez <christy@linux.vnet.ibm.com>
|
||||||
@ -541,6 +561,8 @@ Cosmos Nicolaou <cnicolaou@google.com>
|
|||||||
Costin Chirvasuta <ctin@google.com>
|
Costin Chirvasuta <ctin@google.com>
|
||||||
Craig Citro <craigcitro@google.com>
|
Craig Citro <craigcitro@google.com>
|
||||||
Cristian Staretu <unclejacksons@gmail.com>
|
Cristian Staretu <unclejacksons@gmail.com>
|
||||||
|
Cristo García <cgg.code@gmail.com>
|
||||||
|
cui fliter <imcusg@gmail.com>
|
||||||
Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
|
Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
|
||||||
Cuong Manh Le <cuong@orijtech.com>
|
Cuong Manh Le <cuong@orijtech.com>
|
||||||
Curtis La Graff <curtis@lagraff.me>
|
Curtis La Graff <curtis@lagraff.me>
|
||||||
@ -560,6 +582,7 @@ Dan Callahan <dan.callahan@gmail.com>
|
|||||||
Dan Harrington <harringtond@google.com>
|
Dan Harrington <harringtond@google.com>
|
||||||
Dan Jacques <dnj@google.com>
|
Dan Jacques <dnj@google.com>
|
||||||
Dan Johnson <computerdruid@google.com>
|
Dan Johnson <computerdruid@google.com>
|
||||||
|
Dan McArdle <dmcardle@google.com>
|
||||||
Dan Peterson <dpiddy@gmail.com>
|
Dan Peterson <dpiddy@gmail.com>
|
||||||
Dan Pupius <dan@medium.com>
|
Dan Pupius <dan@medium.com>
|
||||||
Dan Scales <danscales@google.com>
|
Dan Scales <danscales@google.com>
|
||||||
@ -611,6 +634,7 @@ Dave Russell <forfuncsake@gmail.com>
|
|||||||
David Anderson <danderson@google.com>
|
David Anderson <danderson@google.com>
|
||||||
David Barnett <dbarnett@google.com>
|
David Barnett <dbarnett@google.com>
|
||||||
David Benjamin <davidben@google.com>
|
David Benjamin <davidben@google.com>
|
||||||
|
David Black <dblack@atlassian.com>
|
||||||
David Bond <davidsbond93@gmail.com>
|
David Bond <davidsbond93@gmail.com>
|
||||||
David Brophy <dave@brophy.uk>
|
David Brophy <dave@brophy.uk>
|
||||||
David Bürgin <676c7473@gmail.com>
|
David Bürgin <676c7473@gmail.com>
|
||||||
@ -654,6 +678,7 @@ Davor Kapsa <davor.kapsa@gmail.com>
|
|||||||
Dean Eigenmann <7621705+decanus@users.noreply.github.com>
|
Dean Eigenmann <7621705+decanus@users.noreply.github.com>
|
||||||
Dean Prichard <dean.prichard@gmail.com>
|
Dean Prichard <dean.prichard@gmail.com>
|
||||||
Deepak Jois <deepak.jois@gmail.com>
|
Deepak Jois <deepak.jois@gmail.com>
|
||||||
|
Deepak S <deepakspavoodath@gmail.com>
|
||||||
Denis Bernard <db047h@gmail.com>
|
Denis Bernard <db047h@gmail.com>
|
||||||
Denis Brandolini <denis.brandolini@gmail.com>
|
Denis Brandolini <denis.brandolini@gmail.com>
|
||||||
Denis Isaev <idenx@yandex.com>
|
Denis Isaev <idenx@yandex.com>
|
||||||
@ -676,8 +701,10 @@ Dhiru Kholia <dhiru.kholia@gmail.com>
|
|||||||
Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
|
Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
|
||||||
Di Xiao <dixiao@google.com>
|
Di Xiao <dixiao@google.com>
|
||||||
Didier Spezia <didier.06@gmail.com>
|
Didier Spezia <didier.06@gmail.com>
|
||||||
|
Diego Medina <fmpwizard@gmail.com>
|
||||||
Diego Siqueira <diego9889@gmail.com>
|
Diego Siqueira <diego9889@gmail.com>
|
||||||
Dieter Plaetinck <dieter@raintank.io>
|
Dieter Plaetinck <dieter@raintank.io>
|
||||||
|
Dilyn Corner <dilyn.corner@gmail.com>
|
||||||
Dimitri Sokolyuk <sokolyuk@gmail.com>
|
Dimitri Sokolyuk <sokolyuk@gmail.com>
|
||||||
Dimitri Tcaciuc <dtcaciuc@gmail.com>
|
Dimitri Tcaciuc <dtcaciuc@gmail.com>
|
||||||
Dina Garmash <dgrmsh@gmail.com>
|
Dina Garmash <dgrmsh@gmail.com>
|
||||||
@ -714,6 +741,7 @@ Doug Fawley <dfawley@google.com>
|
|||||||
Douglas Danger Manley <doug.manley@gmail.com>
|
Douglas Danger Manley <doug.manley@gmail.com>
|
||||||
Drew Flower <drewvanstone@gmail.com>
|
Drew Flower <drewvanstone@gmail.com>
|
||||||
Drew Hintz <adhintz@google.com>
|
Drew Hintz <adhintz@google.com>
|
||||||
|
Drew Richardson <drewrichardson@gmail.com>
|
||||||
Duco van Amstel <duco.vanamstel@gmail.com>
|
Duco van Amstel <duco.vanamstel@gmail.com>
|
||||||
Duncan Holm <mail@frou.org>
|
Duncan Holm <mail@frou.org>
|
||||||
Dustin Carlino <dcarlino@google.com>
|
Dustin Carlino <dcarlino@google.com>
|
||||||
@ -735,6 +763,7 @@ Egon Elbre <egonelbre@gmail.com>
|
|||||||
Ehren Kret <ehren.kret@gmail.com>
|
Ehren Kret <ehren.kret@gmail.com>
|
||||||
Eitan Adler <lists@eitanadler.com>
|
Eitan Adler <lists@eitanadler.com>
|
||||||
Eivind Uggedal <eivind@uggedal.com>
|
Eivind Uggedal <eivind@uggedal.com>
|
||||||
|
El Mostafa Idrassi <el.mostafa.idrassi@gmail.com>
|
||||||
Elbert Fliek <efliek@gmail.com>
|
Elbert Fliek <efliek@gmail.com>
|
||||||
Eldar Rakhimberdin <ibeono@gmail.com>
|
Eldar Rakhimberdin <ibeono@gmail.com>
|
||||||
Elena Grahovac <elena@grahovac.me>
|
Elena Grahovac <elena@grahovac.me>
|
||||||
@ -742,6 +771,7 @@ Eli Bendersky <eliben@google.com>
|
|||||||
Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
|
Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
|
||||||
Elliot Morrison-Reed <elliotmr@gmail.com>
|
Elliot Morrison-Reed <elliotmr@gmail.com>
|
||||||
Ellison Leão <ellisonleao@gmail.com>
|
Ellison Leão <ellisonleao@gmail.com>
|
||||||
|
Elvina Yakubova <elvinayakubova@gmail.com>
|
||||||
Emerson Lin <linyintor@gmail.com>
|
Emerson Lin <linyintor@gmail.com>
|
||||||
Emil Bektimirov <lefelys@gmail.com>
|
Emil Bektimirov <lefelys@gmail.com>
|
||||||
Emil Hessman <emil@hessman.se>
|
Emil Hessman <emil@hessman.se>
|
||||||
@ -767,6 +797,7 @@ Eric Rescorla <ekr@rtfm.com>
|
|||||||
Eric Roshan-Eisner <eric.d.eisner@gmail.com>
|
Eric Roshan-Eisner <eric.d.eisner@gmail.com>
|
||||||
Eric Rutherford <erutherford@gmail.com>
|
Eric Rutherford <erutherford@gmail.com>
|
||||||
Eric Rykwalder <e.rykwalder@gmail.com>
|
Eric Rykwalder <e.rykwalder@gmail.com>
|
||||||
|
Eric Wang <wangchaogo1990@gmail.com>
|
||||||
Erick Tryzelaar <etryzelaar@google.com>
|
Erick Tryzelaar <etryzelaar@google.com>
|
||||||
Erik Aigner <aigner.erik@gmail.com>
|
Erik Aigner <aigner.erik@gmail.com>
|
||||||
Erik Dubbelboer <erik@dubbelboer.com>
|
Erik Dubbelboer <erik@dubbelboer.com>
|
||||||
@ -778,6 +809,7 @@ Ernest Chiang <ernest_chiang@htc.com>
|
|||||||
Erwin Oegema <blablaechthema@hotmail.com>
|
Erwin Oegema <blablaechthema@hotmail.com>
|
||||||
Esko Luontola <esko.luontola@gmail.com>
|
Esko Luontola <esko.luontola@gmail.com>
|
||||||
Ethan Burns <eaburns@google.com>
|
Ethan Burns <eaburns@google.com>
|
||||||
|
Ethan Hur <ethan0311@gmail.com>
|
||||||
Ethan Miller <eamiller@us.ibm.com>
|
Ethan Miller <eamiller@us.ibm.com>
|
||||||
Euan Kemp <euank@euank.com>
|
Euan Kemp <euank@euank.com>
|
||||||
Eugene Formanenko <mo4islona@gmail.com>
|
Eugene Formanenko <mo4islona@gmail.com>
|
||||||
@ -818,6 +850,7 @@ Felix Cornelius <9767036+fcornelius@users.noreply.github.com>
|
|||||||
Felix Geisendörfer <haimuiba@gmail.com>
|
Felix Geisendörfer <haimuiba@gmail.com>
|
||||||
Felix Kollmann <fk@konsorten.de>
|
Felix Kollmann <fk@konsorten.de>
|
||||||
Ferenc Szabo <frncmx@gmail.com>
|
Ferenc Szabo <frncmx@gmail.com>
|
||||||
|
Fernandez Ludovic <lfernandez.dev@gmail.com>
|
||||||
Filip Gruszczyński <gruszczy@gmail.com>
|
Filip Gruszczyński <gruszczy@gmail.com>
|
||||||
Filip Haglund <drathier@users.noreply.github.com>
|
Filip Haglund <drathier@users.noreply.github.com>
|
||||||
Filip Stanis <fstanis@google.com>
|
Filip Stanis <fstanis@google.com>
|
||||||
@ -858,6 +891,7 @@ Gabriel Nelle <tehsphinx@web.de>
|
|||||||
Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
|
Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
|
||||||
Gabriel Rosenhouse <rosenhouse@gmail.com>
|
Gabriel Rosenhouse <rosenhouse@gmail.com>
|
||||||
Gabriel Russell <gabriel.russell@gmail.com>
|
Gabriel Russell <gabriel.russell@gmail.com>
|
||||||
|
Gabriel Vasile <gabriel.vasile0793@gmail.com>
|
||||||
Gareth Paul Jones <gpj@foursquare.com>
|
Gareth Paul Jones <gpj@foursquare.com>
|
||||||
Garret Kelly <gdk@google.com>
|
Garret Kelly <gdk@google.com>
|
||||||
Garrick Evans <garrick@google.com>
|
Garrick Evans <garrick@google.com>
|
||||||
@ -891,6 +925,8 @@ Gianguido Sora` <g.sora4@gmail.com>
|
|||||||
Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
|
Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
|
||||||
Giles Lean <giles.lean@pobox.com>
|
Giles Lean <giles.lean@pobox.com>
|
||||||
Giovanni Bajo <rasky@develer.com>
|
Giovanni Bajo <rasky@develer.com>
|
||||||
|
GitHub User @180909 (70465953) <734461790@qq.com>
|
||||||
|
GitHub User @6543 (24977596) <6543@obermui.de>
|
||||||
GitHub User @aca (50316549) <acadx0@gmail.com>
|
GitHub User @aca (50316549) <acadx0@gmail.com>
|
||||||
GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
|
GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
|
||||||
GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
|
GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
|
||||||
@ -904,10 +940,12 @@ GitHub User @bontequero (2674999) <bontequero@gmail.com>
|
|||||||
GitHub User @cch123 (384546) <buaa.cch@gmail.com>
|
GitHub User @cch123 (384546) <buaa.cch@gmail.com>
|
||||||
GitHub User @chainhelen (7046329) <chainhelen@gmail.com>
|
GitHub User @chainhelen (7046329) <chainhelen@gmail.com>
|
||||||
GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
|
GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
|
||||||
|
GitHub User @Cluas (10056928) <Cluas@live.cn>
|
||||||
GitHub User @cncal (23520240) <flycalvin@qq.com>
|
GitHub User @cncal (23520240) <flycalvin@qq.com>
|
||||||
GitHub User @DQNEO (188741) <dqneoo@gmail.com>
|
GitHub User @DQNEO (188741) <dqneoo@gmail.com>
|
||||||
GitHub User @Dreamacro (8615343) <chuainian@gmail.com>
|
GitHub User @Dreamacro (8615343) <chuainian@gmail.com>
|
||||||
GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
|
GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
|
||||||
|
GitHub User @EndlessCheng (7086966) <loli.con@qq.com>
|
||||||
GitHub User @erifan (31343225) <eric.fang@arm.com>
|
GitHub User @erifan (31343225) <eric.fang@arm.com>
|
||||||
GitHub User @esell (9735165) <eujon.sellers@gmail.com>
|
GitHub User @esell (9735165) <eujon.sellers@gmail.com>
|
||||||
GitHub User @fatedier (7346661) <fatedier@gmail.com>
|
GitHub User @fatedier (7346661) <fatedier@gmail.com>
|
||||||
@ -916,12 +954,15 @@ GitHub User @geedchin (11672310) <geedchin@gmail.com>
|
|||||||
GitHub User @GrigoriyMikhalkin (3637857) <grigoriymikhalkin@gmail.com>
|
GitHub User @GrigoriyMikhalkin (3637857) <grigoriymikhalkin@gmail.com>
|
||||||
GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
|
GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
|
||||||
GitHub User @hitzhangjie (3725760) <hit.zhangjie@gmail.com>
|
GitHub User @hitzhangjie (3725760) <hit.zhangjie@gmail.com>
|
||||||
|
GitHub User @hqpko (13887251) <whaibin01@hotmail.com>
|
||||||
GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
|
GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
|
||||||
GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
|
GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
|
||||||
GitHub User @jopbrown (6345470) <msshane2008@gmail.com>
|
GitHub User @jopbrown (6345470) <msshane2008@gmail.com>
|
||||||
GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
|
GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
|
||||||
GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
|
GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
|
||||||
|
GitHub User @komisan19 (18901496) <komiyama6219@gmail.com>
|
||||||
GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
|
GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
|
||||||
|
GitHub User @lhl2617 (33488131) <l.h.lee2617@gmail.com>
|
||||||
GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
|
GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
|
||||||
GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
|
GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
|
||||||
GitHub User @ly303550688 (11519839) <yang.liu636@gmail.com>
|
GitHub User @ly303550688 (11519839) <yang.liu636@gmail.com>
|
||||||
@ -936,10 +977,14 @@ GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
|
|||||||
GitHub User @pityonline (438222) <pityonline@gmail.com>
|
GitHub User @pityonline (438222) <pityonline@gmail.com>
|
||||||
GitHub User @po3rin (29445112) <abctail30@gmail.com>
|
GitHub User @po3rin (29445112) <abctail30@gmail.com>
|
||||||
GitHub User @pokutuna (57545) <popopopopokutuna@gmail.com>
|
GitHub User @pokutuna (57545) <popopopopokutuna@gmail.com>
|
||||||
|
GitHub User @povsister (11040951) <pov@mahou-shoujo.moe>
|
||||||
GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
|
GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
|
||||||
|
GitHub User @qcrao (7698088) <qcrao91@gmail.com>
|
||||||
GitHub User @ramenjuniti (32011829) <ramenjuniti@gmail.com>
|
GitHub User @ramenjuniti (32011829) <ramenjuniti@gmail.com>
|
||||||
GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
|
GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
|
||||||
|
GitHub User @SataQiu (9354727) <shidaqiu2018@gmail.com>
|
||||||
GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
|
GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
|
||||||
|
GitHub User @sivchari (55221074) <shibuuuu5@gmail.com>
|
||||||
GitHub User @skanehira (7888591) <sho19921005@gmail.com>
|
GitHub User @skanehira (7888591) <sho19921005@gmail.com>
|
||||||
GitHub User @soolaugust (10558124) <soolaugust@gmail.com>
|
GitHub User @soolaugust (10558124) <soolaugust@gmail.com>
|
||||||
GitHub User @surechen (7249331) <surechen17@gmail.com>
|
GitHub User @surechen (7249331) <surechen17@gmail.com>
|
||||||
@ -947,9 +992,12 @@ GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
|
|||||||
GitHub User @tell-k (26263) <ffk2005@gmail.com>
|
GitHub User @tell-k (26263) <ffk2005@gmail.com>
|
||||||
GitHub User @tennashi (10219626) <tennashio@gmail.com>
|
GitHub User @tennashi (10219626) <tennashio@gmail.com>
|
||||||
GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
|
GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
|
||||||
|
GitHub User @uji (49834542) <ujiprog@gmail.com>
|
||||||
|
GitHub User @unbyte (5772358) <i@shangyes.net>
|
||||||
GitHub User @uropek (39370426) <uropek@gmail.com>
|
GitHub User @uropek (39370426) <uropek@gmail.com>
|
||||||
GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
|
GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
|
||||||
GitHub User @witchard (4994659) <witchard@hotmail.co.uk>
|
GitHub User @witchard (4994659) <witchard@hotmail.co.uk>
|
||||||
|
GitHub User @wolf1996 (5901874) <ksgiv37@gmail.com>
|
||||||
GitHub User @yah01 (12216890) <kagaminehuan@gmail.com>
|
GitHub User @yah01 (12216890) <kagaminehuan@gmail.com>
|
||||||
GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
|
GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
|
||||||
GitHub User @zikaeroh (48577114) <zikaeroh@gmail.com>
|
GitHub User @zikaeroh (48577114) <zikaeroh@gmail.com>
|
||||||
@ -962,6 +1010,7 @@ Glenn Brown <glennb@google.com>
|
|||||||
Glenn Lewis <gmlewis@google.com>
|
Glenn Lewis <gmlewis@google.com>
|
||||||
Gordon Klaus <gordon.klaus@gmail.com>
|
Gordon Klaus <gordon.klaus@gmail.com>
|
||||||
Gordon Tyler <gordon@doxxx.net>
|
Gordon Tyler <gordon@doxxx.net>
|
||||||
|
Grace Han <hgrace503@gmail.com>
|
||||||
Graham King <graham4king@gmail.com>
|
Graham King <graham4king@gmail.com>
|
||||||
Graham Miller <graham.miller@gmail.com>
|
Graham Miller <graham.miller@gmail.com>
|
||||||
Grant Griffiths <ggp493@gmail.com>
|
Grant Griffiths <ggp493@gmail.com>
|
||||||
@ -977,10 +1026,12 @@ Guilherme Caruso <gui.martinscaruso@gmail.com>
|
|||||||
Guilherme Garnier <guilherme.garnier@gmail.com>
|
Guilherme Garnier <guilherme.garnier@gmail.com>
|
||||||
Guilherme Goncalves <guilhermeaugustosg@gmail.com>
|
Guilherme Goncalves <guilhermeaugustosg@gmail.com>
|
||||||
Guilherme Rezende <guilhermebr@gmail.com>
|
Guilherme Rezende <guilhermebr@gmail.com>
|
||||||
|
Guilherme Souza <32180229+gqgs@users.noreply.github.com>
|
||||||
Guillaume J. Charmes <guillaume@charmes.net>
|
Guillaume J. Charmes <guillaume@charmes.net>
|
||||||
Guillaume Sottas <guillaumesottas@gmail.com>
|
Guillaume Sottas <guillaumesottas@gmail.com>
|
||||||
Günther Noack <gnoack@google.com>
|
Günther Noack <gnoack@google.com>
|
||||||
Guobiao Mei <meiguobiao@gmail.com>
|
Guobiao Mei <meiguobiao@gmail.com>
|
||||||
|
Guodong Li <guodongli@google.com>
|
||||||
Guoliang Wang <iamwgliang@gmail.com>
|
Guoliang Wang <iamwgliang@gmail.com>
|
||||||
Gustav Paul <gustav.paul@gmail.com>
|
Gustav Paul <gustav.paul@gmail.com>
|
||||||
Gustav Westling <gustav@westling.xyz>
|
Gustav Westling <gustav@westling.xyz>
|
||||||
@ -995,6 +1046,7 @@ HAMANO Tsukasa <hamano@osstech.co.jp>
|
|||||||
Han-Wen Nienhuys <hanwen@google.com>
|
Han-Wen Nienhuys <hanwen@google.com>
|
||||||
Hang Qian <hangqian90@gmail.com>
|
Hang Qian <hangqian90@gmail.com>
|
||||||
Hanjun Kim <hallazzang@gmail.com>
|
Hanjun Kim <hallazzang@gmail.com>
|
||||||
|
Hanlin He <hanling.he@gmail.com>
|
||||||
Hanlin Shi <shihanlin9@gmail.com>
|
Hanlin Shi <shihanlin9@gmail.com>
|
||||||
Haoran Luo <haoran.luo@chaitin.com>
|
Haoran Luo <haoran.luo@chaitin.com>
|
||||||
Haosdent Huang <haosdent@gmail.com>
|
Haosdent Huang <haosdent@gmail.com>
|
||||||
@ -1026,18 +1078,19 @@ Herbie Ong <herbie@google.com>
|
|||||||
Heschi Kreinick <heschi@google.com>
|
Heschi Kreinick <heschi@google.com>
|
||||||
Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
|
Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
|
||||||
Hilko Bengen <bengen@hilluzination.de>
|
Hilko Bengen <bengen@hilluzination.de>
|
||||||
|
Himanshu Kishna Srivastava <28himanshu@gmail.com>
|
||||||
Hiroaki Nakamura <hnakamur@gmail.com>
|
Hiroaki Nakamura <hnakamur@gmail.com>
|
||||||
Hiromichi Ema <ema.hiro@gmail.com>
|
Hiromichi Ema <ema.hiro@gmail.com>
|
||||||
Hironao OTSUBO <motemen@gmail.com>
|
Hironao OTSUBO <motemen@gmail.com>
|
||||||
Hiroshi Ioka <hirochachacha@gmail.com>
|
Hiroshi Ioka <hirochachacha@gmail.com>
|
||||||
Hitoshi Mitake <mitake.hitoshi@gmail.com>
|
Hitoshi Mitake <mitake.hitoshi@gmail.com>
|
||||||
Holden Huang <ttyh061@gmail.com>
|
Holden Huang <ttyh061@gmail.com>
|
||||||
Songlin Jiang <hollowman@hollowman.ml>
|
|
||||||
Hong Ruiqi <hongruiqi@gmail.com>
|
Hong Ruiqi <hongruiqi@gmail.com>
|
||||||
Hongfei Tan <feilengcui008@gmail.com>
|
Hongfei Tan <feilengcui008@gmail.com>
|
||||||
Horacio Duran <horacio.duran@gmail.com>
|
Horacio Duran <horacio.duran@gmail.com>
|
||||||
Horst Rutter <hhrutter@gmail.com>
|
Horst Rutter <hhrutter@gmail.com>
|
||||||
Hossein Sheikh Attar <hattar@google.com>
|
Hossein Sheikh Attar <hattar@google.com>
|
||||||
|
Hossein Zolfi <hossein.zolfi@gmail.com>
|
||||||
Howard Zhang <howard.zhang@arm.com>
|
Howard Zhang <howard.zhang@arm.com>
|
||||||
Hsin Tsao <tsao@google.com>
|
Hsin Tsao <tsao@google.com>
|
||||||
Hsin-Ho Yeh <yhh92u@gmail.com>
|
Hsin-Ho Yeh <yhh92u@gmail.com>
|
||||||
@ -1054,11 +1107,14 @@ Ian Haken <ihaken@netflix.com>
|
|||||||
Ian Kent <iankent85@gmail.com>
|
Ian Kent <iankent85@gmail.com>
|
||||||
Ian Lance Taylor <iant@golang.org>
|
Ian Lance Taylor <iant@golang.org>
|
||||||
Ian Leue <ian@appboy.com>
|
Ian Leue <ian@appboy.com>
|
||||||
|
Ian Mckay <iann0036@gmail.com>
|
||||||
Ian Tay <iantay@google.com>
|
Ian Tay <iantay@google.com>
|
||||||
|
Ian Woolf <btw515wolf2@gmail.com>
|
||||||
Ian Zapolsky <ianzapolsky@gmail.com>
|
Ian Zapolsky <ianzapolsky@gmail.com>
|
||||||
Ibrahim AshShohail <ibra.sho@gmail.com>
|
Ibrahim AshShohail <ibra.sho@gmail.com>
|
||||||
Icarus Sparry <golang@icarus.freeuk.com>
|
Icarus Sparry <golang@icarus.freeuk.com>
|
||||||
Iccha Sethi <icchasethi@gmail.com>
|
Iccha Sethi <icchasethi@gmail.com>
|
||||||
|
Ichinose Shogo <shogo82148@gmail.com>
|
||||||
Idora Shinatose <idora.shinatose@gmail.com>
|
Idora Shinatose <idora.shinatose@gmail.com>
|
||||||
Ignacio Hagopian <jsign.uy@gmail.com>
|
Ignacio Hagopian <jsign.uy@gmail.com>
|
||||||
Igor Bernstein <igorbernstein@google.com>
|
Igor Bernstein <igorbernstein@google.com>
|
||||||
@ -1068,6 +1124,7 @@ Igor Vashyst <ivashyst@gmail.com>
|
|||||||
Igor Zhilianin <igor.zhilianin@gmail.com>
|
Igor Zhilianin <igor.zhilianin@gmail.com>
|
||||||
Ikko Ashimine <eltociear@gmail.com>
|
Ikko Ashimine <eltociear@gmail.com>
|
||||||
Illya Yalovyy <yalovoy@gmail.com>
|
Illya Yalovyy <yalovoy@gmail.com>
|
||||||
|
Ilya Chukov <56119080+Elias506@users.noreply.github.com>
|
||||||
Ilya Sinelnikov <sidhmangh@gmail.com>
|
Ilya Sinelnikov <sidhmangh@gmail.com>
|
||||||
Ilya Tocar <ilya.tocar@intel.com>
|
Ilya Tocar <ilya.tocar@intel.com>
|
||||||
INADA Naoki <songofacandy@gmail.com>
|
INADA Naoki <songofacandy@gmail.com>
|
||||||
@ -1122,6 +1179,7 @@ James Cowgill <James.Cowgill@imgtec.com>
|
|||||||
James Craig Burley <james-github@burleyarch.com>
|
James Craig Burley <james-github@burleyarch.com>
|
||||||
James David Chalfant <james.chalfant@gmail.com>
|
James David Chalfant <james.chalfant@gmail.com>
|
||||||
James Eady <jmeady@google.com>
|
James Eady <jmeady@google.com>
|
||||||
|
James Fennell <jpfennell@google.com>
|
||||||
James Fysh <james.fysh@gmail.com>
|
James Fysh <james.fysh@gmail.com>
|
||||||
James Gray <james@james4k.com>
|
James Gray <james@james4k.com>
|
||||||
James Hartig <fastest963@gmail.com>
|
James Hartig <fastest963@gmail.com>
|
||||||
@ -1178,6 +1236,7 @@ Jason Wangsadinata <jwangsadinata@gmail.com>
|
|||||||
Javier Kohen <jkohen@google.com>
|
Javier Kohen <jkohen@google.com>
|
||||||
Javier Revillas <jrevillas@massivedynamic.io>
|
Javier Revillas <jrevillas@massivedynamic.io>
|
||||||
Javier Segura <javism@gmail.com>
|
Javier Segura <javism@gmail.com>
|
||||||
|
Jay Chen <chenjie@chenjie.info>
|
||||||
Jay Conrod <jayconrod@google.com>
|
Jay Conrod <jayconrod@google.com>
|
||||||
Jay Lee <BusyJayLee@gmail.com>
|
Jay Lee <BusyJayLee@gmail.com>
|
||||||
Jay Taylor <outtatime@gmail.com>
|
Jay Taylor <outtatime@gmail.com>
|
||||||
@ -1200,6 +1259,7 @@ Jeff Johnson <jrjohnson@google.com>
|
|||||||
Jeff R. Allen <jra@nella.org> <jeff.allen@gmail.com>
|
Jeff R. Allen <jra@nella.org> <jeff.allen@gmail.com>
|
||||||
Jeff Sickel <jas@corpus-callosum.com>
|
Jeff Sickel <jas@corpus-callosum.com>
|
||||||
Jeff Wendling <jeff@spacemonkey.com>
|
Jeff Wendling <jeff@spacemonkey.com>
|
||||||
|
Jeff Widman <jeff@jeffwidman.com>
|
||||||
Jeffrey H <jeffreyh192@gmail.com>
|
Jeffrey H <jeffreyh192@gmail.com>
|
||||||
Jelte Fennema <github-tech@jeltef.nl>
|
Jelte Fennema <github-tech@jeltef.nl>
|
||||||
Jens Frederich <jfrederich@gmail.com>
|
Jens Frederich <jfrederich@gmail.com>
|
||||||
@ -1210,6 +1270,7 @@ Jeremy Faller <jeremy@golang.org>
|
|||||||
Jeremy Jackins <jeremyjackins@gmail.com>
|
Jeremy Jackins <jeremyjackins@gmail.com>
|
||||||
Jeremy Jay <jeremy@pbnjay.com>
|
Jeremy Jay <jeremy@pbnjay.com>
|
||||||
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
||||||
|
Jero Bado <tokidokitalkyou@gmail.com>
|
||||||
Jeroen Bobbeldijk <jerbob92@gmail.com>
|
Jeroen Bobbeldijk <jerbob92@gmail.com>
|
||||||
Jeroen Simonetti <jeroen@simonetti.nl>
|
Jeroen Simonetti <jeroen@simonetti.nl>
|
||||||
Jérôme Doucet <jerdct@gmail.com>
|
Jérôme Doucet <jerdct@gmail.com>
|
||||||
@ -1251,6 +1312,8 @@ Joe Richey <joerichey@google.com>
|
|||||||
Joe Shaw <joe@joeshaw.org>
|
Joe Shaw <joe@joeshaw.org>
|
||||||
Joe Sylve <joe.sylve@gmail.com>
|
Joe Sylve <joe.sylve@gmail.com>
|
||||||
Joe Tsai <joetsai@digital-static.net>
|
Joe Tsai <joetsai@digital-static.net>
|
||||||
|
Joel Courtney <euphemize@gmail.com>
|
||||||
|
Joel Ferrier <joelferrier@google.com>
|
||||||
Joel Sing <joel@sing.id.au> <jsing@google.com>
|
Joel Sing <joel@sing.id.au> <jsing@google.com>
|
||||||
Joël Stemmer <jstemmer@google.com>
|
Joël Stemmer <jstemmer@google.com>
|
||||||
Joel Stemmer <stemmertech@gmail.com>
|
Joel Stemmer <stemmertech@gmail.com>
|
||||||
@ -1260,7 +1323,9 @@ Johan Euphrosine <proppy@google.com>
|
|||||||
Johan Jansson <johan.jansson@iki.fi>
|
Johan Jansson <johan.jansson@iki.fi>
|
||||||
Johan Knutzen <johan@senri.se>
|
Johan Knutzen <johan@senri.se>
|
||||||
Johan Sageryd <j@1616.se>
|
Johan Sageryd <j@1616.se>
|
||||||
|
Johannes Huning <johannes.huning@gmail.com>
|
||||||
John Asmuth <jasmuth@gmail.com>
|
John Asmuth <jasmuth@gmail.com>
|
||||||
|
John Bampton <jbampton@gmail.com>
|
||||||
John Beisley <huin@google.com>
|
John Beisley <huin@google.com>
|
||||||
John C Barstow <jbowtie@amathaine.com>
|
John C Barstow <jbowtie@amathaine.com>
|
||||||
John DeNero <denero@google.com>
|
John DeNero <denero@google.com>
|
||||||
@ -1269,6 +1334,7 @@ John Gibb <johngibb@gmail.com>
|
|||||||
John Gilik <john@jgilik.com>
|
John Gilik <john@jgilik.com>
|
||||||
John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
|
John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
|
||||||
John Howard Palevich <jack.palevich@gmail.com>
|
John Howard Palevich <jack.palevich@gmail.com>
|
||||||
|
John Jago <johnjago@protonmail.com>
|
||||||
John Jeffery <jjeffery@sp.com.au>
|
John Jeffery <jjeffery@sp.com.au>
|
||||||
John Jenkins <twodopeshaggy@gmail.com>
|
John Jenkins <twodopeshaggy@gmail.com>
|
||||||
John Leidegren <john.leidegren@gmail.com>
|
John Leidegren <john.leidegren@gmail.com>
|
||||||
@ -1320,6 +1386,7 @@ Josa Gesell <josa@gesell.me>
|
|||||||
Jose Luis Vázquez González <josvazg@gmail.com>
|
Jose Luis Vázquez González <josvazg@gmail.com>
|
||||||
Joseph Bonneau <jcb@google.com>
|
Joseph Bonneau <jcb@google.com>
|
||||||
Joseph Holsten <joseph@josephholsten.com>
|
Joseph Holsten <joseph@josephholsten.com>
|
||||||
|
Joseph Morag <sefim96@gmail.com>
|
||||||
Josh Baum <joshbaum@google.com>
|
Josh Baum <joshbaum@google.com>
|
||||||
Josh Bleecher Snyder <josharian@gmail.com>
|
Josh Bleecher Snyder <josharian@gmail.com>
|
||||||
Josh Chorlton <jchorlton@gmail.com>
|
Josh Chorlton <jchorlton@gmail.com>
|
||||||
@ -1327,12 +1394,14 @@ Josh Deprez <josh.deprez@gmail.com>
|
|||||||
Josh Goebel <dreamer3@gmail.com>
|
Josh Goebel <dreamer3@gmail.com>
|
||||||
Josh Hoak <jhoak@google.com>
|
Josh Hoak <jhoak@google.com>
|
||||||
Josh Holland <jrh@joshh.co.uk>
|
Josh Holland <jrh@joshh.co.uk>
|
||||||
|
Josh Rickmar <jrick@companyzero.com>
|
||||||
Josh Roppo <joshroppo@gmail.com>
|
Josh Roppo <joshroppo@gmail.com>
|
||||||
Josh Varga <josh.varga@gmail.com>
|
Josh Varga <josh.varga@gmail.com>
|
||||||
Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com>
|
Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com>
|
||||||
Joshua Boelter <joshua.boelter@intel.com>
|
Joshua Boelter <joshua.boelter@intel.com>
|
||||||
Joshua Chase <jcjoshuachase@gmail.com>
|
Joshua Chase <jcjoshuachase@gmail.com>
|
||||||
Joshua Crowgey <jcrowgey@uw.edu>
|
Joshua Crowgey <jcrowgey@uw.edu>
|
||||||
|
Joshua Harshman <joshgreyhat@gmail.com>
|
||||||
Joshua M. Clulow <josh.clulow@joyent.com>
|
Joshua M. Clulow <josh.clulow@joyent.com>
|
||||||
Joshua Rubin <joshua@rubixconsulting.com>
|
Joshua Rubin <joshua@rubixconsulting.com>
|
||||||
Josselin Costanzi <josselin@costanzi.fr>
|
Josselin Costanzi <josselin@costanzi.fr>
|
||||||
@ -1353,6 +1422,7 @@ Julie Qiu <julie@golang.org>
|
|||||||
Julien Kauffmann <julien.kauffmann@freelan.org>
|
Julien Kauffmann <julien.kauffmann@freelan.org>
|
||||||
Julien Salleyron <julien.salleyron@gmail.com>
|
Julien Salleyron <julien.salleyron@gmail.com>
|
||||||
Julien Schmidt <google@julienschmidt.com>
|
Julien Schmidt <google@julienschmidt.com>
|
||||||
|
Julien Tant <julien@craftyx.fr>
|
||||||
Julio Montes <julio.montes@intel.com>
|
Julio Montes <julio.montes@intel.com>
|
||||||
Jun Zhang <jim.zoumo@gmail.com>
|
Jun Zhang <jim.zoumo@gmail.com>
|
||||||
Junchen Li <junchen.li@arm.com>
|
Junchen Li <junchen.li@arm.com>
|
||||||
@ -1419,10 +1489,12 @@ Kenta Mori <zoncoen@gmail.com>
|
|||||||
Kerollos Magdy <kerolloz@yahoo.com>
|
Kerollos Magdy <kerolloz@yahoo.com>
|
||||||
Ketan Parmar <ketanbparmar@gmail.com>
|
Ketan Parmar <ketanbparmar@gmail.com>
|
||||||
Kevan Swanberg <kevswanberg@gmail.com>
|
Kevan Swanberg <kevswanberg@gmail.com>
|
||||||
|
Kevin Albertson <kevin.albertson@mongodb.com>
|
||||||
Kevin Ballard <kevin@sb.org>
|
Kevin Ballard <kevin@sb.org>
|
||||||
Kevin Burke <kev@inburke.com>
|
Kevin Burke <kev@inburke.com>
|
||||||
Kévin Dunglas <dunglas@gmail.com>
|
Kévin Dunglas <dunglas@gmail.com>
|
||||||
Kevin Gillette <extemporalgenome@gmail.com>
|
Kevin Gillette <extemporalgenome@gmail.com>
|
||||||
|
Kevin Herro <kevin109104@gmail.com>
|
||||||
Kevin Kirsche <kev.kirsche@gmail.com>
|
Kevin Kirsche <kev.kirsche@gmail.com>
|
||||||
Kevin Klues <klueska@gmail.com> <klueska@google.com>
|
Kevin Klues <klueska@gmail.com> <klueska@google.com>
|
||||||
Kevin Malachowski <chowski@google.com>
|
Kevin Malachowski <chowski@google.com>
|
||||||
@ -1457,6 +1529,7 @@ Koya IWAMURA <kiwamura0314@gmail.com>
|
|||||||
Kris Kwiatkowski <kris@cloudflare.com>
|
Kris Kwiatkowski <kris@cloudflare.com>
|
||||||
Kris Nova <kris@nivenly.com>
|
Kris Nova <kris@nivenly.com>
|
||||||
Kris Rousey <krousey@google.com>
|
Kris Rousey <krousey@google.com>
|
||||||
|
Krishna Birla <krishnabirla16@gmail.com>
|
||||||
Kristopher Watts <traetox@gmail.com>
|
Kristopher Watts <traetox@gmail.com>
|
||||||
Krzysztof Dąbrowski <krzysdabro@live.com>
|
Krzysztof Dąbrowski <krzysdabro@live.com>
|
||||||
Kshitij Saraogi <kshitijsaraogi@gmail.com>
|
Kshitij Saraogi <kshitijsaraogi@gmail.com>
|
||||||
@ -1480,6 +1553,7 @@ Lajos Papp <lalyos@yahoo.com>
|
|||||||
Lakshay Garg <lakshay.garg.1996@gmail.com>
|
Lakshay Garg <lakshay.garg.1996@gmail.com>
|
||||||
Lann Martin <lannm@google.com>
|
Lann Martin <lannm@google.com>
|
||||||
Lanre Adelowo <yo@lanre.wtf>
|
Lanre Adelowo <yo@lanre.wtf>
|
||||||
|
Lapo Luchini <lapo@lapo.it>
|
||||||
Larry Clapp <larry@theclapp.org>
|
Larry Clapp <larry@theclapp.org>
|
||||||
Larry Hosken <lahosken@golang.org>
|
Larry Hosken <lahosken@golang.org>
|
||||||
Lars Jeppesen <jeppesen.lars@gmail.com>
|
Lars Jeppesen <jeppesen.lars@gmail.com>
|
||||||
@ -1496,6 +1570,7 @@ Leigh McCulloch <leighmcc@gmail.com>
|
|||||||
Leo Antunes <leo@costela.net>
|
Leo Antunes <leo@costela.net>
|
||||||
Leo Rudberg <ljr@google.com>
|
Leo Rudberg <ljr@google.com>
|
||||||
Leon Klingele <git@leonklingele.de>
|
Leon Klingele <git@leonklingele.de>
|
||||||
|
Leonard Wang <wangdeyu0907@gmail.com>
|
||||||
Leonardo Comelli <leonardo.comelli@gmail.com>
|
Leonardo Comelli <leonardo.comelli@gmail.com>
|
||||||
Leonel Quinteros <leonel.quinteros@gmail.com>
|
Leonel Quinteros <leonel.quinteros@gmail.com>
|
||||||
Lev Shamardin <shamardin@gmail.com>
|
Lev Shamardin <shamardin@gmail.com>
|
||||||
@ -1506,7 +1581,9 @@ Lily Chung <lilithkchung@gmail.com>
|
|||||||
Lingchao Xin <douglarek@gmail.com>
|
Lingchao Xin <douglarek@gmail.com>
|
||||||
Lion Yang <lion@aosc.xyz>
|
Lion Yang <lion@aosc.xyz>
|
||||||
Liz Rice <liz@lizrice.com>
|
Liz Rice <liz@lizrice.com>
|
||||||
|
Lize Cai <lizzzcai1@gmail.com>
|
||||||
Lloyd Dewolf <foolswisdom@gmail.com>
|
Lloyd Dewolf <foolswisdom@gmail.com>
|
||||||
|
Lluís Batlle i Rossell <viric@viric.name>
|
||||||
Lorenz Bauer <lmb@cloudflare.com>
|
Lorenz Bauer <lmb@cloudflare.com>
|
||||||
Lorenz Brun <lorenz@brun.one>
|
Lorenz Brun <lorenz@brun.one>
|
||||||
Lorenz Nickel <mail@lorenznickel.de>
|
Lorenz Nickel <mail@lorenznickel.de>
|
||||||
@ -1531,6 +1608,7 @@ Lukasz Milewski <lmmilewski@gmail.com>
|
|||||||
Luke Champine <luke.champine@gmail.com>
|
Luke Champine <luke.champine@gmail.com>
|
||||||
Luke Curley <qpingu@gmail.com>
|
Luke Curley <qpingu@gmail.com>
|
||||||
Luke Granger-Brown <git@lukegb.com>
|
Luke Granger-Brown <git@lukegb.com>
|
||||||
|
Luke Shumaker <lukeshu@datawire.io>
|
||||||
Luke Young <bored-engineer@users.noreply.github.com>
|
Luke Young <bored-engineer@users.noreply.github.com>
|
||||||
Luna Duclos <luna.duclos@palmstonegames.com>
|
Luna Duclos <luna.duclos@palmstonegames.com>
|
||||||
Luuk van Dijk <lvd@golang.org> <lvd@google.com>
|
Luuk van Dijk <lvd@golang.org> <lvd@google.com>
|
||||||
@ -1550,6 +1628,7 @@ Mal Curtis <mal@mal.co.nz>
|
|||||||
Manfred Touron <m@42.am>
|
Manfred Touron <m@42.am>
|
||||||
Manigandan Dharmalingam <manigandan.jeff@gmail.com>
|
Manigandan Dharmalingam <manigandan.jeff@gmail.com>
|
||||||
Manish Goregaokar <manishsmail@gmail.com>
|
Manish Goregaokar <manishsmail@gmail.com>
|
||||||
|
Manlio Perillo <manlio.perillo@gmail.com>
|
||||||
Manoj Dayaram <platform-dev@moovweb.com> <manoj.dayaram@moovweb.com>
|
Manoj Dayaram <platform-dev@moovweb.com> <manoj.dayaram@moovweb.com>
|
||||||
Mansour Rahimi <rahimi.mnr@gmail.com>
|
Mansour Rahimi <rahimi.mnr@gmail.com>
|
||||||
Manu Garg <manugarg@google.com>
|
Manu Garg <manugarg@google.com>
|
||||||
@ -1646,6 +1725,8 @@ Matt Joiner <anacrolix@gmail.com>
|
|||||||
Matt Jones <mrjones@google.com>
|
Matt Jones <mrjones@google.com>
|
||||||
Matt Juran <thepciet@gmail.com>
|
Matt Juran <thepciet@gmail.com>
|
||||||
Matt Layher <mdlayher@gmail.com>
|
Matt Layher <mdlayher@gmail.com>
|
||||||
|
Matt Masurka <masurka@google.com>
|
||||||
|
Matt Pearring <broskies@google.com>
|
||||||
Matt Reiferson <mreiferson@gmail.com>
|
Matt Reiferson <mreiferson@gmail.com>
|
||||||
Matt Robenolt <matt@ydekproductions.com>
|
Matt Robenolt <matt@ydekproductions.com>
|
||||||
Matt Strong <mstrong1341@gmail.com>
|
Matt Strong <mstrong1341@gmail.com>
|
||||||
@ -1659,9 +1740,12 @@ Matthew Denton <mdenton@skyportsystems.com>
|
|||||||
Matthew Holt <Matthew.Holt+git@gmail.com>
|
Matthew Holt <Matthew.Holt+git@gmail.com>
|
||||||
Matthew Horsnell <matthew.horsnell@gmail.com>
|
Matthew Horsnell <matthew.horsnell@gmail.com>
|
||||||
Matthew Waters <mwwaters@gmail.com>
|
Matthew Waters <mwwaters@gmail.com>
|
||||||
|
Matthias Frei <matthias.frei@inf.ethz.ch>
|
||||||
Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
|
Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
|
||||||
Matthieu Olivier <olivier.matthieu@gmail.com>
|
Matthieu Olivier <olivier.matthieu@gmail.com>
|
||||||
Matthijs Kooijman <matthijs@stdin.nl>
|
Matthijs Kooijman <matthijs@stdin.nl>
|
||||||
|
Mattias Appelgren <mattias@ppelgren.se>
|
||||||
|
Mauricio Alvarado <mauricio.alvarado@leftfieldlabs.com>
|
||||||
Max Drosdo.www <g1ran1q@gmail.com>
|
Max Drosdo.www <g1ran1q@gmail.com>
|
||||||
Max Riveiro <kavu13@gmail.com>
|
Max Riveiro <kavu13@gmail.com>
|
||||||
Max Schmitt <max@schmitt.mx>
|
Max Schmitt <max@schmitt.mx>
|
||||||
@ -1677,9 +1761,11 @@ Máximo Cuadros Ortiz <mcuadros@gmail.com>
|
|||||||
Maxwell Krohn <themax@gmail.com>
|
Maxwell Krohn <themax@gmail.com>
|
||||||
Maya Rashish <maya@NetBSD.org>
|
Maya Rashish <maya@NetBSD.org>
|
||||||
Mayank Kumar <krmayankk@gmail.com>
|
Mayank Kumar <krmayankk@gmail.com>
|
||||||
|
Mehrad Sadeghi <2012.linkinpark@gmail.com>
|
||||||
Meir Fischer <meirfischer@gmail.com>
|
Meir Fischer <meirfischer@gmail.com>
|
||||||
Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
|
Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
|
||||||
Mhd Sulhan <m.shulhan@gmail.com>
|
Mhd Sulhan <m.shulhan@gmail.com>
|
||||||
|
Mia Zhu <CrystalZhu1025getu@gmail.com>
|
||||||
Micah Stetson <micah.stetson@gmail.com>
|
Micah Stetson <micah.stetson@gmail.com>
|
||||||
Michael Anthony Knyszek <mknyszek@google.com>
|
Michael Anthony Knyszek <mknyszek@google.com>
|
||||||
Michael Brandenburg <mbrandenburg@bolste.com>
|
Michael Brandenburg <mbrandenburg@bolste.com>
|
||||||
@ -1730,8 +1816,10 @@ Michal Franc <lam.michal.franc@gmail.com>
|
|||||||
Michał Łowicki <mlowicki@gmail.com>
|
Michał Łowicki <mlowicki@gmail.com>
|
||||||
Michal Pristas <michal.pristas@gmail.com>
|
Michal Pristas <michal.pristas@gmail.com>
|
||||||
Michal Rostecki <mrostecki@suse.de>
|
Michal Rostecki <mrostecki@suse.de>
|
||||||
|
Michal Stokluska <mstoklus@redhat.com>
|
||||||
Michalis Kargakis <michaliskargakis@gmail.com>
|
Michalis Kargakis <michaliskargakis@gmail.com>
|
||||||
Michel Lespinasse <walken@google.com>
|
Michel Lespinasse <walken@google.com>
|
||||||
|
Michel Levieux <mlevieux42@gmail.com>
|
||||||
Michele Di Pede <michele.di.pede@gmail.com>
|
Michele Di Pede <michele.di.pede@gmail.com>
|
||||||
Mickael Kerjean <mickael.kerjean@gmail.com>
|
Mickael Kerjean <mickael.kerjean@gmail.com>
|
||||||
Mickey Reiss <mickeyreiss@gmail.com>
|
Mickey Reiss <mickeyreiss@gmail.com>
|
||||||
@ -1790,7 +1878,9 @@ Muir Manders <muir@mnd.rs>
|
|||||||
Mukesh Sharma <sharma.mukesh439@gmail.com>
|
Mukesh Sharma <sharma.mukesh439@gmail.com>
|
||||||
Mura Li <mura_li@castech.com.tw>
|
Mura Li <mura_li@castech.com.tw>
|
||||||
Mykhailo Lesyk <mikhail@lesyk.org>
|
Mykhailo Lesyk <mikhail@lesyk.org>
|
||||||
|
Nahum Shalman <nahamu@gmail.com>
|
||||||
Naman Aggarwal <aggarwal.nam@gmail.com>
|
Naman Aggarwal <aggarwal.nam@gmail.com>
|
||||||
|
Naman Gera <namangera15@gmail.com>
|
||||||
Nan Deng <monnand@gmail.com>
|
Nan Deng <monnand@gmail.com>
|
||||||
Nao Yonashiro <owan.orisano@gmail.com>
|
Nao Yonashiro <owan.orisano@gmail.com>
|
||||||
Naoki Kanatani <k12naoki@gmail.com>
|
Naoki Kanatani <k12naoki@gmail.com>
|
||||||
@ -1818,6 +1908,7 @@ Neven Sajko <nsajko@gmail.com>
|
|||||||
Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
|
Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
|
||||||
Niall Sheridan <nsheridan@gmail.com>
|
Niall Sheridan <nsheridan@gmail.com>
|
||||||
Nic Day <nic.day@me.com>
|
Nic Day <nic.day@me.com>
|
||||||
|
Nicholas Asimov <nicholas@asimov.me>
|
||||||
Nicholas Katsaros <nick@nickkatsaros.com>
|
Nicholas Katsaros <nick@nickkatsaros.com>
|
||||||
Nicholas Maniscalco <nicholas@maniscalco.com>
|
Nicholas Maniscalco <nicholas@maniscalco.com>
|
||||||
Nicholas Ng <nickng@nickng.io>
|
Nicholas Ng <nickng@nickng.io>
|
||||||
@ -1847,6 +1938,7 @@ Nik Nyby <nnyby@columbia.edu>
|
|||||||
Nikhil Benesch <nikhil.benesch@gmail.com>
|
Nikhil Benesch <nikhil.benesch@gmail.com>
|
||||||
Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
|
Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
|
||||||
Nikita Kryuchkov <nkryuchkov10@gmail.com>
|
Nikita Kryuchkov <nkryuchkov10@gmail.com>
|
||||||
|
Nikita Melekhin <nimelehin@gmail.com>
|
||||||
Nikita Vanyasin <nikita.vanyasin@gmail.com>
|
Nikita Vanyasin <nikita.vanyasin@gmail.com>
|
||||||
Niklas Schnelle <niklas.schnelle@gmail.com>
|
Niklas Schnelle <niklas.schnelle@gmail.com>
|
||||||
Niko Dziemba <niko@dziemba.com>
|
Niko Dziemba <niko@dziemba.com>
|
||||||
@ -1858,6 +1950,7 @@ Niranjan Godbole <niranjan8192@gmail.com>
|
|||||||
Nishanth Shanmugham <nishanth.gerrard@gmail.com>
|
Nishanth Shanmugham <nishanth.gerrard@gmail.com>
|
||||||
Noah Campbell <noahcampbell@gmail.com>
|
Noah Campbell <noahcampbell@gmail.com>
|
||||||
Noah Goldman <noahg34@gmail.com>
|
Noah Goldman <noahg34@gmail.com>
|
||||||
|
Noah Santschi-Cooney <noah@santschi-cooney.ch>
|
||||||
Noble Johnson <noblepoly@gmail.com>
|
Noble Johnson <noblepoly@gmail.com>
|
||||||
Nodir Turakulov <nodir@google.com>
|
Nodir Turakulov <nodir@google.com>
|
||||||
Noel Georgi <git@frezbo.com>
|
Noel Georgi <git@frezbo.com>
|
||||||
@ -1894,6 +1987,7 @@ Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
|
|||||||
Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
|
Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
|
||||||
Padraig Kitterick <padraigkitterick@gmail.com>
|
Padraig Kitterick <padraigkitterick@gmail.com>
|
||||||
Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
|
Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
|
||||||
|
Pan Chenglong <1004907659@qq.com>
|
||||||
Panos Georgiadis <pgeorgiadis@suse.de>
|
Panos Georgiadis <pgeorgiadis@suse.de>
|
||||||
Pantelis Sampaziotis <psampaz@gmail.com>
|
Pantelis Sampaziotis <psampaz@gmail.com>
|
||||||
Paolo Giarrusso <p.giarrusso@gmail.com>
|
Paolo Giarrusso <p.giarrusso@gmail.com>
|
||||||
@ -1947,6 +2041,7 @@ Paulo Casaretto <pcasaretto@gmail.com>
|
|||||||
Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
||||||
Paulo Gomes <paulo.gomes.uk@gmail.com>
|
Paulo Gomes <paulo.gomes.uk@gmail.com>
|
||||||
Pavel Paulau <pavel.paulau@gmail.com>
|
Pavel Paulau <pavel.paulau@gmail.com>
|
||||||
|
Pavel Watson <watsonpavel@gmail.com>
|
||||||
Pavel Zinovkin <pavel.zinovkin@gmail.com>
|
Pavel Zinovkin <pavel.zinovkin@gmail.com>
|
||||||
Pavlo Sumkin <ymkins@gmail.com>
|
Pavlo Sumkin <ymkins@gmail.com>
|
||||||
Pawel Knap <pawelknap88@gmail.com>
|
Pawel Knap <pawelknap88@gmail.com>
|
||||||
@ -1954,6 +2049,8 @@ Pawel Szczur <filemon@google.com>
|
|||||||
Paweł Szulik <pawel.szulik@intel.com>
|
Paweł Szulik <pawel.szulik@intel.com>
|
||||||
Pei Xian Chee <luciolas1991@gmail.com>
|
Pei Xian Chee <luciolas1991@gmail.com>
|
||||||
Pei-Ming Wu <p408865@gmail.com>
|
Pei-Ming Wu <p408865@gmail.com>
|
||||||
|
Pen Tree <appletree2479@outlook.com>
|
||||||
|
Peng Gao <peng.gao.dut@gmail.com>
|
||||||
Percy Wegmann <ox.to.a.cart@gmail.com>
|
Percy Wegmann <ox.to.a.cart@gmail.com>
|
||||||
Perry Abbott <perry.j.abbott@gmail.com>
|
Perry Abbott <perry.j.abbott@gmail.com>
|
||||||
Petar Dambovaliev <petar.atanasov.1987@gmail.com>
|
Petar Dambovaliev <petar.atanasov.1987@gmail.com>
|
||||||
@ -1992,6 +2089,7 @@ Philip Brown <phil@bolthole.com>
|
|||||||
Philip Hofer <phofer@umich.edu>
|
Philip Hofer <phofer@umich.edu>
|
||||||
Philip K. Warren <pkwarren@gmail.com>
|
Philip K. Warren <pkwarren@gmail.com>
|
||||||
Philip Nelson <me@pnelson.ca>
|
Philip Nelson <me@pnelson.ca>
|
||||||
|
Philipp Sauter <sauterp@protonmail.com>
|
||||||
Philipp Stephani <phst@google.com>
|
Philipp Stephani <phst@google.com>
|
||||||
Phillip Campbell <15082+phillc@users.noreply.github.com>
|
Phillip Campbell <15082+phillc@users.noreply.github.com>
|
||||||
Pierre Carru <pierre.carru@eshard.com>
|
Pierre Carru <pierre.carru@eshard.com>
|
||||||
@ -2007,6 +2105,7 @@ Poh Zi How <poh.zihow@gmail.com>
|
|||||||
Polina Osadcha <polliosa@google.com>
|
Polina Osadcha <polliosa@google.com>
|
||||||
Pontus Leitzler <leitzler@gmail.com>
|
Pontus Leitzler <leitzler@gmail.com>
|
||||||
Povilas Versockas <p.versockas@gmail.com>
|
Povilas Versockas <p.versockas@gmail.com>
|
||||||
|
Prajwal Koirala <16564273+Prajwal-Koirala@users.noreply.github.com>
|
||||||
Prasanga Siripala <pj@pjebs.com.au>
|
Prasanga Siripala <pj@pjebs.com.au>
|
||||||
Prasanna Swaminathan <prasanna@mediamath.com>
|
Prasanna Swaminathan <prasanna@mediamath.com>
|
||||||
Prashant Agrawal <prashant.a.vjti@gmail.com>
|
Prashant Agrawal <prashant.a.vjti@gmail.com>
|
||||||
@ -2027,11 +2126,13 @@ Quim Muntal <quimmuntal@gmail.com>
|
|||||||
Quinn Slack <sqs@sourcegraph.com>
|
Quinn Slack <sqs@sourcegraph.com>
|
||||||
Quinten Yearsley <qyearsley@chromium.org>
|
Quinten Yearsley <qyearsley@chromium.org>
|
||||||
Quoc-Viet Nguyen <afelion@gmail.com>
|
Quoc-Viet Nguyen <afelion@gmail.com>
|
||||||
|
Rabin Gaire <rabingaire20@gmail.com>
|
||||||
Radek Simko <radek.simko@gmail.com>
|
Radek Simko <radek.simko@gmail.com>
|
||||||
Radek Sohlich <sohlich@gmail.com>
|
Radek Sohlich <sohlich@gmail.com>
|
||||||
Radu Berinde <radu@cockroachlabs.com>
|
Radu Berinde <radu@cockroachlabs.com>
|
||||||
Rafal Jeczalik <rjeczalik@gmail.com>
|
Rafal Jeczalik <rjeczalik@gmail.com>
|
||||||
Raghavendra Nagaraj <jamdagni86@gmail.com>
|
Raghavendra Nagaraj <jamdagni86@gmail.com>
|
||||||
|
Rahul Bajaj <rahulrb0509@gmail.com>
|
||||||
Rahul Chaudhry <rahulchaudhry@chromium.org>
|
Rahul Chaudhry <rahulchaudhry@chromium.org>
|
||||||
Rahul Wadhwani <rahulwadhwani21@gmail.com>
|
Rahul Wadhwani <rahulwadhwani21@gmail.com>
|
||||||
Raif S. Naffah <go@naffah-raif.name>
|
Raif S. Naffah <go@naffah-raif.name>
|
||||||
@ -2041,12 +2142,14 @@ Rajender Reddy Kompally <rajenderreddykompally@gmail.com>
|
|||||||
Ralph Corderoy <ralph@inputplus.co.uk>
|
Ralph Corderoy <ralph@inputplus.co.uk>
|
||||||
Ramazan AYYILDIZ <rayyildiz@gmail.com>
|
Ramazan AYYILDIZ <rayyildiz@gmail.com>
|
||||||
Ramesh Dharan <dharan@google.com>
|
Ramesh Dharan <dharan@google.com>
|
||||||
|
Randy Reddig <randy@alta.software>
|
||||||
Raph Levien <raph@google.com>
|
Raph Levien <raph@google.com>
|
||||||
Raphael Geronimi <raphael.geronimi@gmail.com>
|
Raphael Geronimi <raphael.geronimi@gmail.com>
|
||||||
Raul Silvera <rsilvera@google.com>
|
Raul Silvera <rsilvera@google.com>
|
||||||
Ravil Bikbulatov <weeellz12@gmail.com>
|
Ravil Bikbulatov <weeellz12@gmail.com>
|
||||||
RaviTeja Pothana <ravi.tezu@gmail.com>
|
RaviTeja Pothana <ravi.tezu@gmail.com>
|
||||||
Ray Tung <rtung@thoughtworks.com>
|
Ray Tung <rtung@thoughtworks.com>
|
||||||
|
Ray Wu <ray@liftoff.io>
|
||||||
Raymond Kazlauskas <raima220@gmail.com>
|
Raymond Kazlauskas <raima220@gmail.com>
|
||||||
Rebecca Stambler <rstambler@golang.org>
|
Rebecca Stambler <rstambler@golang.org>
|
||||||
Reilly Watson <reillywatson@gmail.com>
|
Reilly Watson <reillywatson@gmail.com>
|
||||||
@ -2066,6 +2169,7 @@ Richard Eric Gavaletz <gavaletz@gmail.com>
|
|||||||
Richard Gibson <richard.gibson@gmail.com>
|
Richard Gibson <richard.gibson@gmail.com>
|
||||||
Richard Miller <miller.research@gmail.com>
|
Richard Miller <miller.research@gmail.com>
|
||||||
Richard Musiol <mail@richard-musiol.de> <neelance@gmail.com>
|
Richard Musiol <mail@richard-musiol.de> <neelance@gmail.com>
|
||||||
|
Richard Pickering <richard.pickering@hotmail.co.uk>
|
||||||
Richard Ulmer <codesoap@mailbox.org>
|
Richard Ulmer <codesoap@mailbox.org>
|
||||||
Richard Wilkes <wilkes@me.com>
|
Richard Wilkes <wilkes@me.com>
|
||||||
Rick Arnold <rickarnoldjr@gmail.com>
|
Rick Arnold <rickarnoldjr@gmail.com>
|
||||||
@ -2124,6 +2228,7 @@ Rowan Worth <sqweek@gmail.com>
|
|||||||
Rudi Kramer <rudi.kramer@gmail.com>
|
Rudi Kramer <rudi.kramer@gmail.com>
|
||||||
Rui Ueyama <ruiu@google.com>
|
Rui Ueyama <ruiu@google.com>
|
||||||
Ruixin Bao <ruixin.bao@ibm.com>
|
Ruixin Bao <ruixin.bao@ibm.com>
|
||||||
|
Ruslan Andreev <ruslan.andreev@huawei.com>
|
||||||
Ruslan Nigmatullin <elessar@dropbox.com>
|
Ruslan Nigmatullin <elessar@dropbox.com>
|
||||||
Russ Cox <rsc@golang.org>
|
Russ Cox <rsc@golang.org>
|
||||||
Russell Haering <russellhaering@gmail.com>
|
Russell Haering <russellhaering@gmail.com>
|
||||||
@ -2141,6 +2246,7 @@ Ryan Seys <ryan@ryanseys.com>
|
|||||||
Ryan Slade <ryanslade@gmail.com>
|
Ryan Slade <ryanslade@gmail.com>
|
||||||
Ryan Zhang <ryan.zhang@docker.com>
|
Ryan Zhang <ryan.zhang@docker.com>
|
||||||
Ryoichi KATO <ryo1kato@gmail.com>
|
Ryoichi KATO <ryo1kato@gmail.com>
|
||||||
|
Ryoya Sekino <ryoyasekino1993@gmail.com>
|
||||||
Ryuji Iwata <qt.luigi@gmail.com>
|
Ryuji Iwata <qt.luigi@gmail.com>
|
||||||
Ryuma Yoshida <ryuma.y1117@gmail.com>
|
Ryuma Yoshida <ryuma.y1117@gmail.com>
|
||||||
Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
|
Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
|
||||||
@ -2176,8 +2282,10 @@ Sardorbek Pulatov <sardorbek.pulatov@outlook.com>
|
|||||||
Sascha Brawer <sascha@brawer.ch>
|
Sascha Brawer <sascha@brawer.ch>
|
||||||
Sasha Lionheart <lionhearts@google.com>
|
Sasha Lionheart <lionhearts@google.com>
|
||||||
Sasha Sobol <sasha@scaledinference.com>
|
Sasha Sobol <sasha@scaledinference.com>
|
||||||
|
Satoru Kitaguchi <rule.the.fate.myfirststory@gmail.com>
|
||||||
Scott Barron <scott.barron@github.com>
|
Scott Barron <scott.barron@github.com>
|
||||||
Scott Bell <scott@sctsm.com>
|
Scott Bell <scott@sctsm.com>
|
||||||
|
Scott Cotton <scott@mindowl.com>
|
||||||
Scott Crunkleton <crunk1@gmail.com>
|
Scott Crunkleton <crunk1@gmail.com>
|
||||||
Scott Ferguson <scottwferg@gmail.com>
|
Scott Ferguson <scottwferg@gmail.com>
|
||||||
Scott Lawrence <bytbox@gmail.com>
|
Scott Lawrence <bytbox@gmail.com>
|
||||||
@ -2191,6 +2299,7 @@ Sean Chittenden <seanc@joyent.com>
|
|||||||
Sean Christopherson <sean.j.christopherson@intel.com>
|
Sean Christopherson <sean.j.christopherson@intel.com>
|
||||||
Sean Dolphin <Sean.Dolphin@kpcompass.com>
|
Sean Dolphin <Sean.Dolphin@kpcompass.com>
|
||||||
Sean Harger <sharger@google.com>
|
Sean Harger <sharger@google.com>
|
||||||
|
Sean Harrington <sean.harrington@leftfieldlabs.com>
|
||||||
Sean Hildebrand <seanwhildebrand@gmail.com>
|
Sean Hildebrand <seanwhildebrand@gmail.com>
|
||||||
Sean Liao <seankhliao@gmail.com>
|
Sean Liao <seankhliao@gmail.com>
|
||||||
Sean Rees <sean@erifax.org>
|
Sean Rees <sean@erifax.org>
|
||||||
@ -2212,6 +2321,7 @@ Sergey Dobrodey <sergey.dobrodey@synesis.ru>
|
|||||||
Sergey Frolov <sfrolov@google.com>
|
Sergey Frolov <sfrolov@google.com>
|
||||||
Sergey Glushchenko <gsserge@gmail.com>
|
Sergey Glushchenko <gsserge@gmail.com>
|
||||||
Sergey Ivanov <ser1325@gmail.com>
|
Sergey Ivanov <ser1325@gmail.com>
|
||||||
|
Sergey Kacheev <S.Kacheev@gmail.com>
|
||||||
Sergey Lukjanov <me@slukjanov.name>
|
Sergey Lukjanov <me@slukjanov.name>
|
||||||
Sergey Mishin <sergeymishine@gmail.com>
|
Sergey Mishin <sergeymishine@gmail.com>
|
||||||
Sergey Mudrik <sergey.mudrik@gmail.com>
|
Sergey Mudrik <sergey.mudrik@gmail.com>
|
||||||
@ -2223,6 +2333,7 @@ Serhat Giydiren <serhatgiydiren@gmail.com>
|
|||||||
Serhii Aheienko <serhii.aheienko@gmail.com>
|
Serhii Aheienko <serhii.aheienko@gmail.com>
|
||||||
Seth Hoenig <seth.a.hoenig@gmail.com>
|
Seth Hoenig <seth.a.hoenig@gmail.com>
|
||||||
Seth Vargo <sethvargo@gmail.com>
|
Seth Vargo <sethvargo@gmail.com>
|
||||||
|
Shaba Abhiram <shabarivas.abhiram@gmail.com>
|
||||||
Shahar Kohanim <skohanim@gmail.com>
|
Shahar Kohanim <skohanim@gmail.com>
|
||||||
Shailesh Suryawanshi <ss.shailesh28@gmail.com>
|
Shailesh Suryawanshi <ss.shailesh28@gmail.com>
|
||||||
Shamil Garatuev <garatuev@gmail.com>
|
Shamil Garatuev <garatuev@gmail.com>
|
||||||
@ -2250,9 +2361,13 @@ Shivakumar GN <shivakumar.gn@gmail.com>
|
|||||||
Shivani Singhal <shivani.singhal2804@gmail.com>
|
Shivani Singhal <shivani.singhal2804@gmail.com>
|
||||||
Shivansh Rai <shivansh@freebsd.org>
|
Shivansh Rai <shivansh@freebsd.org>
|
||||||
Shivashis Padhi <shivashispadhi@gmail.com>
|
Shivashis Padhi <shivashispadhi@gmail.com>
|
||||||
|
Shoshin Nikita <shoshin_nikita@fastmail.com>
|
||||||
|
Shota Sugiura <s.shota.710.3506@gmail.com>
|
||||||
Shubham Sharma <shubham.sha12@gmail.com>
|
Shubham Sharma <shubham.sha12@gmail.com>
|
||||||
|
Shuhei Takahashi <nya@chromium.org>
|
||||||
Shun Fan <sfan@google.com>
|
Shun Fan <sfan@google.com>
|
||||||
Silvan Jegen <s.jegen@gmail.com>
|
Silvan Jegen <s.jegen@gmail.com>
|
||||||
|
Simão Gomes Viana <simaogmv@gmail.com>
|
||||||
Simarpreet Singh <simar@linux.com>
|
Simarpreet Singh <simar@linux.com>
|
||||||
Simon Drake <simondrake1990@gmail.com>
|
Simon Drake <simondrake1990@gmail.com>
|
||||||
Simon Ferquel <simon.ferquel@docker.com>
|
Simon Ferquel <simon.ferquel@docker.com>
|
||||||
@ -2267,13 +2382,16 @@ Sina Siadat <siadat@gmail.com>
|
|||||||
Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
|
Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
|
||||||
Sokolov Yura <funny.falcon@gmail.com>
|
Sokolov Yura <funny.falcon@gmail.com>
|
||||||
Song Gao <song@gao.io>
|
Song Gao <song@gao.io>
|
||||||
|
Song Lim <songlim327@gmail.com>
|
||||||
Songjiayang <songjiayang1@gmail.com>
|
Songjiayang <songjiayang1@gmail.com>
|
||||||
|
Songlin Jiang <hollowman@hollowman.ml>
|
||||||
Soojin Nam <jsunam@gmail.com>
|
Soojin Nam <jsunam@gmail.com>
|
||||||
Søren L. Hansen <soren@linux2go.dk>
|
Søren L. Hansen <soren@linux2go.dk>
|
||||||
Sparrow Li <liyuancylx@gmail.com>
|
Sparrow Li <liyuancylx@gmail.com>
|
||||||
Spencer Kocot <spencerkocot@gmail.com>
|
Spencer Kocot <spencerkocot@gmail.com>
|
||||||
Spencer Nelson <s@spenczar.com>
|
Spencer Nelson <s@spenczar.com>
|
||||||
Spencer Tung <spencertung@google.com>
|
Spencer Tung <spencertung@google.com>
|
||||||
|
Spenser Black <spenserblack01@gmail.com>
|
||||||
Spring Mc <heresy.mc@gmail.com>
|
Spring Mc <heresy.mc@gmail.com>
|
||||||
Srdjan Petrovic <spetrovic@google.com>
|
Srdjan Petrovic <spetrovic@google.com>
|
||||||
Sridhar Venkatakrishnan <sridhar@laddoo.net>
|
Sridhar Venkatakrishnan <sridhar@laddoo.net>
|
||||||
@ -2324,6 +2442,7 @@ Suyash <dextrous93@gmail.com>
|
|||||||
Suzy Mueller <suzmue@golang.org>
|
Suzy Mueller <suzmue@golang.org>
|
||||||
Sven Almgren <sven@tras.se>
|
Sven Almgren <sven@tras.se>
|
||||||
Sven Blumenstein <svbl@google.com>
|
Sven Blumenstein <svbl@google.com>
|
||||||
|
Sven Lee <lee1300394324@gmail.com>
|
||||||
Sven Taute <sven.taute@gmail.com>
|
Sven Taute <sven.taute@gmail.com>
|
||||||
Sylvain Zimmer <sylvain@sylvainzimmer.com>
|
Sylvain Zimmer <sylvain@sylvainzimmer.com>
|
||||||
Syohei YOSHIDA <syohex@gmail.com>
|
Syohei YOSHIDA <syohex@gmail.com>
|
||||||
@ -2406,12 +2525,14 @@ Tiwei Bie <tiwei.btw@antgroup.com>
|
|||||||
Tobias Assarsson <tobias.assarsson@gmail.com>
|
Tobias Assarsson <tobias.assarsson@gmail.com>
|
||||||
Tobias Columbus <tobias.columbus@gmail.com> <tobias.columbus@googlemail.com>
|
Tobias Columbus <tobias.columbus@gmail.com> <tobias.columbus@googlemail.com>
|
||||||
Tobias Klauser <tklauser@distanz.ch>
|
Tobias Klauser <tklauser@distanz.ch>
|
||||||
|
Tobias Kohlbau <tobias@kohlbau.de>
|
||||||
Toby Burress <kurin@google.com>
|
Toby Burress <kurin@google.com>
|
||||||
Todd Kulesza <tkulesza@google.com>
|
Todd Kulesza <tkulesza@google.com>
|
||||||
Todd Neal <todd@tneal.org>
|
Todd Neal <todd@tneal.org>
|
||||||
Todd Wang <toddwang@gmail.com>
|
Todd Wang <toddwang@gmail.com>
|
||||||
Tom Anthony <git@tomanthony.co.uk>
|
Tom Anthony <git@tomanthony.co.uk>
|
||||||
Tom Bergan <tombergan@google.com>
|
Tom Bergan <tombergan@google.com>
|
||||||
|
Tom Freudenberg <tom.freudenberg@4commerce.de>
|
||||||
Tom Heng <zhm20070928@gmail.com>
|
Tom Heng <zhm20070928@gmail.com>
|
||||||
Tom Lanyon <tomlanyon@google.com>
|
Tom Lanyon <tomlanyon@google.com>
|
||||||
Tom Levy <tomlevy93@gmail.com>
|
Tom Levy <tomlevy93@gmail.com>
|
||||||
@ -2440,6 +2561,7 @@ Toshiki Shima <hayabusa1419@gmail.com>
|
|||||||
Totoro W <tw19881113@gmail.com>
|
Totoro W <tw19881113@gmail.com>
|
||||||
Travis Bischel <travis.bischel@gmail.com>
|
Travis Bischel <travis.bischel@gmail.com>
|
||||||
Travis Cline <travis.cline@gmail.com>
|
Travis Cline <travis.cline@gmail.com>
|
||||||
|
Trevor Dixon <trevordixon@gmail.com>
|
||||||
Trevor Strohman <trevor.strohman@gmail.com>
|
Trevor Strohman <trevor.strohman@gmail.com>
|
||||||
Trey Lawrence <lawrence.trey@gmail.com>
|
Trey Lawrence <lawrence.trey@gmail.com>
|
||||||
Trey Roessig <trey.roessig@gmail.com>
|
Trey Roessig <trey.roessig@gmail.com>
|
||||||
@ -2463,6 +2585,7 @@ Tzach Shabtay <tzachshabtay@gmail.com>
|
|||||||
Tzu-Chiao Yeh <su3g4284zo6y7@gmail.com>
|
Tzu-Chiao Yeh <su3g4284zo6y7@gmail.com>
|
||||||
Tzu-Jung Lee <roylee17@currant.com>
|
Tzu-Jung Lee <roylee17@currant.com>
|
||||||
Udalov Max <re.udalov@gmail.com>
|
Udalov Max <re.udalov@gmail.com>
|
||||||
|
Uddeshya Singh <singhuddeshyaofficial@gmail.com>
|
||||||
Ugorji Nwoke <ugorji@gmail.com>
|
Ugorji Nwoke <ugorji@gmail.com>
|
||||||
Ulf Holm Nielsen <doktor@dyregod.dk>
|
Ulf Holm Nielsen <doktor@dyregod.dk>
|
||||||
Ulrich Kunitz <uli.kunitz@gmail.com>
|
Ulrich Kunitz <uli.kunitz@gmail.com>
|
||||||
@ -2475,6 +2598,7 @@ Vadim Grek <vadimprog@gmail.com>
|
|||||||
Vadim Vygonets <unixdj@gmail.com>
|
Vadim Vygonets <unixdj@gmail.com>
|
||||||
Val Polouchkine <vpolouch@justin.tv>
|
Val Polouchkine <vpolouch@justin.tv>
|
||||||
Valentin Vidic <vvidic@valentin-vidic.from.hr>
|
Valentin Vidic <vvidic@valentin-vidic.from.hr>
|
||||||
|
Vaughn Iverson <vsivsi@yahoo.com>
|
||||||
Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
|
Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
|
||||||
Vega Garcia Luis Alfonso <vegacom@gmail.com>
|
Vega Garcia Luis Alfonso <vegacom@gmail.com>
|
||||||
Venil Noronha <veniln@vmware.com>
|
Venil Noronha <veniln@vmware.com>
|
||||||
@ -2491,6 +2615,7 @@ Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
|
|||||||
Vincent Vanackere <vincent.vanackere@gmail.com>
|
Vincent Vanackere <vincent.vanackere@gmail.com>
|
||||||
Vinu Rajashekhar <vinutheraj@gmail.com>
|
Vinu Rajashekhar <vinutheraj@gmail.com>
|
||||||
Vish Subramanian <vish@google.com>
|
Vish Subramanian <vish@google.com>
|
||||||
|
Vishal Dalwadi <dalwadivishal26@gmail.com>
|
||||||
Vishvananda Ishaya <vishvananda@gmail.com>
|
Vishvananda Ishaya <vishvananda@gmail.com>
|
||||||
Visweswara R <r.visweswara@gmail.com>
|
Visweswara R <r.visweswara@gmail.com>
|
||||||
Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
|
Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
|
||||||
@ -2542,6 +2667,7 @@ Willem van der Schyff <willemvds@gmail.com>
|
|||||||
William Chan <willchan@chromium.org>
|
William Chan <willchan@chromium.org>
|
||||||
William Chang <mr.williamchang@gmail.com>
|
William Chang <mr.williamchang@gmail.com>
|
||||||
William Josephson <wjosephson@gmail.com>
|
William Josephson <wjosephson@gmail.com>
|
||||||
|
William Langford <wlangfor@gmail.com>
|
||||||
William Orr <will@worrbase.com> <ay1244@gmail.com>
|
William Orr <will@worrbase.com> <ay1244@gmail.com>
|
||||||
William Poussier <william.poussier@gmail.com>
|
William Poussier <william.poussier@gmail.com>
|
||||||
Wisdom Omuya <deafgoat@gmail.com>
|
Wisdom Omuya <deafgoat@gmail.com>
|
||||||
@ -2550,6 +2676,7 @@ Xi Ruoyao <xry23333@gmail.com>
|
|||||||
Xia Bin <snyh@snyh.org>
|
Xia Bin <snyh@snyh.org>
|
||||||
Xiangdong Ji <xiangdong.ji@arm.com>
|
Xiangdong Ji <xiangdong.ji@arm.com>
|
||||||
Xiaodong Liu <teaofmoli@gmail.com>
|
Xiaodong Liu <teaofmoli@gmail.com>
|
||||||
|
Xing Gao <18340825824@163.com>
|
||||||
Xing Xing <mikespook@gmail.com>
|
Xing Xing <mikespook@gmail.com>
|
||||||
Xingqang Bai <bxq2011hust@qq.com>
|
Xingqang Bai <bxq2011hust@qq.com>
|
||||||
Xu Fei <badgangkiller@gmail.com>
|
Xu Fei <badgangkiller@gmail.com>
|
||||||
@ -2571,6 +2698,7 @@ Yasha Bubnov <girokompass@gmail.com>
|
|||||||
Yasser Abdolmaleki <yasser@yasser.ca>
|
Yasser Abdolmaleki <yasser@yasser.ca>
|
||||||
Yasuharu Goto <matope.ono@gmail.com>
|
Yasuharu Goto <matope.ono@gmail.com>
|
||||||
Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
||||||
|
Yasutaka Shinzaki <shinzaki@yasu26.tech>
|
||||||
Yasuyuki Oka <yasuyk@gmail.com>
|
Yasuyuki Oka <yasuyk@gmail.com>
|
||||||
Yazen Shunnar <yazen.shunnar@gmail.com>
|
Yazen Shunnar <yazen.shunnar@gmail.com>
|
||||||
Yestin Sun <ylh@pdx.edu>
|
Yestin Sun <ylh@pdx.edu>
|
||||||
@ -2583,14 +2711,18 @@ Yorman Arias <cixtords@gmail.com>
|
|||||||
Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
|
Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
|
||||||
Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
|
Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
|
||||||
Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
|
Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
|
||||||
|
Youfu Zhang <zhangyoufu@gmail.com>
|
||||||
Yu Heng Zhang <annita.zhang@cn.ibm.com>
|
Yu Heng Zhang <annita.zhang@cn.ibm.com>
|
||||||
Yu Xuan Zhang <zyxsh@cn.ibm.com>
|
Yu Xuan Zhang <zyxsh@cn.ibm.com>
|
||||||
|
Yu, Li-Yu <afg984@gmail.com>
|
||||||
Yuichi Kishimoto <yk2220s@gmail.com>
|
Yuichi Kishimoto <yk2220s@gmail.com>
|
||||||
Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
|
Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
|
||||||
Yuji Yaginuma <yuuji.yaginuma@gmail.com>
|
Yuji Yaginuma <yuuji.yaginuma@gmail.com>
|
||||||
|
Yuki Ito <mrno110y@gmail.com>
|
||||||
Yuki OKUSHI <huyuumi.dev@gmail.com>
|
Yuki OKUSHI <huyuumi.dev@gmail.com>
|
||||||
Yuki Yugui Sonoda <yugui@google.com>
|
Yuki Yugui Sonoda <yugui@google.com>
|
||||||
Yukihiro Nishinaka <6elpinal@gmail.com>
|
Yukihiro Nishinaka <6elpinal@gmail.com>
|
||||||
|
YunQiang Su <syq@debian.org>
|
||||||
Yury Smolsky <yury@smolsky.by>
|
Yury Smolsky <yury@smolsky.by>
|
||||||
Yusuke Kagiwada <block.rxckin.beats@gmail.com>
|
Yusuke Kagiwada <block.rxckin.beats@gmail.com>
|
||||||
Yuusei Kuwana <kuwana@kumama.org>
|
Yuusei Kuwana <kuwana@kumama.org>
|
||||||
@ -2599,6 +2731,7 @@ Yves Junqueira <yvesj@google.com> <yves.junqueira@gmail.com>
|
|||||||
Zac Bergquist <zbergquist99@gmail.com>
|
Zac Bergquist <zbergquist99@gmail.com>
|
||||||
Zach Bintliff <zbintliff@gmail.com>
|
Zach Bintliff <zbintliff@gmail.com>
|
||||||
Zach Gershman <zachgersh@gmail.com>
|
Zach Gershman <zachgersh@gmail.com>
|
||||||
|
Zach Hoffman <zrhoffman@apache.org>
|
||||||
Zach Jones <zachj1@gmail.com>
|
Zach Jones <zachj1@gmail.com>
|
||||||
Zachary Amsden <zach@thundertoken.com>
|
Zachary Amsden <zach@thundertoken.com>
|
||||||
Zachary Gershman <zgershman@pivotal.io>
|
Zachary Gershman <zgershman@pivotal.io>
|
||||||
@ -2617,6 +2750,7 @@ Zhou Peng <p@ctriple.cn>
|
|||||||
Ziad Hatahet <hatahet@gmail.com>
|
Ziad Hatahet <hatahet@gmail.com>
|
||||||
Ziheng Liu <lzhfromustc@gmail.com>
|
Ziheng Liu <lzhfromustc@gmail.com>
|
||||||
Zorion Arrizabalaga <zorionk@gmail.com>
|
Zorion Arrizabalaga <zorionk@gmail.com>
|
||||||
|
Zvonimir Pavlinovic <zpavlinovic@google.com>
|
||||||
Zyad A. Ali <zyad.ali.me@gmail.com>
|
Zyad A. Ali <zyad.ali.me@gmail.com>
|
||||||
Максадбек Ахмедов <a.maksadbek@gmail.com>
|
Максадбек Ахмедов <a.maksadbek@gmail.com>
|
||||||
Максим Федосеев <max.faceless.frei@gmail.com>
|
Максим Федосеев <max.faceless.frei@gmail.com>
|
||||||
|
@ -166,7 +166,7 @@ jumps and branches.
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<code>SP</code>: Stack pointer: top of stack.
|
<code>SP</code>: Stack pointer: the highest address within the local stack frame.
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
@ -216,7 +216,7 @@ If a Go prototype does not name its result, the expected assembly name is <code>
|
|||||||
The <code>SP</code> pseudo-register is a virtual stack pointer
|
The <code>SP</code> pseudo-register is a virtual stack pointer
|
||||||
used to refer to frame-local variables and the arguments being
|
used to refer to frame-local variables and the arguments being
|
||||||
prepared for function calls.
|
prepared for function calls.
|
||||||
It points to the top of the local stack frame, so references should use negative offsets
|
It points to the highest address within the local stack frame, so references should use negative offsets
|
||||||
in the range [−framesize, 0):
|
in the range [−framesize, 0):
|
||||||
<code>x-8(SP)</code>, <code>y-4(SP)</code>, and so on.
|
<code>x-8(SP)</code>, <code>y-4(SP)</code>, and so on.
|
||||||
</p>
|
</p>
|
||||||
@ -409,7 +409,7 @@ The linker will choose one of the duplicates to use.
|
|||||||
(For <code>TEXT</code> items.)
|
(For <code>TEXT</code> items.)
|
||||||
Don't insert the preamble to check if the stack must be split.
|
Don't insert the preamble to check if the stack must be split.
|
||||||
The frame for the routine, plus anything it calls, must fit in the
|
The frame for the routine, plus anything it calls, must fit in the
|
||||||
spare space at the top of the stack segment.
|
spare space remaining in the current stack segment.
|
||||||
Used to protect routines such as the stack splitting code itself.
|
Used to protect routines such as the stack splitting code itself.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -460,7 +460,7 @@ Only valid on functions that declare a frame size of 0.
|
|||||||
<code>TOPFRAME</code> = 2048
|
<code>TOPFRAME</code> = 2048
|
||||||
<br>
|
<br>
|
||||||
(For <code>TEXT</code> items.)
|
(For <code>TEXT</code> items.)
|
||||||
Function is the top of the call stack. Traceback should stop at this function.
|
Function is the outermost frame of the call stack. Traceback should stop at this function.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
@ -14,13 +14,13 @@ Do not send CLs removing the interior tags from such phrases.
|
|||||||
main ul li { margin: 0.5em 0; }
|
main ul li { margin: 0.5em 0; }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.17</h2>
|
<h2 id="introduction">Introduction to Go 1.17</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>
|
The latest Go release, version 1.17, arrives six months after <a href="/doc/go1.16">Go 1.16</a>.
|
||||||
Go 1.17 is not yet released. These are work-in-progress
|
Most of its changes are in the implementation of the toolchain, runtime, and libraries.
|
||||||
release notes. Go 1.17 is expected to be released in August 2021.
|
As always, the release maintains the Go 1 <a href="/doc/go1compat">promise of compatibility</a>.
|
||||||
</strong>
|
We expect almost all Go programs to continue to compile and run as before.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="language">Changes to the language</h2>
|
<h2 id="language">Changes to the language</h2>
|
||||||
@ -134,35 +134,54 @@ Do not send CLs removing the interior tags from such phrases.
|
|||||||
|
|
||||||
<h3 id="go-command">Go command</h3>
|
<h3 id="go-command">Go command</h3>
|
||||||
|
|
||||||
<h4 id="lazy-loading">Lazy module loading</h4>
|
<a id="lazy-loading"><!-- for existing links only --></a>
|
||||||
|
<h4 id="graph-pruning">Pruned module graphs in <code>go 1.17</code> modules</h4>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/36460 -->
|
<p><!-- golang.org/issue/36460 -->
|
||||||
|
If a module specifies <code>go</code> <code>1.17</code> or higher, the module
|
||||||
|
graph includes only the <em>immediate</em> dependencies of
|
||||||
|
other <code>go</code> <code>1.17</code> modules, not their full transitive
|
||||||
|
dependencies. (See <a href="/ref/mod#graph-pruning">Module graph pruning</a>
|
||||||
|
for more detail.)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
For the <code>go</code> command to correctly resolve transitive imports using
|
||||||
|
the pruned module graph, the <code>go.mod</code> file for each module needs to
|
||||||
|
include more detail about the transitive dependencies relevant to that module.
|
||||||
If a module specifies <code>go</code> <code>1.17</code> or higher in its
|
If a module specifies <code>go</code> <code>1.17</code> or higher in its
|
||||||
<code>go.mod</code> file, its transitive requirements are now loaded lazily,
|
<code>go.mod</code> file, its <code>go.mod</code> file now contains an
|
||||||
avoiding the need to download or read <code>go.mod</code> files for
|
explicit <a href="/ref/mod#go-mod-file-require"><code>require</code>
|
||||||
otherwise-irrelevant dependencies. To support lazy loading, in Go 1.17 modules
|
directive</a> for every module that provides a transitively-imported package.
|
||||||
the <code>go</code> command maintains <em>explicit</em> requirements in
|
(In previous versions, the <code>go.mod</code> file typically only included
|
||||||
the <code>go.mod</code> file for every dependency that provides any package
|
explicit requirements for <em>directly</em>-imported packages.)
|
||||||
transitively imported by any package or test within the module.
|
<p>
|
||||||
See <a href="https://golang.org/design/36460-lazy-module-loading">the design
|
|
||||||
document</a> for more detail.
|
<p>
|
||||||
<!-- TODO(bcmills): replace the design-doc link with proper documentation. -->
|
Since the expanded <code>go.mod</code> file needed for module graph pruning
|
||||||
|
includes all of the dependencies needed to load the imports of any package in
|
||||||
|
the main module, if the main module specifies
|
||||||
|
<code>go</code> <code>1.17</code> or higher the <code>go</code> tool no longer
|
||||||
|
reads (or even downloads) <code>go.mod</code> files for dependencies if they
|
||||||
|
are not needed in order to complete the requested command.
|
||||||
|
(See <a href="/ref/mod#lazy-loading">Lazy loading</a>.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/45965 -->
|
<p><!-- golang.org/issue/45965 -->
|
||||||
Because the number of additional explicit requirements in the go.mod file may
|
Because the number of explicit requirements may be substantially larger in an
|
||||||
be substantial, in a Go 1.17 module the newly-added requirements
|
expanded Go 1.17 <code>go.mod</code> file, the newly-added requirements
|
||||||
on <em>indirect</em> dependencies are maintained in a
|
on <em>indirect</em> dependencies in a <code>go</code> <code>1.17</code>
|
||||||
separate <code>require</code> block from the block containing direct
|
module are maintained in a separate <code>require</code> block from the block
|
||||||
dependencies.
|
containing direct dependencies.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/45094 -->
|
<p><!-- golang.org/issue/45094 -->
|
||||||
To facilitate the upgrade to lazy loading, the
|
To facilitate the upgrade to Go 1.17 pruned module graphs, the
|
||||||
<code>go</code> <code>mod</code> <code>tidy</code> subcommand now supports
|
<a href="/ref/mod#go-mod-tidy"><code>go</code> <code>mod</code> <code>tidy</code></a>
|
||||||
a <code>-go</code> flag to set or change the <code>go</code> version in
|
subcommand now supports a <code>-go</code> flag to set or change
|
||||||
the <code>go.mod</code> file. To enable lazy loading for an existing module
|
the <code>go</code> version in the <code>go.mod</code> file. To convert
|
||||||
without changing the selected versions of its dependencies, run:
|
the <code>go.mod</code> file for an existing module to Go 1.17 without
|
||||||
|
changing the selected versions of its dependencies, run:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -199,10 +218,10 @@ Do not send CLs removing the interior tags from such phrases.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/46366 -->
|
<p><!-- golang.org/issue/46366 -->
|
||||||
The <code>go</code> <code>mod</code> <code>graph</code> subcommand also
|
The <a href="/ref/mod#go-mod-graph"><code>go</code> <code>mod</code> <code>graph</code></a>
|
||||||
supports the <code>-go</code> flag, which causes it to report the graph as
|
subcommand also supports the <code>-go</code> flag, which causes it to report
|
||||||
seen by the indicated Go version, showing dependencies that may otherwise be
|
the graph as seen by the indicated Go version, showing dependencies that may
|
||||||
pruned out by lazy loading.
|
otherwise be pruned out.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4 id="module-deprecation-comments">Module deprecation comments</h4>
|
<h4 id="module-deprecation-comments">Module deprecation comments</h4>
|
||||||
@ -270,7 +289,8 @@ Do not send CLs removing the interior tags from such phrases.
|
|||||||
|
|
||||||
<p><!-- golang.org/issue/36876 -->
|
<p><!-- golang.org/issue/36876 -->
|
||||||
If the main module specifies <code>go</code> <code>1.17</code> or higher,
|
If the main module specifies <code>go</code> <code>1.17</code> or higher,
|
||||||
<code>go</code> <code>mod</code> <code>vendor</code> now annotates
|
<a href="/ref/mod#go-mod-vendor"><code>go</code> <code>mod</code> <code>vendor</code></a>
|
||||||
|
now annotates
|
||||||
<code>vendor/modules.txt</code> with the <code>go</code> version indicated by
|
<code>vendor/modules.txt</code> with the <code>go</code> version indicated by
|
||||||
each vendored module in its own <code>go.mod</code> file. The annotated
|
each vendored module in its own <code>go.mod</code> file. The annotated
|
||||||
version is used when building the module's packages from vendored source code.
|
version is used when building the module's packages from vendored source code.
|
||||||
@ -468,6 +488,15 @@ func Foo() bool {
|
|||||||
and compare functions by code pointer.
|
and compare functions by code pointer.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3 id="link">Linker</h3>
|
||||||
|
|
||||||
|
<p><!-- CL 310349 -->
|
||||||
|
When the linker uses external linking mode, which is the default
|
||||||
|
when linking a program that uses cgo, and the linker is invoked
|
||||||
|
with a <code>-I</code> option, the option will now be passed to the
|
||||||
|
external linker as a <code>-Wl,--dynamic-linker</code> option.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="library">Core library</h2>
|
<h2 id="library">Core library</h2>
|
||||||
|
|
||||||
<h3 id="runtime/cgo"><a href="/pkg/runtime/cgo">Cgo</a></h3>
|
<h3 id="runtime/cgo"><a href="/pkg/runtime/cgo">Cgo</a></h3>
|
||||||
|
@ -4329,6 +4329,7 @@ a <a href="#Run_time_panics">run-time panic</a> occurs.
|
|||||||
<pre>
|
<pre>
|
||||||
s := make([]byte, 2, 4)
|
s := make([]byte, 2, 4)
|
||||||
s0 := (*[0]byte)(s) // s0 != nil
|
s0 := (*[0]byte)(s) // s0 != nil
|
||||||
|
s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1]
|
||||||
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
|
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
|
||||||
s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
|
s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ func TestMSAN(t *testing.T) {
|
|||||||
{src: "msan5.go"},
|
{src: "msan5.go"},
|
||||||
{src: "msan6.go"},
|
{src: "msan6.go"},
|
||||||
{src: "msan7.go"},
|
{src: "msan7.go"},
|
||||||
|
{src: "msan8.go"},
|
||||||
{src: "msan_fail.go", wantErr: true},
|
{src: "msan_fail.go", wantErr: true},
|
||||||
}
|
}
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
|
109
misc/cgo/testsanitizers/testdata/msan8.go
vendored
Normal file
109
misc/cgo/testsanitizers/testdata/msan8.go
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
// Copyright 2021 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
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <sanitizer/msan_interface.h>
|
||||||
|
|
||||||
|
// cgoTracebackArg is the type of the argument passed to msanGoTraceback.
|
||||||
|
struct cgoTracebackArg {
|
||||||
|
uintptr_t context;
|
||||||
|
uintptr_t sigContext;
|
||||||
|
uintptr_t* buf;
|
||||||
|
uintptr_t max;
|
||||||
|
};
|
||||||
|
|
||||||
|
// msanGoTraceback is registered as the cgo traceback function.
|
||||||
|
// This will be called when a signal occurs.
|
||||||
|
void msanGoTraceback(void* parg) {
|
||||||
|
struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg);
|
||||||
|
arg->buf[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// msanGoWait will be called with all registers undefined as far as
|
||||||
|
// msan is concerned. It just waits for a signal.
|
||||||
|
// Because the registers are msan-undefined, the signal handler will
|
||||||
|
// be invoked with all registers msan-undefined.
|
||||||
|
__attribute__((noinline))
|
||||||
|
void msanGoWait(unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4, unsigned long a5, unsigned long a6) {
|
||||||
|
sigset_t mask;
|
||||||
|
|
||||||
|
sigemptyset(&mask);
|
||||||
|
sigsuspend(&mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
// msanGoSignalThread is the thread ID of the msanGoLoop thread.
|
||||||
|
static pthread_t msanGoSignalThread;
|
||||||
|
|
||||||
|
// msanGoSignalThreadSet is used to record that msanGoSignalThread
|
||||||
|
// has been initialized. This is accessed atomically.
|
||||||
|
static int32_t msanGoSignalThreadSet;
|
||||||
|
|
||||||
|
// uninit is explicitly poisoned, so that we can make all registers
|
||||||
|
// undefined by calling msanGoWait.
|
||||||
|
static unsigned long uninit;
|
||||||
|
|
||||||
|
// msanGoLoop loops calling msanGoWait, with the arguments passed
|
||||||
|
// such that msan thinks that they are undefined. msan permits
|
||||||
|
// undefined values to be used as long as they are not used to
|
||||||
|
// for conditionals or for memory access.
|
||||||
|
void msanGoLoop() {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
msanGoSignalThread = pthread_self();
|
||||||
|
__atomic_store_n(&msanGoSignalThreadSet, 1, __ATOMIC_SEQ_CST);
|
||||||
|
|
||||||
|
// Force uninit to be undefined for msan.
|
||||||
|
__msan_poison(&uninit, sizeof uninit);
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
msanGoWait(uninit, uninit, uninit, uninit, uninit, uninit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// msanGoReady returns whether msanGoSignalThread is set.
|
||||||
|
int msanGoReady() {
|
||||||
|
return __atomic_load_n(&msanGoSignalThreadSet, __ATOMIC_SEQ_CST) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// msanGoSendSignal sends a signal to the msanGoLoop thread.
|
||||||
|
void msanGoSendSignal() {
|
||||||
|
pthread_kill(msanGoSignalThread, SIGWINCH);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
runtime.SetCgoTraceback(0, C.msanGoTraceback, nil, nil)
|
||||||
|
|
||||||
|
c := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
defer func() { c <- true }()
|
||||||
|
C.msanGoLoop()
|
||||||
|
}()
|
||||||
|
|
||||||
|
for C.msanGoReady() == 0 {
|
||||||
|
time.Sleep(time.Microsecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-c:
|
||||||
|
break loop
|
||||||
|
default:
|
||||||
|
C.msanGoSendSignal()
|
||||||
|
time.Sleep(time.Microsecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
src/cmd/dist/build.go
vendored
7
src/cmd/dist/build.go
vendored
@ -1263,14 +1263,19 @@ func cmdbootstrap() {
|
|||||||
timelog("start", "dist bootstrap")
|
timelog("start", "dist bootstrap")
|
||||||
defer timelog("end", "dist bootstrap")
|
defer timelog("end", "dist bootstrap")
|
||||||
|
|
||||||
var noBanner bool
|
var noBanner, noClean bool
|
||||||
var debug bool
|
var debug bool
|
||||||
flag.BoolVar(&rebuildall, "a", rebuildall, "rebuild all")
|
flag.BoolVar(&rebuildall, "a", rebuildall, "rebuild all")
|
||||||
flag.BoolVar(&debug, "d", debug, "enable debugging of bootstrap process")
|
flag.BoolVar(&debug, "d", debug, "enable debugging of bootstrap process")
|
||||||
flag.BoolVar(&noBanner, "no-banner", noBanner, "do not print banner")
|
flag.BoolVar(&noBanner, "no-banner", noBanner, "do not print banner")
|
||||||
|
flag.BoolVar(&noClean, "no-clean", noClean, "print deprecation warning")
|
||||||
|
|
||||||
xflagparse(0)
|
xflagparse(0)
|
||||||
|
|
||||||
|
if noClean {
|
||||||
|
xprintf("warning: --no-clean is deprecated and has no effect; use 'go install std cmd' instead\n")
|
||||||
|
}
|
||||||
|
|
||||||
// Set GOPATH to an internal directory. We shouldn't actually
|
// Set GOPATH to an internal directory. We shouldn't actually
|
||||||
// need to store files here, since the toolchain won't
|
// need to store files here, since the toolchain won't
|
||||||
// depend on modules outside of vendor directories, but if
|
// depend on modules outside of vendor directories, but if
|
||||||
|
@ -1078,7 +1078,7 @@
|
|||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
//
|
//
|
||||||
// go mod edit [editing flags] [go.mod]
|
// go mod edit [editing flags] [-fmt|-print|-json] [go.mod]
|
||||||
//
|
//
|
||||||
// Edit provides a command-line interface for editing go.mod,
|
// Edit provides a command-line interface for editing go.mod,
|
||||||
// for use primarily by tools or scripts. It reads only go.mod;
|
// for use primarily by tools or scripts. It reads only go.mod;
|
||||||
@ -1204,7 +1204,7 @@
|
|||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
//
|
//
|
||||||
// go mod init [module]
|
// go mod init [module-path]
|
||||||
//
|
//
|
||||||
// Init initializes and writes a new go.mod file in the current directory, in
|
// Init initializes and writes a new go.mod file in the current directory, in
|
||||||
// effect creating a new module rooted at the current directory. The go.mod file
|
// effect creating a new module rooted at the current directory. The go.mod file
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var cmdEdit = &base.Command{
|
var cmdEdit = &base.Command{
|
||||||
UsageLine: "go mod edit [editing flags] [go.mod]",
|
UsageLine: "go mod edit [editing flags] [-fmt|-print|-json] [go.mod]",
|
||||||
Short: "edit go.mod from tools or scripts",
|
Short: "edit go.mod from tools or scripts",
|
||||||
Long: `
|
Long: `
|
||||||
Edit provides a command-line interface for editing go.mod,
|
Edit provides a command-line interface for editing go.mod,
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var cmdInit = &base.Command{
|
var cmdInit = &base.Command{
|
||||||
UsageLine: "go mod init [module]",
|
UsageLine: "go mod init [module-path]",
|
||||||
Short: "initialize new module in current directory",
|
Short: "initialize new module in current directory",
|
||||||
Long: `
|
Long: `
|
||||||
Init initializes and writes a new go.mod file in the current directory, in
|
Init initializes and writes a new go.mod file in the current directory, in
|
||||||
|
@ -864,22 +864,25 @@ func (r *codeRepo) GoMod(version string) (data []byte, err error) {
|
|||||||
data, err = r.code.ReadFile(rev, path.Join(dir, "go.mod"), codehost.MaxGoMod)
|
data, err = r.code.ReadFile(rev, path.Join(dir, "go.mod"), codehost.MaxGoMod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return r.legacyGoMod(rev, dir), nil
|
return LegacyGoMod(r.modPath), nil
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *codeRepo) legacyGoMod(rev, dir string) []byte {
|
// LegacyGoMod generates a fake go.mod file for a module that doesn't have one.
|
||||||
// We used to try to build a go.mod reflecting pre-existing
|
// The go.mod file contains a module directive and nothing else: no go version,
|
||||||
// package management metadata files, but the conversion
|
// no requirements.
|
||||||
// was inherently imperfect (because those files don't have
|
//
|
||||||
// exactly the same semantics as go.mod) and, when done
|
// We used to try to build a go.mod reflecting pre-existing
|
||||||
// for dependencies in the middle of a build, impossible to
|
// package management metadata files, but the conversion
|
||||||
// correct. So we stopped.
|
// was inherently imperfect (because those files don't have
|
||||||
// Return a fake go.mod that simply declares the module path.
|
// exactly the same semantics as go.mod) and, when done
|
||||||
return []byte(fmt.Sprintf("module %s\n", modfile.AutoQuote(r.modPath)))
|
// for dependencies in the middle of a build, impossible to
|
||||||
|
// correct. So we stopped.
|
||||||
|
func LegacyGoMod(modPath string) []byte {
|
||||||
|
return []byte(fmt.Sprintf("module %s\n", modfile.AutoQuote(modPath)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *codeRepo) modPrefix(rev string) string {
|
func (r *codeRepo) modPrefix(rev string) string {
|
||||||
|
@ -191,6 +191,19 @@ func (rs *Requirements) rootSelected(path string) (version string, ok bool) {
|
|||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hasRedundantRoot returns true if the root list contains multiple requirements
|
||||||
|
// of the same module or a requirement on any version of the main module.
|
||||||
|
// Redundant requirements should be pruned, but they may influence version
|
||||||
|
// selection.
|
||||||
|
func (rs *Requirements) hasRedundantRoot() bool {
|
||||||
|
for i, m := range rs.rootModules {
|
||||||
|
if m.Path == Target.Path || (i > 0 && m.Path == rs.rootModules[i-1].Path) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Graph returns the graph of module requirements loaded from the current
|
// Graph returns the graph of module requirements loaded from the current
|
||||||
// root modules (as reported by RootModules).
|
// root modules (as reported by RootModules).
|
||||||
//
|
//
|
||||||
@ -882,6 +895,12 @@ func updateLazyRoots(ctx context.Context, direct map[string]bool, rs *Requiremen
|
|||||||
// and (trivially) version.
|
// and (trivially) version.
|
||||||
|
|
||||||
if !rootsUpgraded {
|
if !rootsUpgraded {
|
||||||
|
if cfg.BuildMod != "mod" {
|
||||||
|
// The only changes to the root set (if any) were to remove duplicates.
|
||||||
|
// The requirements are consistent (if perhaps redundant), so keep the
|
||||||
|
// original rs to preserve its ModuleGraph.
|
||||||
|
return rs, nil
|
||||||
|
}
|
||||||
// The root set has converged: every root going into this iteration was
|
// The root set has converged: every root going into this iteration was
|
||||||
// already at its selected version, although we have have removed other
|
// already at its selected version, although we have have removed other
|
||||||
// (redundant) roots for the same path.
|
// (redundant) roots for the same path.
|
||||||
|
@ -449,13 +449,22 @@ func loadModFile(ctx context.Context) (rs *Requirements, needCommit bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setDefaultBuildMod() // possibly enable automatic vendoring
|
setDefaultBuildMod() // possibly enable automatic vendoring
|
||||||
rs = requirementsFromModFile(ctx)
|
rs = requirementsFromModFile()
|
||||||
|
|
||||||
if cfg.BuildMod == "vendor" {
|
if cfg.BuildMod == "vendor" {
|
||||||
readVendorList()
|
readVendorList()
|
||||||
checkVendorConsistency()
|
checkVendorConsistency()
|
||||||
rs.initVendor(vendorList)
|
rs.initVendor(vendorList)
|
||||||
}
|
}
|
||||||
|
if rs.hasRedundantRoot() {
|
||||||
|
// If any module path appears more than once in the roots, we know that the
|
||||||
|
// go.mod file needs to be updated even though we have not yet loaded any
|
||||||
|
// transitive dependencies.
|
||||||
|
rs, err = updateRoots(ctx, rs.direct, rs, nil, nil, false)
|
||||||
|
if err != nil {
|
||||||
|
base.Fatalf("go: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if index.goVersionV == "" {
|
if index.goVersionV == "" {
|
||||||
// TODO(#45551): Do something more principled instead of checking
|
// TODO(#45551): Do something more principled instead of checking
|
||||||
// cfg.CmdName directly here.
|
// cfg.CmdName directly here.
|
||||||
@ -530,7 +539,12 @@ func CreateModFile(ctx context.Context, modPath string) {
|
|||||||
base.Fatalf("go: %v", err)
|
base.Fatalf("go: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
commitRequirements(ctx, modFileGoVersion(), requirementsFromModFile(ctx))
|
rs := requirementsFromModFile()
|
||||||
|
rs, err = updateRoots(ctx, rs.direct, rs, nil, nil, false)
|
||||||
|
if err != nil {
|
||||||
|
base.Fatalf("go: %v", err)
|
||||||
|
}
|
||||||
|
commitRequirements(ctx, modFileGoVersion(), rs)
|
||||||
|
|
||||||
// Suggest running 'go mod tidy' unless the project is empty. Even if we
|
// Suggest running 'go mod tidy' unless the project is empty. Even if we
|
||||||
// imported all the correct requirements above, we're probably missing
|
// imported all the correct requirements above, we're probably missing
|
||||||
@ -641,9 +655,8 @@ func initTarget(m module.Version) {
|
|||||||
|
|
||||||
// requirementsFromModFile returns the set of non-excluded requirements from
|
// requirementsFromModFile returns the set of non-excluded requirements from
|
||||||
// the global modFile.
|
// the global modFile.
|
||||||
func requirementsFromModFile(ctx context.Context) *Requirements {
|
func requirementsFromModFile() *Requirements {
|
||||||
roots := make([]module.Version, 0, len(modFile.Require))
|
roots := make([]module.Version, 0, len(modFile.Require))
|
||||||
mPathCount := map[string]int{Target.Path: 1}
|
|
||||||
direct := map[string]bool{}
|
direct := map[string]bool{}
|
||||||
for _, r := range modFile.Require {
|
for _, r := range modFile.Require {
|
||||||
if index != nil && index.exclude[r.Mod] {
|
if index != nil && index.exclude[r.Mod] {
|
||||||
@ -656,28 +669,12 @@ func requirementsFromModFile(ctx context.Context) *Requirements {
|
|||||||
}
|
}
|
||||||
|
|
||||||
roots = append(roots, r.Mod)
|
roots = append(roots, r.Mod)
|
||||||
mPathCount[r.Mod.Path]++
|
|
||||||
if !r.Indirect {
|
if !r.Indirect {
|
||||||
direct[r.Mod.Path] = true
|
direct[r.Mod.Path] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
module.Sort(roots)
|
module.Sort(roots)
|
||||||
rs := newRequirements(modDepthFromGoVersion(modFileGoVersion()), roots, direct)
|
rs := newRequirements(modDepthFromGoVersion(modFileGoVersion()), roots, direct)
|
||||||
|
|
||||||
// If any module path appears more than once in the roots, we know that the
|
|
||||||
// go.mod file needs to be updated even though we have not yet loaded any
|
|
||||||
// transitive dependencies.
|
|
||||||
for _, n := range mPathCount {
|
|
||||||
if n > 1 {
|
|
||||||
var err error
|
|
||||||
rs, err = updateRoots(ctx, rs.direct, rs, nil, nil, false)
|
|
||||||
if err != nil {
|
|
||||||
base.Fatalf("go: %v", err)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs
|
return rs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,47 +595,14 @@ func rawGoModSummary(m module.Version) (*modFileSummary, error) {
|
|||||||
}
|
}
|
||||||
c := rawGoModSummaryCache.Do(m, func() interface{} {
|
c := rawGoModSummaryCache.Do(m, func() interface{} {
|
||||||
summary := new(modFileSummary)
|
summary := new(modFileSummary)
|
||||||
var f *modfile.File
|
name, data, err := rawGoModData(m)
|
||||||
if m.Version == "" {
|
|
||||||
// m is a replacement module with only a file path.
|
|
||||||
dir := m.Path
|
|
||||||
if !filepath.IsAbs(dir) {
|
|
||||||
dir = filepath.Join(ModRoot(), dir)
|
|
||||||
}
|
|
||||||
gomod := filepath.Join(dir, "go.mod")
|
|
||||||
var data []byte
|
|
||||||
var err error
|
|
||||||
if gomodActual, ok := fsys.OverlayPath(gomod); ok {
|
|
||||||
// Don't lock go.mod if it's part of the overlay.
|
|
||||||
// On Plan 9, locking requires chmod, and we don't want to modify any file
|
|
||||||
// in the overlay. See #44700.
|
|
||||||
data, err = os.ReadFile(gomodActual)
|
|
||||||
} else {
|
|
||||||
data, err = lockedfile.Read(gomodActual)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return cached{nil, module.VersionError(m, fmt.Errorf("reading %s: %v", base.ShortPath(gomod), err))}
|
|
||||||
}
|
|
||||||
f, err = modfile.ParseLax(gomod, data, nil)
|
|
||||||
if err != nil {
|
|
||||||
return cached{nil, module.VersionError(m, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err))}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if !semver.IsValid(m.Version) {
|
|
||||||
// Disallow the broader queries supported by fetch.Lookup.
|
|
||||||
base.Fatalf("go: internal error: %s@%s: unexpected invalid semantic version", m.Path, m.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
data, err := modfetch.GoMod(m.Path, m.Version)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cached{nil, err}
|
return cached{nil, err}
|
||||||
}
|
}
|
||||||
f, err = modfile.ParseLax("go.mod", data, nil)
|
f, err := modfile.ParseLax(name, data, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cached{nil, module.VersionError(m, fmt.Errorf("parsing go.mod: %v", err))}
|
return cached{nil, module.VersionError(m, fmt.Errorf("parsing %s: %v", base.ShortPath(name), err))}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if f.Module != nil {
|
if f.Module != nil {
|
||||||
summary.module = f.Module.Mod
|
summary.module = f.Module.Mod
|
||||||
summary.deprecated = f.Module.Deprecated
|
summary.deprecated = f.Module.Deprecated
|
||||||
@ -671,6 +638,43 @@ func rawGoModSummary(m module.Version) (*modFileSummary, error) {
|
|||||||
|
|
||||||
var rawGoModSummaryCache par.Cache // module.Version → rawGoModSummary result
|
var rawGoModSummaryCache par.Cache // module.Version → rawGoModSummary result
|
||||||
|
|
||||||
|
// rawGoModData returns the content of the go.mod file for module m, ignoring
|
||||||
|
// all replacements that may apply to m.
|
||||||
|
//
|
||||||
|
// rawGoModData cannot be used on the Target module.
|
||||||
|
//
|
||||||
|
// Unlike rawGoModSummary, rawGoModData does not cache its results in memory.
|
||||||
|
// Use rawGoModSummary instead unless you specifically need these bytes.
|
||||||
|
func rawGoModData(m module.Version) (name string, data []byte, err error) {
|
||||||
|
if m.Version == "" {
|
||||||
|
// m is a replacement module with only a file path.
|
||||||
|
dir := m.Path
|
||||||
|
if !filepath.IsAbs(dir) {
|
||||||
|
dir = filepath.Join(ModRoot(), dir)
|
||||||
|
}
|
||||||
|
name = filepath.Join(dir, "go.mod")
|
||||||
|
if gomodActual, ok := fsys.OverlayPath(name); ok {
|
||||||
|
// Don't lock go.mod if it's part of the overlay.
|
||||||
|
// On Plan 9, locking requires chmod, and we don't want to modify any file
|
||||||
|
// in the overlay. See #44700.
|
||||||
|
data, err = os.ReadFile(gomodActual)
|
||||||
|
} else {
|
||||||
|
data, err = lockedfile.Read(gomodActual)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, module.VersionError(m, fmt.Errorf("reading %s: %v", base.ShortPath(name), err))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if !semver.IsValid(m.Version) {
|
||||||
|
// Disallow the broader queries supported by fetch.Lookup.
|
||||||
|
base.Fatalf("go: internal error: %s@%s: unexpected invalid semantic version", m.Path, m.Version)
|
||||||
|
}
|
||||||
|
name = "go.mod"
|
||||||
|
data, err = modfetch.GoMod(m.Path, m.Version)
|
||||||
|
}
|
||||||
|
return name, data, err
|
||||||
|
}
|
||||||
|
|
||||||
// queryLatestVersionIgnoringRetractions looks up the latest version of the
|
// queryLatestVersionIgnoringRetractions looks up the latest version of the
|
||||||
// module with the given path without considering retracted or excluded
|
// module with the given path without considering retracted or excluded
|
||||||
// versions.
|
// versions.
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
package modload
|
package modload
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
pathpkg "path"
|
pathpkg "path"
|
||||||
"path/filepath"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -931,14 +931,32 @@ func moduleHasRootPackage(ctx context.Context, m module.Version) (bool, error) {
|
|||||||
return ok, err
|
return ok, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func versionHasGoMod(ctx context.Context, m module.Version) (bool, error) {
|
// versionHasGoMod returns whether a version has a go.mod file.
|
||||||
needSum := false
|
//
|
||||||
root, _, err := fetch(ctx, m, needSum)
|
// versionHasGoMod fetches the go.mod file (possibly a fake) and true if it
|
||||||
|
// contains anything other than a module directive with the same path. When a
|
||||||
|
// module does not have a real go.mod file, the go command acts as if it had one
|
||||||
|
// that only contained a module directive. Normal go.mod files created after
|
||||||
|
// 1.12 at least have a go directive.
|
||||||
|
//
|
||||||
|
// This function is a heuristic, since it's possible to commit a file that would
|
||||||
|
// pass this test. However, we only need a heurstic for determining whether
|
||||||
|
// +incompatible versions may be "latest", which is what this function is used
|
||||||
|
// for.
|
||||||
|
//
|
||||||
|
// This heuristic is useful for two reasons: first, when using a proxy,
|
||||||
|
// this lets us fetch from the .mod endpoint which is much faster than the .zip
|
||||||
|
// endpoint. The .mod file is used anyway, even if the .zip file contains a
|
||||||
|
// go.mod with different content. Second, if we don't fetch the .zip, then
|
||||||
|
// we don't need to verify it in go.sum. This makes 'go list -m -u' faster
|
||||||
|
// and simpler.
|
||||||
|
func versionHasGoMod(_ context.Context, m module.Version) (bool, error) {
|
||||||
|
_, data, err := rawGoModData(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
fi, err := os.Stat(filepath.Join(root, "go.mod"))
|
isFake := bytes.Equal(data, modfetch.LegacyGoMod(m.Path))
|
||||||
return err == nil && !fi.IsDir(), nil
|
return !isFake, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// A versionRepo is a subset of modfetch.Repo that can report information about
|
// A versionRepo is a subset of modfetch.Repo that can report information about
|
||||||
|
@ -2,18 +2,13 @@
|
|||||||
# 'go mod tidy' should not panic if the main module initially
|
# 'go mod tidy' should not panic if the main module initially
|
||||||
# requires an older version of itself.
|
# requires an older version of itself.
|
||||||
|
|
||||||
|
# A module may require an older version of itself without error. This is
|
||||||
|
# inconsistent (the required version is never selected), but we still get
|
||||||
|
# a reproducible build list.
|
||||||
|
go list -m all
|
||||||
|
stdout '^golang.org/issue/46078$'
|
||||||
|
|
||||||
# A module that explicitly requires an older version of itself should be
|
# 'go mod tidy' should fix this (and not crash).
|
||||||
# rejected as inconsistent: we enforce that every explicit requirement is the
|
|
||||||
# selected version of its module path, but the selected version of the main
|
|
||||||
# module is always itself — not some explicit version.
|
|
||||||
|
|
||||||
! go list -m all
|
|
||||||
stderr '^go: updates to go\.mod needed; to update it:\n\tgo mod tidy$'
|
|
||||||
|
|
||||||
|
|
||||||
# The suggested 'go mod tidy' command should succeed (not crash).
|
|
||||||
|
|
||||||
go mod tidy
|
go mod tidy
|
||||||
|
|
||||||
|
|
||||||
|
34
src/cmd/go/testdata/script/mod_update_sum_readonly.txt
vendored
Normal file
34
src/cmd/go/testdata/script/mod_update_sum_readonly.txt
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# When finding the latest version of a module, we should not download version
|
||||||
|
# contents. Previously, we downloaded .zip files to determine whether a real
|
||||||
|
# .mod file was present in order to decide whether +incompatible versions
|
||||||
|
# could be "latest".
|
||||||
|
#
|
||||||
|
# Verifies #47377.
|
||||||
|
|
||||||
|
# rsc.io/breaker has two versions, neither of which has a .mod file.
|
||||||
|
go list -m -versions rsc.io/breaker
|
||||||
|
stdout '^rsc.io/breaker v1.0.0 v2.0.0\+incompatible$'
|
||||||
|
go mod download rsc.io/breaker@v1.0.0
|
||||||
|
! grep '^go' $GOPATH/pkg/mod/cache/download/rsc.io/breaker/@v/v1.0.0.mod
|
||||||
|
go mod download rsc.io/breaker@v2.0.0+incompatible
|
||||||
|
! grep '^go' $GOPATH/pkg/mod/cache/download/rsc.io/breaker/@v/v2.0.0+incompatible.mod
|
||||||
|
|
||||||
|
# Delete downloaded .zip files.
|
||||||
|
go clean -modcache
|
||||||
|
|
||||||
|
# Check for updates.
|
||||||
|
go list -m -u rsc.io/breaker
|
||||||
|
stdout '^rsc.io/breaker v1.0.0 \[v2.0.0\+incompatible\]$'
|
||||||
|
|
||||||
|
# We should not have downloaded zips.
|
||||||
|
! exists $GOPATH/pkg/mod/cache/download/rsc.io/breaker/@v/v1.0.0.zip
|
||||||
|
! exists $GOPATH/pkg/mod/cache/download/rsc.io/breaker/@v/v2.0.0+incompatible.zip
|
||||||
|
|
||||||
|
-- go.mod --
|
||||||
|
module m
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require rsc.io/breaker v1.0.0
|
||||||
|
-- go.sum --
|
||||||
|
rsc.io/breaker v1.0.0/go.mod h1:s5yxDXvD88U1/ESC23I2FK3Lkv4YIKaB1ij/Hbm805g=
|
29
src/cmd/go/testdata/script/mod_vendor_redundant_requirement.txt
vendored
Normal file
29
src/cmd/go/testdata/script/mod_vendor_redundant_requirement.txt
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# 'go list -mod=vendor' should succeed even when go.mod contains redundant
|
||||||
|
# requirements. Verifies #47565.
|
||||||
|
go list -mod=vendor
|
||||||
|
|
||||||
|
-- go.mod --
|
||||||
|
module m
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
|
||||||
|
require example.com/m v0.0.0
|
||||||
|
require example.com/m v0.0.0
|
||||||
|
|
||||||
|
replace example.com/m v0.0.0 => ./m
|
||||||
|
-- m/go.mod --
|
||||||
|
module example.com/m
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
-- m/m.go --
|
||||||
|
package m
|
||||||
|
-- use.go --
|
||||||
|
package use
|
||||||
|
|
||||||
|
import _ "example.com/m"
|
||||||
|
-- vendor/example.com/m/m.go --
|
||||||
|
package m
|
||||||
|
-- vendor/modules.txt --
|
||||||
|
# example.com/m v0.0.0 => ./m
|
||||||
|
## explicit; go 1.17
|
||||||
|
example.com/m
|
@ -49,8 +49,8 @@ const (
|
|||||||
// Function can call reflect.Type.Method or reflect.Type.MethodByName.
|
// Function can call reflect.Type.Method or reflect.Type.MethodByName.
|
||||||
REFLECTMETHOD = 1024
|
REFLECTMETHOD = 1024
|
||||||
|
|
||||||
// Function is the top of the call stack. Call stack unwinders should stop
|
// Function is the outermost frame of the call stack. Call stack unwinders
|
||||||
// at this function.
|
// should stop at this function.
|
||||||
TOPFRAME = 2048
|
TOPFRAME = 2048
|
||||||
|
|
||||||
// Function is an ABI wrapper.
|
// Function is an ABI wrapper.
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
// Copyright 2012 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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
4
src/cmd/vet/testdata/copylock/copylock.go
vendored
4
src/cmd/vet/testdata/copylock/copylock.go
vendored
@ -1,3 +1,7 @@
|
|||||||
|
// Copyright 2018 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 copylock
|
package copylock
|
||||||
|
|
||||||
import "sync"
|
import "sync"
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
// Copyright 2018 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 httpresponse
|
package httpresponse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
4
src/cmd/vet/testdata/testingpkg/tests.go
vendored
4
src/cmd/vet/testdata/testingpkg/tests.go
vendored
@ -1 +1,5 @@
|
|||||||
|
// Copyright 2018 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 testdata
|
package testdata
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
// Copyright 2018 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 testdata
|
package testdata
|
||||||
|
|
||||||
func Example_BadSuffix() {} // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix"
|
func Example_BadSuffix() {} // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
|
// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build amd64 && gc && !purego
|
||||||
// +build amd64,gc,!purego
|
// +build amd64,gc,!purego
|
||||||
|
|
||||||
package field
|
package field
|
||||||
|
@ -322,6 +322,18 @@ func TestTypesInfo(t *testing.T) {
|
|||||||
`[][]struct{}`,
|
`[][]struct{}`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// issue 47243
|
||||||
|
{`package issue47243_a; var x int32; var _ = x << 3`, `3`, `untyped int`},
|
||||||
|
{`package issue47243_b; var x int32; var _ = x << 3.`, `3.`, `uint`}, // issue 47410: should be untyped float
|
||||||
|
{`package issue47243_c; var x int32; var _ = 1 << x`, `1 << x`, `int`},
|
||||||
|
{`package issue47243_d; var x int32; var _ = 1 << x`, `1`, `int`},
|
||||||
|
{`package issue47243_e; var x int32; var _ = 1 << 2`, `1`, `untyped int`},
|
||||||
|
{`package issue47243_f; var x int32; var _ = 1 << 2`, `2`, `untyped int`},
|
||||||
|
{`package issue47243_g; var x int32; var _ = int(1) << 2`, `2`, `untyped int`},
|
||||||
|
{`package issue47243_h; var x int32; var _ = 1 << (2 << x)`, `1`, `int`},
|
||||||
|
{`package issue47243_i; var x int32; var _ = 1 << (2 << x)`, `(2 << x)`, `untyped int`},
|
||||||
|
{`package issue47243_j; var x int32; var _ = 1 << (2 << x)`, `2`, `untyped int`},
|
||||||
|
|
||||||
// tests for broken code that doesn't parse or type-check
|
// tests for broken code that doesn't parse or type-check
|
||||||
{broken + `x0; func _() { var x struct {f string}; x.f := 0 }`, `x.f`, `string`},
|
{broken + `x0; func _() { var x struct {f string}; x.f := 0 }`, `x.f`, `string`},
|
||||||
{broken + `x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}`, `z`, `string`},
|
{broken + `x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}`, `z`, `string`},
|
||||||
|
@ -354,6 +354,13 @@ func TestIndexRepresentability(t *testing.T) {
|
|||||||
testFiles(t, &StdSizes{4, 4}, []string{"index.go"}, [][]byte{[]byte(src)}, false, nil)
|
testFiles(t, &StdSizes{4, 4}, []string{"index.go"}, [][]byte{[]byte(src)}, false, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue47243_TypedRHS(t *testing.T) {
|
||||||
|
// The RHS of the shift expression below overflows uint on 32bit platforms,
|
||||||
|
// but this is OK as it is explicitly typed.
|
||||||
|
const src = "package issue47243\n\nvar a uint64; var _ = a << uint64(4294967296)" // uint64(1<<32)
|
||||||
|
testFiles(t, &StdSizes{4, 4}, []string{"p.go"}, [][]byte{[]byte(src)}, false, nil)
|
||||||
|
}
|
||||||
|
|
||||||
func TestCheck(t *testing.T) { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", false) }
|
func TestCheck(t *testing.T) { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", false) }
|
||||||
func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", false) }
|
func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", false) }
|
||||||
func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", false) }
|
func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", false) }
|
||||||
|
@ -795,32 +795,48 @@ func (check *Checker) shift(x, y *operand, e ast.Expr, op token.Token) {
|
|||||||
// spec: "The right operand in a shift expression must have integer type
|
// spec: "The right operand in a shift expression must have integer type
|
||||||
// or be an untyped constant representable by a value of type uint."
|
// or be an untyped constant representable by a value of type uint."
|
||||||
|
|
||||||
// Provide a good error message for negative shift counts.
|
// Check that constants are representable by uint, but do not convert them
|
||||||
|
// (see also issue #47243).
|
||||||
if y.mode == constant_ {
|
if y.mode == constant_ {
|
||||||
|
// Provide a good error message for negative shift counts.
|
||||||
yval := constant.ToInt(y.val) // consider -1, 1.0, but not -1.1
|
yval := constant.ToInt(y.val) // consider -1, 1.0, but not -1.1
|
||||||
if yval.Kind() == constant.Int && constant.Sign(yval) < 0 {
|
if yval.Kind() == constant.Int && constant.Sign(yval) < 0 {
|
||||||
check.invalidOp(y, _InvalidShiftCount, "negative shift count %s", y)
|
check.invalidOp(y, _InvalidShiftCount, "negative shift count %s", y)
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isUntyped(y.typ) {
|
||||||
|
// Caution: Check for representability here, rather than in the switch
|
||||||
|
// below, because isInteger includes untyped integers (was bug #43697).
|
||||||
|
check.representable(y, Typ[Uint])
|
||||||
|
if y.mode == invalid {
|
||||||
|
x.mode = invalid
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Caution: Check for isUntyped first because isInteger includes untyped
|
// Check that RHS is otherwise at least of integer type.
|
||||||
// integers (was bug #43697).
|
switch {
|
||||||
if isUntyped(y.typ) {
|
case isInteger(y.typ):
|
||||||
|
if !isUnsigned(y.typ) && !check.allowVersion(check.pkg, 1, 13) {
|
||||||
|
check.invalidOp(y, _InvalidShiftCount, "signed shift count %s requires go1.13 or later", y)
|
||||||
|
x.mode = invalid
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case isUntyped(y.typ):
|
||||||
|
// This is incorrect, but preserves pre-existing behavior.
|
||||||
|
// See also bug #47410.
|
||||||
check.convertUntyped(y, Typ[Uint])
|
check.convertUntyped(y, Typ[Uint])
|
||||||
if y.mode == invalid {
|
if y.mode == invalid {
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if !isInteger(y.typ) {
|
default:
|
||||||
check.invalidOp(y, _InvalidShiftCount, "shift count %s must be integer", y)
|
check.invalidOp(y, _InvalidShiftCount, "shift count %s must be integer", y)
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
return
|
return
|
||||||
} else if !isUnsigned(y.typ) && !check.allowVersion(check.pkg, 1, 13) {
|
|
||||||
check.invalidOp(y, _InvalidShiftCount, "signed shift count %s requires go1.13 or later", y)
|
|
||||||
x.mode = invalid
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if x.mode == constant_ {
|
if x.mode == constant_ {
|
||||||
|
@ -86,7 +86,7 @@ type File interface {
|
|||||||
type DirEntry interface {
|
type DirEntry interface {
|
||||||
// Name returns the name of the file (or subdirectory) described by the entry.
|
// Name returns the name of the file (or subdirectory) described by the entry.
|
||||||
// This name is only the final element of the path (the base name), not the entire path.
|
// This name is only the final element of the path (the base name), not the entire path.
|
||||||
// For example, Name would return "hello.go" not "/home/gopher/hello.go".
|
// For example, Name would return "hello.go" not "home/gopher/hello.go".
|
||||||
Name() string
|
Name() string
|
||||||
|
|
||||||
// IsDir reports whether the entry describes a directory.
|
// IsDir reports whether the entry describes a directory.
|
||||||
|
@ -130,8 +130,8 @@ if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then
|
|||||||
export CGO_ENABLED=0
|
export CGO_ENABLED=0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Test which linker/loader our system is using
|
# Test which linker/loader our system is using, if GO_LDSO is not set.
|
||||||
if type readelf >/dev/null 2>&1; then
|
if [ -z "$GO_LDSO" ] && type readelf >/dev/null 2>&1; then
|
||||||
if echo "int main() { return 0; }" | ${CC:-cc} -o ./test-musl-ldso -x c - >/dev/null 2>&1; then
|
if echo "int main() { return 0; }" | ${CC:-cc} -o ./test-musl-ldso -x c - >/dev/null 2>&1; then
|
||||||
LDSO=$(readelf -l ./test-musl-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/') >/dev/null 2>&1
|
LDSO=$(readelf -l ./test-musl-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/') >/dev/null 2>&1
|
||||||
[ -z "$LDSO" ] || export GO_LDSO="$LDSO"
|
[ -z "$LDSO" ] || export GO_LDSO="$LDSO"
|
||||||
@ -203,16 +203,10 @@ if [ "$1" = "--dist-tool" ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
buildall="-a"
|
|
||||||
if [ "$1" = "--no-clean" ]; then
|
|
||||||
buildall=""
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run dist bootstrap to complete make.bash.
|
# Run dist bootstrap to complete make.bash.
|
||||||
# Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
# Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
||||||
# Throw ours, built with Go 1.4, away after bootstrap.
|
# Throw ours, built with Go 1.4, away after bootstrap.
|
||||||
./cmd/dist/dist bootstrap $buildall $vflag $GO_DISTFLAGS "$@"
|
./cmd/dist/dist bootstrap -a $vflag $GO_DISTFLAGS "$@"
|
||||||
rm -f ./cmd/dist/dist
|
rm -f ./cmd/dist/dist
|
||||||
|
|
||||||
# DO NOT ADD ANY NEW CODE HERE.
|
# DO NOT ADD ANY NEW CODE HERE.
|
||||||
|
20
src/make.bat
20
src/make.bat
@ -112,20 +112,20 @@ if x%2==x--dist-tool goto copydist
|
|||||||
if x%3==x--dist-tool goto copydist
|
if x%3==x--dist-tool goto copydist
|
||||||
if x%4==x--dist-tool goto copydist
|
if x%4==x--dist-tool goto copydist
|
||||||
|
|
||||||
set buildall=-a
|
set bootstrapflags=
|
||||||
if x%1==x--no-clean set buildall=
|
if x%1==x--no-clean set bootstrapflags=--no-clean
|
||||||
if x%2==x--no-clean set buildall=
|
if x%2==x--no-clean set bootstrapflags=--no-clean
|
||||||
if x%3==x--no-clean set buildall=
|
if x%3==x--no-clean set bootstrapflags=--no-clean
|
||||||
if x%4==x--no-clean set buildall=
|
if x%4==x--no-clean set bootstrapflags=--no-clean
|
||||||
if x%1==x--no-banner set buildall=%buildall% --no-banner
|
if x%1==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner
|
||||||
if x%2==x--no-banner set buildall=%buildall% --no-banner
|
if x%2==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner
|
||||||
if x%3==x--no-banner set buildall=%buildall% --no-banner
|
if x%3==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner
|
||||||
if x%4==x--no-banner set buildall=%buildall% --no-banner
|
if x%4==x--no-banner set bootstrapflags=%bootstrapflags% --no-banner
|
||||||
|
|
||||||
:: Run dist bootstrap to complete make.bash.
|
:: Run dist bootstrap to complete make.bash.
|
||||||
:: Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
:: Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
||||||
:: Throw ours, built with Go 1.4, away after bootstrap.
|
:: Throw ours, built with Go 1.4, away after bootstrap.
|
||||||
.\cmd\dist\dist.exe bootstrap %vflag% %buildall%
|
.\cmd\dist\dist.exe bootstrap -a %vflag% %bootstrapflags%
|
||||||
if errorlevel 1 goto fail
|
if errorlevel 1 goto fail
|
||||||
del .\cmd\dist\dist.exe
|
del .\cmd\dist\dist.exe
|
||||||
goto end
|
goto end
|
||||||
|
@ -92,15 +92,10 @@ if(~ $1 --dist-tool){
|
|||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
buildall = -a
|
|
||||||
if(~ $1 --no-clean) {
|
|
||||||
buildall = ()
|
|
||||||
shift
|
|
||||||
}
|
|
||||||
# Run dist bootstrap to complete make.bash.
|
# Run dist bootstrap to complete make.bash.
|
||||||
# Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
# Bootstrap installs a proper cmd/dist, built with the new toolchain.
|
||||||
# Throw ours, built with Go 1.4, away after bootstrap.
|
# Throw ours, built with Go 1.4, away after bootstrap.
|
||||||
./cmd/dist/dist bootstrap $vflag $buildall $*
|
./cmd/dist/dist bootstrap -a $vflag $*
|
||||||
rm -f ./cmd/dist/dist
|
rm -f ./cmd/dist/dist
|
||||||
|
|
||||||
# DO NOT ADD ANY NEW CODE HERE.
|
# DO NOT ADD ANY NEW CODE HERE.
|
||||||
|
@ -235,6 +235,15 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|||||||
if req.ContentLength == 0 {
|
if req.ContentLength == 0 {
|
||||||
outreq.Body = nil // Issue 16036: nil Body for http.Transport retries
|
outreq.Body = nil // Issue 16036: nil Body for http.Transport retries
|
||||||
}
|
}
|
||||||
|
if outreq.Body != nil {
|
||||||
|
// Reading from the request body after returning from a handler is not
|
||||||
|
// allowed, and the RoundTrip goroutine that reads the Body can outlive
|
||||||
|
// this handler. This can lead to a crash if the handler panics (see
|
||||||
|
// Issue 46866). Although calling Close doesn't guarantee there isn't
|
||||||
|
// any Read in flight after the handle returns, in practice it's safe to
|
||||||
|
// read after closing it.
|
||||||
|
defer outreq.Body.Close()
|
||||||
|
}
|
||||||
if outreq.Header == nil {
|
if outreq.Header == nil {
|
||||||
outreq.Header = make(http.Header) // Issue 33142: historical behavior was to always allocate
|
outreq.Header = make(http.Header) // Issue 33142: historical behavior was to always allocate
|
||||||
}
|
}
|
||||||
|
@ -1122,6 +1122,45 @@ func TestReverseProxy_PanicBodyError(t *testing.T) {
|
|||||||
rproxy.ServeHTTP(httptest.NewRecorder(), req)
|
rproxy.ServeHTTP(httptest.NewRecorder(), req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue #46866: panic without closing incoming request body causes a panic
|
||||||
|
func TestReverseProxy_PanicClosesIncomingBody(t *testing.T) {
|
||||||
|
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
out := "this call was relayed by the reverse proxy"
|
||||||
|
// Coerce a wrong content length to induce io.ErrUnexpectedEOF
|
||||||
|
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(out)*2))
|
||||||
|
fmt.Fprintln(w, out)
|
||||||
|
}))
|
||||||
|
defer backend.Close()
|
||||||
|
backendURL, err := url.Parse(backend.URL)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
proxyHandler := NewSingleHostReverseProxy(backendURL)
|
||||||
|
proxyHandler.ErrorLog = log.New(io.Discard, "", 0) // quiet for tests
|
||||||
|
frontend := httptest.NewServer(proxyHandler)
|
||||||
|
defer frontend.Close()
|
||||||
|
frontendClient := frontend.Client()
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for j := 0; j < 10; j++ {
|
||||||
|
const reqLen = 6 * 1024 * 1024
|
||||||
|
req, _ := http.NewRequest("POST", frontend.URL, &io.LimitedReader{R: neverEnding('x'), N: reqLen})
|
||||||
|
req.ContentLength = reqLen
|
||||||
|
resp, _ := frontendClient.Transport.RoundTrip(req)
|
||||||
|
if resp != nil {
|
||||||
|
io.Copy(io.Discard, resp.Body)
|
||||||
|
resp.Body.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
func TestSelectFlushInterval(t *testing.T) {
|
func TestSelectFlushInterval(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -6441,10 +6441,11 @@ func TestErrorWriteLoopRace(t *testing.T) {
|
|||||||
// Test that a new request which uses the connection of an active request
|
// Test that a new request which uses the connection of an active request
|
||||||
// cannot cause it to be canceled as well.
|
// cannot cause it to be canceled as well.
|
||||||
func TestCancelRequestWhenSharingConnection(t *testing.T) {
|
func TestCancelRequestWhenSharingConnection(t *testing.T) {
|
||||||
if testing.Short() {
|
reqc := make(chan chan struct{}, 2)
|
||||||
t.Skip("skipping in short mode")
|
|
||||||
}
|
|
||||||
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, req *Request) {
|
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, req *Request) {
|
||||||
|
ch := make(chan struct{}, 1)
|
||||||
|
reqc <- ch
|
||||||
|
<-ch
|
||||||
w.Header().Add("Content-Length", "0")
|
w.Header().Add("Content-Length", "0")
|
||||||
}))
|
}))
|
||||||
defer ts.Close()
|
defer ts.Close()
|
||||||
@ -6456,34 +6457,58 @@ func TestCancelRequestWhenSharingConnection(t *testing.T) {
|
|||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
putidlec := make(chan chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
for ctx.Err() == nil {
|
ctx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
|
||||||
reqctx, reqcancel := context.WithCancel(ctx)
|
PutIdleConn: func(error) {
|
||||||
go reqcancel()
|
// Signal that the idle conn has been returned to the pool,
|
||||||
req, _ := NewRequestWithContext(reqctx, "GET", ts.URL, nil)
|
// and wait for the order to proceed.
|
||||||
|
ch := make(chan struct{})
|
||||||
|
putidlec <- ch
|
||||||
|
<-ch
|
||||||
|
},
|
||||||
|
})
|
||||||
|
req, _ := NewRequestWithContext(ctx, "GET", ts.URL, nil)
|
||||||
res, err := client.Do(req)
|
res, err := client.Do(req)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
res.Body.Close()
|
res.Body.Close()
|
||||||
}
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("request 1: got err %v, want nil", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
|
||||||
|
|
||||||
for ctx.Err() == nil {
|
// Wait for the first request to receive a response and return the
|
||||||
req, _ := NewRequest("GET", ts.URL, nil)
|
// connection to the idle pool.
|
||||||
if res, err := client.Do(req); err != nil {
|
r1c := <-reqc
|
||||||
t.Errorf("unexpected: %p %v", req, err)
|
close(r1c)
|
||||||
break
|
idlec := <-putidlec
|
||||||
} else {
|
|
||||||
|
wg.Add(1)
|
||||||
|
cancelctx, cancel := context.WithCancel(context.Background())
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
req, _ := NewRequestWithContext(cancelctx, "GET", ts.URL, nil)
|
||||||
|
res, err := client.Do(req)
|
||||||
|
if err == nil {
|
||||||
res.Body.Close()
|
res.Body.Close()
|
||||||
}
|
}
|
||||||
|
if !errors.Is(err, context.Canceled) {
|
||||||
|
t.Errorf("request 2: got err %v, want Canceled", err)
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Wait for the second request to arrive at the server, and then cancel
|
||||||
|
// the request context.
|
||||||
|
r2c := <-reqc
|
||||||
cancel()
|
cancel()
|
||||||
|
|
||||||
|
// Give the cancelation a moment to take effect, and then unblock the first request.
|
||||||
|
time.Sleep(1 * time.Millisecond)
|
||||||
|
close(idlec)
|
||||||
|
|
||||||
|
close(r2c)
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
@ -312,9 +312,6 @@ func TestLookPath(t *testing.T) {
|
|||||||
// Run all tests.
|
// Run all tests.
|
||||||
for i, test := range lookPathTests {
|
for i, test := range lookPathTests {
|
||||||
t.Run(fmt.Sprint(i), func(t *testing.T) {
|
t.Run(fmt.Sprint(i), func(t *testing.T) {
|
||||||
if i == 16 {
|
|
||||||
t.Skip("golang.org/issue/44379")
|
|
||||||
}
|
|
||||||
dir := filepath.Join(tmp, "d"+strconv.Itoa(i))
|
dir := filepath.Join(tmp, "d"+strconv.Itoa(i))
|
||||||
err := os.Mkdir(dir, 0700)
|
err := os.Mkdir(dir, 0700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -7,6 +7,14 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "libcgo.h"
|
#include "libcgo.h"
|
||||||
|
|
||||||
|
#ifndef __has_feature
|
||||||
|
#define __has_feature(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(memory_sanitizer)
|
||||||
|
#include <sanitizer/msan_interface.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// Call the user's traceback function and then call sigtramp.
|
// Call the user's traceback function and then call sigtramp.
|
||||||
// The runtime signal handler will jump to this code.
|
// The runtime signal handler will jump to this code.
|
||||||
// We do it this way so that the user's traceback function will be called
|
// We do it this way so that the user's traceback function will be called
|
||||||
@ -19,6 +27,18 @@ x_cgo_callers(uintptr_t sig, void *info, void *context, void (*cgoTraceback)(str
|
|||||||
arg.SigContext = (uintptr_t)(context);
|
arg.SigContext = (uintptr_t)(context);
|
||||||
arg.Buf = cgoCallers;
|
arg.Buf = cgoCallers;
|
||||||
arg.Max = 32; // must match len(runtime.cgoCallers)
|
arg.Max = 32; // must match len(runtime.cgoCallers)
|
||||||
|
|
||||||
|
#if __has_feature(memory_sanitizer)
|
||||||
|
// This function is called directly from the signal handler.
|
||||||
|
// The arguments are passed in registers, so whether msan
|
||||||
|
// considers cgoCallers to be initialized depends on whether
|
||||||
|
// it considers the appropriate register to be initialized.
|
||||||
|
// That can cause false reports in rare cases.
|
||||||
|
// Explicitly unpoison the memory to avoid that.
|
||||||
|
// See issue #47543 for more details.
|
||||||
|
__msan_unpoison(&arg, sizeof arg);
|
||||||
|
#endif
|
||||||
|
|
||||||
(*cgoTraceback)(&arg);
|
(*cgoTraceback)(&arg);
|
||||||
sigtramp(sig, info, context);
|
sigtramp(sig, info, context);
|
||||||
}
|
}
|
||||||
|
@ -213,6 +213,8 @@ func cgocallbackg(fn, frame unsafe.Pointer, ctxt uintptr) {
|
|||||||
// a different M. The call to unlockOSThread is in unwindm.
|
// a different M. The call to unlockOSThread is in unwindm.
|
||||||
lockOSThread()
|
lockOSThread()
|
||||||
|
|
||||||
|
checkm := gp.m
|
||||||
|
|
||||||
// Save current syscall parameters, so m.syscall can be
|
// Save current syscall parameters, so m.syscall can be
|
||||||
// used again if callback decide to make syscall.
|
// used again if callback decide to make syscall.
|
||||||
syscall := gp.m.syscall
|
syscall := gp.m.syscall
|
||||||
@ -228,15 +230,20 @@ func cgocallbackg(fn, frame unsafe.Pointer, ctxt uintptr) {
|
|||||||
|
|
||||||
osPreemptExtExit(gp.m)
|
osPreemptExtExit(gp.m)
|
||||||
|
|
||||||
cgocallbackg1(fn, frame, ctxt)
|
cgocallbackg1(fn, frame, ctxt) // will call unlockOSThread
|
||||||
|
|
||||||
// At this point unlockOSThread has been called.
|
// At this point unlockOSThread has been called.
|
||||||
// The following code must not change to a different m.
|
// The following code must not change to a different m.
|
||||||
// This is enforced by checking incgo in the schedule function.
|
// This is enforced by checking incgo in the schedule function.
|
||||||
|
|
||||||
|
gp.m.incgo = true
|
||||||
|
|
||||||
|
if gp.m != checkm {
|
||||||
|
throw("m changed unexpectedly in cgocallbackg")
|
||||||
|
}
|
||||||
|
|
||||||
osPreemptExtEnter(gp.m)
|
osPreemptExtEnter(gp.m)
|
||||||
|
|
||||||
gp.m.incgo = true
|
|
||||||
// going back to cgo call
|
// going back to cgo call
|
||||||
reentersyscall(savedpc, uintptr(savedsp))
|
reentersyscall(savedpc, uintptr(savedsp))
|
||||||
|
|
||||||
@ -245,6 +252,11 @@ func cgocallbackg(fn, frame unsafe.Pointer, ctxt uintptr) {
|
|||||||
|
|
||||||
func cgocallbackg1(fn, frame unsafe.Pointer, ctxt uintptr) {
|
func cgocallbackg1(fn, frame unsafe.Pointer, ctxt uintptr) {
|
||||||
gp := getg()
|
gp := getg()
|
||||||
|
|
||||||
|
// When we return, undo the call to lockOSThread in cgocallbackg.
|
||||||
|
// We must still stay on the same m.
|
||||||
|
defer unlockOSThread()
|
||||||
|
|
||||||
if gp.m.needextram || atomic.Load(&extraMWaiters) > 0 {
|
if gp.m.needextram || atomic.Load(&extraMWaiters) > 0 {
|
||||||
gp.m.needextram = false
|
gp.m.needextram = false
|
||||||
systemstack(newextram)
|
systemstack(newextram)
|
||||||
@ -324,10 +336,6 @@ func unwindm(restore *bool) {
|
|||||||
|
|
||||||
releasem(mp)
|
releasem(mp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undo the call to lockOSThread in cgocallbackg.
|
|
||||||
// We must still stay on the same m.
|
|
||||||
unlockOSThread()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from assembly
|
// called from assembly
|
||||||
|
@ -7,6 +7,11 @@ package runtime
|
|||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) {
|
func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) {
|
||||||
|
// nil pointer is always suitably aligned (#47430).
|
||||||
|
if p == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Check that (*[n]elem)(p) is appropriately aligned.
|
// Check that (*[n]elem)(p) is appropriately aligned.
|
||||||
// Note that we allow unaligned pointers if the types they point to contain
|
// Note that we allow unaligned pointers if the types they point to contain
|
||||||
// no pointers themselves. See issue 37298.
|
// no pointers themselves. See issue 37298.
|
||||||
@ -29,10 +34,12 @@ func checkptrStraddles(ptr unsafe.Pointer, size uintptr) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
end := add(ptr, size-1)
|
// Check that add(ptr, size-1) won't overflow. This avoids the risk
|
||||||
if uintptr(end) < uintptr(ptr) {
|
// of producing an illegal pointer value (assuming ptr is legal).
|
||||||
|
if uintptr(ptr) >= -(size - 1) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
end := add(ptr, size-1)
|
||||||
|
|
||||||
// TODO(mdempsky): Detect when [ptr, end] contains Go allocations,
|
// TODO(mdempsky): Detect when [ptr, end] contains Go allocations,
|
||||||
// but neither ptr nor end point into one themselves.
|
// but neither ptr nor end point into one themselves.
|
||||||
|
@ -26,6 +26,7 @@ func TestCheckPtr(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{"CheckPtrAlignmentPtr", "fatal error: checkptr: misaligned pointer conversion\n"},
|
{"CheckPtrAlignmentPtr", "fatal error: checkptr: misaligned pointer conversion\n"},
|
||||||
{"CheckPtrAlignmentNoPtr", ""},
|
{"CheckPtrAlignmentNoPtr", ""},
|
||||||
|
{"CheckPtrAlignmentNilPtr", ""},
|
||||||
{"CheckPtrArithmetic", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"},
|
{"CheckPtrArithmetic", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"},
|
||||||
{"CheckPtrArithmetic2", "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"},
|
{"CheckPtrSize", "fatal error: checkptr: converted pointer straddles multiple allocations\n"},
|
||||||
|
@ -282,6 +282,15 @@ func TestCgoTracebackContext(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCgoTracebackContextPreemption(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
got := runTestProg(t, "testprogcgo", "TracebackContextPreemption")
|
||||||
|
want := "OK\n"
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("expected %q got %v", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testCgoPprof(t *testing.T, buildArg, runArg, top, bottom string) {
|
func testCgoPprof(t *testing.T, buildArg, runArg, top, bottom string) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
if runtime.GOOS != "linux" || (runtime.GOARCH != "amd64" && runtime.GOARCH != "ppc64le") {
|
if runtime.GOOS != "linux" || (runtime.GOARCH != "amd64" && runtime.GOARCH != "ppc64le") {
|
||||||
|
@ -466,6 +466,10 @@ okarg:
|
|||||||
// Without the KeepAlive call, the finalizer could run at the start of
|
// Without the KeepAlive call, the finalizer could run at the start of
|
||||||
// syscall.Read, closing the file descriptor before syscall.Read makes
|
// syscall.Read, closing the file descriptor before syscall.Read makes
|
||||||
// the actual system call.
|
// the actual system call.
|
||||||
|
//
|
||||||
|
// Note: KeepAlive should only be used to prevent finalizers from
|
||||||
|
// running prematurely. In particular, when used with unsafe.Pointer,
|
||||||
|
// the rules for valid uses of unsafe.Pointer still apply.
|
||||||
func KeepAlive(x interface{}) {
|
func KeepAlive(x interface{}) {
|
||||||
// Introduce a use of x that the compiler can't eliminate.
|
// Introduce a use of x that the compiler can't eliminate.
|
||||||
// This makes sure x is alive on entry. We need x to be alive
|
// This makes sure x is alive on entry. We need x to be alive
|
||||||
|
@ -4850,7 +4850,6 @@ func (pp *p) destroy() {
|
|||||||
moveTimers(plocal, pp.timers)
|
moveTimers(plocal, pp.timers)
|
||||||
pp.timers = nil
|
pp.timers = nil
|
||||||
pp.numTimers = 0
|
pp.numTimers = 0
|
||||||
pp.adjustTimers = 0
|
|
||||||
pp.deletedTimers = 0
|
pp.deletedTimers = 0
|
||||||
atomic.Store64(&pp.timer0When, 0)
|
atomic.Store64(&pp.timer0When, 0)
|
||||||
unlock(&pp.timersLock)
|
unlock(&pp.timersLock)
|
||||||
|
@ -344,7 +344,7 @@ func racereadrangepc1(addr, size, pc uintptr)
|
|||||||
func racewriterangepc1(addr, size, pc uintptr)
|
func racewriterangepc1(addr, size, pc uintptr)
|
||||||
func racecallbackthunk(uintptr)
|
func racecallbackthunk(uintptr)
|
||||||
|
|
||||||
// racecall allows calling an arbitrary function f from C race runtime
|
// racecall allows calling an arbitrary function fn from C race runtime
|
||||||
// with up to 4 uintptr arguments.
|
// with up to 4 uintptr arguments.
|
||||||
func racecall(fn *byte, arg0, arg1, arg2, arg3 uintptr)
|
func racecall(fn *byte, arg0, arg1, arg2, arg3 uintptr)
|
||||||
|
|
||||||
|
@ -727,12 +727,6 @@ type p struct {
|
|||||||
// Modified using atomic instructions.
|
// Modified using atomic instructions.
|
||||||
numTimers uint32
|
numTimers uint32
|
||||||
|
|
||||||
// Number of timerModifiedEarlier timers on P's heap.
|
|
||||||
// This should only be modified while holding timersLock,
|
|
||||||
// or while the timer status is in a transient state
|
|
||||||
// such as timerModifying.
|
|
||||||
adjustTimers uint32
|
|
||||||
|
|
||||||
// Number of timerDeleted timers in P's heap.
|
// Number of timerDeleted timers in P's heap.
|
||||||
// Modified using atomic instructions.
|
// Modified using atomic instructions.
|
||||||
deletedTimers uint32
|
deletedTimers uint32
|
||||||
|
@ -184,6 +184,17 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 {
|
|||||||
return _EXCEPTION_CONTINUE_SEARCH
|
return _EXCEPTION_CONTINUE_SEARCH
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VEH is called before SEH, but arm64 MSVC DLLs use SEH to trap
|
||||||
|
// illegal instructions during runtime initialization to determine
|
||||||
|
// CPU features, so if we make it to the last handler and we're
|
||||||
|
// arm64 and it's an illegal instruction and this is coming from
|
||||||
|
// non-Go code, then assume it's this runtime probing happen, and
|
||||||
|
// pass that onward to SEH.
|
||||||
|
if GOARCH == "arm64" && info.exceptioncode == _EXCEPTION_ILLEGAL_INSTRUCTION &&
|
||||||
|
(r.ip() < firstmoduledata.text || firstmoduledata.etext < r.ip()) {
|
||||||
|
return _EXCEPTION_CONTINUE_SEARCH
|
||||||
|
}
|
||||||
|
|
||||||
winthrow(info, r, gp)
|
winthrow(info, r, gp)
|
||||||
return 0 // not reached
|
return 0 // not reached
|
||||||
}
|
}
|
||||||
|
36
src/runtime/testdata/testprog/checkptr.go
vendored
36
src/runtime/testdata/testprog/checkptr.go
vendored
@ -4,11 +4,16 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime"
|
||||||
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr)
|
register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr)
|
||||||
register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr)
|
register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr)
|
||||||
|
register("CheckPtrAlignmentNilPtr", CheckPtrAlignmentNilPtr)
|
||||||
register("CheckPtrArithmetic", CheckPtrArithmetic)
|
register("CheckPtrArithmetic", CheckPtrArithmetic)
|
||||||
register("CheckPtrArithmetic2", CheckPtrArithmetic2)
|
register("CheckPtrArithmetic2", CheckPtrArithmetic2)
|
||||||
register("CheckPtrSize", CheckPtrSize)
|
register("CheckPtrSize", CheckPtrSize)
|
||||||
@ -29,6 +34,35 @@ func CheckPtrAlignmentPtr() {
|
|||||||
sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
|
sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckPtrAlignmentNilPtr tests that checkptrAlignment doesn't crash
|
||||||
|
// on nil pointers (#47430).
|
||||||
|
func CheckPtrAlignmentNilPtr() {
|
||||||
|
var do func(int)
|
||||||
|
do = func(n int) {
|
||||||
|
// Inflate the stack so runtime.shrinkstack gets called during GC
|
||||||
|
if n > 0 {
|
||||||
|
do(n - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
var p unsafe.Pointer
|
||||||
|
_ = (*int)(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
runtime.GC()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for i := 0; ; i++ {
|
||||||
|
do(i % 1024)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
func CheckPtrArithmetic() {
|
func CheckPtrArithmetic() {
|
||||||
var x int
|
var x int
|
||||||
i := uintptr(unsafe.Pointer(&x))
|
i := uintptr(unsafe.Pointer(&x))
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// The __attribute__((weak)) used below doesn't seem to work on Windows.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
// Test the context argument to SetCgoTraceback.
|
// Test the context argument to SetCgoTraceback.
|
||||||
@ -14,20 +12,24 @@ package main
|
|||||||
extern void C1(void);
|
extern void C1(void);
|
||||||
extern void C2(void);
|
extern void C2(void);
|
||||||
extern void tcContext(void*);
|
extern void tcContext(void*);
|
||||||
|
extern void tcContextSimple(void*);
|
||||||
extern void tcTraceback(void*);
|
extern void tcTraceback(void*);
|
||||||
extern void tcSymbolizer(void*);
|
extern void tcSymbolizer(void*);
|
||||||
extern int getContextCount(void);
|
extern int getContextCount(void);
|
||||||
|
extern void TracebackContextPreemptionCallGo(int);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sync"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
register("TracebackContext", TracebackContext)
|
register("TracebackContext", TracebackContext)
|
||||||
|
register("TracebackContextPreemption", TracebackContextPreemption)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tracebackOK bool
|
var tracebackOK bool
|
||||||
@ -105,3 +107,30 @@ wantLoop:
|
|||||||
tracebackOK = false
|
tracebackOK = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue 47441.
|
||||||
|
func TracebackContextPreemption() {
|
||||||
|
runtime.SetCgoTraceback(0, unsafe.Pointer(C.tcTraceback), unsafe.Pointer(C.tcContextSimple), unsafe.Pointer(C.tcSymbolizer))
|
||||||
|
|
||||||
|
const funcs = 10
|
||||||
|
const calls = 1e5
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for i := 0; i < funcs; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(i int) {
|
||||||
|
defer wg.Done()
|
||||||
|
for j := 0; j < calls; j++ {
|
||||||
|
C.TracebackContextPreemptionCallGo(C.int(i*calls + j))
|
||||||
|
}
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
fmt.Println("OK")
|
||||||
|
}
|
||||||
|
|
||||||
|
//export TracebackContextPreemptionGoFunction
|
||||||
|
func TracebackContextPreemptionGoFunction(i C.int) {
|
||||||
|
// Do some busy work.
|
||||||
|
fmt.Sprintf("%d\n", i)
|
||||||
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
// Functions exported from Go.
|
// Functions exported from Go.
|
||||||
extern void G1(void);
|
extern void G1(void);
|
||||||
extern void G2(void);
|
extern void G2(void);
|
||||||
|
extern void TracebackContextPreemptionGoFunction(int);
|
||||||
|
|
||||||
void C1() {
|
void C1() {
|
||||||
G1();
|
G1();
|
||||||
@ -62,10 +63,17 @@ void tcContext(void* parg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tcContextSimple(void* parg) {
|
||||||
|
struct cgoContextArg* arg = (struct cgoContextArg*)(parg);
|
||||||
|
if (arg->context == 0) {
|
||||||
|
arg->context = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tcTraceback(void* parg) {
|
void tcTraceback(void* parg) {
|
||||||
int base, i;
|
int base, i;
|
||||||
struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg);
|
struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg);
|
||||||
if (arg->context == 0) {
|
if (arg->context == 0 && arg->sigContext == 0) {
|
||||||
// This shouldn't happen in this program.
|
// This shouldn't happen in this program.
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
@ -89,3 +97,7 @@ void tcSymbolizer(void *parg) {
|
|||||||
arg->func = "cFunction";
|
arg->func = "cFunction";
|
||||||
arg->lineno = arg->pc + (arg->more << 16);
|
arg->lineno = arg->pc + (arg->more << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TracebackContextPreemptionCallGo(int i) {
|
||||||
|
TracebackContextPreemptionGoFunction(i);
|
||||||
|
}
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
#define NOFRAME 512
|
#define NOFRAME 512
|
||||||
// Function can call reflect.Type.Method or reflect.Type.MethodByName.
|
// Function can call reflect.Type.Method or reflect.Type.MethodByName.
|
||||||
#define REFLECTMETHOD 1024
|
#define REFLECTMETHOD 1024
|
||||||
// Function is the top of the call stack. Call stack unwinders should stop
|
// Function is the outermost frame of the call stack. Call stack unwinders
|
||||||
// at this function.
|
// should stop at this function.
|
||||||
#define TOPFRAME 2048
|
#define TOPFRAME 2048
|
||||||
// Function is an ABI wrapper.
|
// Function is an ABI wrapper.
|
||||||
#define ABIWRAPPER 4096
|
#define ABIWRAPPER 4096
|
||||||
|
@ -334,7 +334,6 @@ func deltimer(t *timer) bool {
|
|||||||
// Must fetch t.pp before setting status
|
// Must fetch t.pp before setting status
|
||||||
// to timerDeleted.
|
// to timerDeleted.
|
||||||
tpp := t.pp.ptr()
|
tpp := t.pp.ptr()
|
||||||
atomic.Xadd(&tpp.adjustTimers, -1)
|
|
||||||
if !atomic.Cas(&t.status, timerModifying, timerDeleted) {
|
if !atomic.Cas(&t.status, timerModifying, timerDeleted) {
|
||||||
badTimer()
|
badTimer()
|
||||||
}
|
}
|
||||||
@ -511,20 +510,9 @@ loop:
|
|||||||
|
|
||||||
tpp := t.pp.ptr()
|
tpp := t.pp.ptr()
|
||||||
|
|
||||||
// Update the adjustTimers field. Subtract one if we
|
|
||||||
// are removing a timerModifiedEarlier, add one if we
|
|
||||||
// are adding a timerModifiedEarlier.
|
|
||||||
adjust := int32(0)
|
|
||||||
if status == timerModifiedEarlier {
|
|
||||||
adjust--
|
|
||||||
}
|
|
||||||
if newStatus == timerModifiedEarlier {
|
if newStatus == timerModifiedEarlier {
|
||||||
adjust++
|
|
||||||
updateTimerModifiedEarliest(tpp, when)
|
updateTimerModifiedEarliest(tpp, when)
|
||||||
}
|
}
|
||||||
if adjust != 0 {
|
|
||||||
atomic.Xadd(&tpp.adjustTimers, adjust)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the new status of the timer.
|
// Set the new status of the timer.
|
||||||
if !atomic.Cas(&t.status, timerModifying, newStatus) {
|
if !atomic.Cas(&t.status, timerModifying, newStatus) {
|
||||||
@ -592,9 +580,6 @@ func cleantimers(pp *p) {
|
|||||||
// Move t to the right position.
|
// Move t to the right position.
|
||||||
dodeltimer0(pp)
|
dodeltimer0(pp)
|
||||||
doaddtimer(pp, t)
|
doaddtimer(pp, t)
|
||||||
if s == timerModifiedEarlier {
|
|
||||||
atomic.Xadd(&pp.adjustTimers, -1)
|
|
||||||
}
|
|
||||||
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
||||||
badTimer()
|
badTimer()
|
||||||
}
|
}
|
||||||
@ -665,20 +650,13 @@ func moveTimers(pp *p, timers []*timer) {
|
|||||||
// it also moves timers that have been modified to run later,
|
// it also moves timers that have been modified to run later,
|
||||||
// and removes deleted timers. The caller must have locked the timers for pp.
|
// and removes deleted timers. The caller must have locked the timers for pp.
|
||||||
func adjusttimers(pp *p, now int64) {
|
func adjusttimers(pp *p, now int64) {
|
||||||
if atomic.Load(&pp.adjustTimers) == 0 {
|
|
||||||
if verifyTimers {
|
|
||||||
verifyTimerHeap(pp)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we haven't yet reached the time of the first timerModifiedEarlier
|
// If we haven't yet reached the time of the first timerModifiedEarlier
|
||||||
// timer, don't do anything. This speeds up programs that adjust
|
// timer, don't do anything. This speeds up programs that adjust
|
||||||
// a lot of timers back and forth if the timers rarely expire.
|
// a lot of timers back and forth if the timers rarely expire.
|
||||||
// We'll postpone looking through all the adjusted timers until
|
// We'll postpone looking through all the adjusted timers until
|
||||||
// one would actually expire.
|
// one would actually expire.
|
||||||
if first := atomic.Load64(&pp.timerModifiedEarliest); first != 0 {
|
first := atomic.Load64(&pp.timerModifiedEarliest)
|
||||||
if int64(first) > now {
|
if first == 0 || int64(first) > now {
|
||||||
if verifyTimers {
|
if verifyTimers {
|
||||||
verifyTimerHeap(pp)
|
verifyTimerHeap(pp)
|
||||||
}
|
}
|
||||||
@ -687,10 +665,8 @@ func adjusttimers(pp *p, now int64) {
|
|||||||
|
|
||||||
// We are going to clear all timerModifiedEarlier timers.
|
// We are going to clear all timerModifiedEarlier timers.
|
||||||
atomic.Store64(&pp.timerModifiedEarliest, 0)
|
atomic.Store64(&pp.timerModifiedEarliest, 0)
|
||||||
}
|
|
||||||
|
|
||||||
var moved []*timer
|
var moved []*timer
|
||||||
loop:
|
|
||||||
for i := 0; i < len(pp.timers); i++ {
|
for i := 0; i < len(pp.timers); i++ {
|
||||||
t := pp.timers[i]
|
t := pp.timers[i]
|
||||||
if t.pp.ptr() != pp {
|
if t.pp.ptr() != pp {
|
||||||
@ -717,11 +693,6 @@ loop:
|
|||||||
// loop to skip some other timer.
|
// loop to skip some other timer.
|
||||||
dodeltimer(pp, i)
|
dodeltimer(pp, i)
|
||||||
moved = append(moved, t)
|
moved = append(moved, t)
|
||||||
if s == timerModifiedEarlier {
|
|
||||||
if n := atomic.Xadd(&pp.adjustTimers, -1); int32(n) <= 0 {
|
|
||||||
break loop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Look at this heap position again.
|
// Look at this heap position again.
|
||||||
i--
|
i--
|
||||||
}
|
}
|
||||||
@ -820,9 +791,6 @@ func runtimer(pp *p, now int64) int64 {
|
|||||||
t.when = t.nextwhen
|
t.when = t.nextwhen
|
||||||
dodeltimer0(pp)
|
dodeltimer0(pp)
|
||||||
doaddtimer(pp, t)
|
doaddtimer(pp, t)
|
||||||
if s == timerModifiedEarlier {
|
|
||||||
atomic.Xadd(&pp.adjustTimers, -1)
|
|
||||||
}
|
|
||||||
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
||||||
badTimer()
|
badTimer()
|
||||||
}
|
}
|
||||||
@ -917,7 +885,6 @@ func clearDeletedTimers(pp *p) {
|
|||||||
atomic.Store64(&pp.timerModifiedEarliest, 0)
|
atomic.Store64(&pp.timerModifiedEarliest, 0)
|
||||||
|
|
||||||
cdel := int32(0)
|
cdel := int32(0)
|
||||||
cearlier := int32(0)
|
|
||||||
to := 0
|
to := 0
|
||||||
changedHeap := false
|
changedHeap := false
|
||||||
timers := pp.timers
|
timers := pp.timers
|
||||||
@ -942,9 +909,6 @@ nextTimer:
|
|||||||
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
if !atomic.Cas(&t.status, timerMoving, timerWaiting) {
|
||||||
badTimer()
|
badTimer()
|
||||||
}
|
}
|
||||||
if s == timerModifiedEarlier {
|
|
||||||
cearlier++
|
|
||||||
}
|
|
||||||
continue nextTimer
|
continue nextTimer
|
||||||
}
|
}
|
||||||
case timerDeleted:
|
case timerDeleted:
|
||||||
@ -981,7 +945,6 @@ nextTimer:
|
|||||||
|
|
||||||
atomic.Xadd(&pp.deletedTimers, -cdel)
|
atomic.Xadd(&pp.deletedTimers, -cdel)
|
||||||
atomic.Xadd(&pp.numTimers, -cdel)
|
atomic.Xadd(&pp.numTimers, -cdel)
|
||||||
atomic.Xadd(&pp.adjustTimers, -cearlier)
|
|
||||||
|
|
||||||
timers = timers[:to]
|
timers = timers[:to]
|
||||||
pp.timers = timers
|
pp.timers = timers
|
||||||
|
@ -680,7 +680,11 @@ type T struct {
|
|||||||
|
|
||||||
func (c *common) private() {}
|
func (c *common) private() {}
|
||||||
|
|
||||||
// Name returns the name of the running test or benchmark.
|
// Name returns the name of the running (sub-) test or benchmark.
|
||||||
|
//
|
||||||
|
// The name will include the name of the test along with the names of
|
||||||
|
// any nested sub-tests. If two sibling sub-tests have the same name,
|
||||||
|
// Name will append a suffix to guarantee the returned name is unique.
|
||||||
func (c *common) Name() string {
|
func (c *common) Name() string {
|
||||||
return c.name
|
return c.name
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user