From 395d36a67df8d25b35617ec8709f0164ae2f655e Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sun, 16 Oct 2016 23:40:12 -0700 Subject: [PATCH] cmd/compile: inline convI2E It's pretty simple. For: e = (interface{})(i) Do: tmp = i.itab if tmp != nil { tmp = tmp.typ_ // load type from itab } e = eface{tmp, i.data} It is smaller and faster than calling the runtime. Change-Id: I0ad27f62f4ec0b6cd53bc8530e4da0eae3e67a6c Reviewed-on: https://go-review.googlesource.com/31260 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/builtin.go | 153 +++++++++--------- .../compile/internal/gc/builtin/runtime.go | 1 - src/cmd/compile/internal/gc/walk.go | 34 +++- src/runtime/iface.go | 10 -- 4 files changed, 106 insertions(+), 92 deletions(-) diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index 824f1db642..ddf8a247d5 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -26,83 +26,82 @@ const runtimeimport = "" + "ne\x00\x03\x17\x0f@|S\x00 \x00\x01\x11|S\x00\t\x13decoderune\x00\x03 \x00\x02\x00\x04|S\rr" + "etv·1\x00\x00\x02\rretk·2\x00\x00\t\x11slicecopy\x00\x06:\tto·2\x00" + "\x00:\tfr·3\x00\x00\x16\vwid·4\x00\x1bunsafe-uintptr\x01\x02\x00\t\x1ds" + - "licestringcopy\x00\x04:X\x00\x00:Z\x00\x00\x01\x02\x00\t\rconvI2E\x00\x02:\r" + - "elem·2\x00\x00\x02:\vret·1\x00\x00\t\rconvI2I\x00\x04\x17\"\x06\x00\x00:\rel" + - "em·3\x00\x00\x02:f\x00\x00\t\rconvT2E\x00\x04\x17\"\x06\x00\x00\x17:j\x00\x00\x02:f\x00\x00\t\r" + - "convT2I\x00\x04\x17\"\vtab·2\x00\x00\x17:j\x00\x00\x02:f\x00\x00\t\x11assertE2" + - "E\x00\x06\x17\"\vtyp·1\x00\x00:\x0fiface·2\x00\x00\x17:\vret·3\x00\x00\x00\t\x13" + - "assertE2E2\x00\x06\x17\"\x06\x00\x00:\x0fiface·3\x00\x00\x17:\vret·4\x00\x00" + - "\x01\x00\x00\t\x11assertE2I\x00\x06\x17\"t\x00\x00:v\x00\x00\x17:x\x00\x00\x00\t\x13assertE" + - "2I2\x00\x06\x17\"\x06\x00\x00:||\x00\x00\x17:~\x00\x00\x01\x00\x00\t\x11assertE2T\x00\x06\x17\"t\x00" + - "\x00:v\x00\x00\x17:x\x00\x00\x00\t\x13assertE2T2\x00\x06\x17\"\x06\x00\x00:||\x00\x00\x17:~\x00\x00" + - "\x01\x00\x00\t\x11assertI2E\x00\x06\x17\"t\x00\x00:v\x00\x00\x17:x\x00\x00\x00\t\x13assertI" + - "2E2\x00\x06\x17\"\x06\x00\x00:||\x00\x00\x17:~\x00\x00\x01\x00\x00\t\x11assertI2I\x00\x06\x17\"t\x00" + - "\x00:v\x00\x00\x17:x\x00\x00\x00\t\x13assertI2I2\x00\x06\x17\"\x06\x00\x00:||\x00\x00\x17:~\x00\x00" + - "\x01\x00\x00\t\x11assertI2T\x00\x06\x17\"t\x00\x00:v\x00\x00\x17:x\x00\x00\x00\t\x13assertI" + - "2T2\x00\x06\x17\"\x06\x00\x00:||\x00\x00\x17:~\x00\x00\x01\x00\x00\t\x17panicdottype\x00\x06\x17" + - "\"\rhave·1\x00\x00\x17\"\rwant·2\x00\x00\x17\"||\x00\x00\x00\t\rifaceeq\x00" + - "\x04:\ti1·2\x00\x00:\ti2·3\x00\x00\x02\x00f\x00\x00\t\refaceeq\x00\x04:\x9c\x01\x00\x00" + - ":\x9e\x01\x00\x00\x02\x00f\x00\x00\t\rmakemap\x00\b\x17\"\x13mapType·2\x00\x00\n\rhi" + - "nt·3\x00\x00\x17:\x11mapbuf·4\x00\x00\x17:\x17bucketbuf·5\x00\x00\x02\x1d" + - "::\rhmap·1\x00\x00\t\x13mapaccess1\x00\x06\x17\"\xa4\x01\x00\x00\x1d::\rhmap" + - "·3\x00\x00\x17:\vkey·4\x00\x00\x02\x17:\vval·1\x00\x00\t!mapaccess1" + - "_fast32\x00\x06\x17\"\xa4\x01\x00\x00\x1d::\xb0\x01\x00\x00:\xb2\x01\x00\x00\x02\x17:\xb4\x01\x00\x00\t!mapa" + - "ccess1_fast64\x00\x06\x17\"\xa4\x01\x00\x00\x1d::\xb0\x01\x00\x00:\xb2\x01\x00\x00\x02\x17:\xb4\x01\x00\x00" + - "\t#mapaccess1_faststr\x00\x06\x17\"\xa4\x01\x00\x00\x1d::\xb0\x01\x00\x00:\xb2\x01\x00\x00" + - "\x02\x17:\xb4\x01\x00\x00\t\x1bmapaccess1_fat\x00\b\x17\"\xa4\x01\x00\x00\x1d::\xb0\x01\x00\x00\x17:" + - "\xb2\x01\x00\x00\x17\"\rzero·5\x00\x00\x02\x17:\xb4\x01\x00\x00\t\x13mapaccess2\x00\x06\x17\"\x13" + - "mapType·3\x00\x00\x1d::\rhmap·4\x00\x00\x17:\vkey·5\x00\x00\x04\x17:\xb4" + - "\x01\x00\x00\x00\rpres·2\x00\x00\t!mapaccess2_fast32\x00\x06\x17\"\xc2\x01\x00" + - "\x00\x1d::\xc4\x01\x00\x00:\xc6\x01\x00\x00\x04\x17:\xb4\x01\x00\x00\x00\xc8\x01\x00\x00\t!mapaccess2_fa" + - "st64\x00\x06\x17\"\xc2\x01\x00\x00\x1d::\xc4\x01\x00\x00:\xc6\x01\x00\x00\x04\x17:\xb4\x01\x00\x00\x00\xc8\x01\x00\x00\t#ma" + - "paccess2_faststr\x00\x06\x17\"\xc2\x01\x00\x00\x1d::\xc4\x01\x00\x00:\xc6\x01\x00\x00\x04\x17:\xb4" + - "\x01\x00\x00\x00\xc8\x01\x00\x00\t\x1bmapaccess2_fat\x00\b\x17\"\xc2\x01\x00\x00\x1d::\xc4\x01\x00\x00\x17" + - ":\xc6\x01\x00\x00\x17\"\rzero·6\x00\x00\x04\x17:\xb4\x01\x00\x00\x00\xc8\x01\x00\x00\t\x11mapassign" + - "\x00\x06\x17\"\xa4\x01\x00\x00\x1d::\xb0\x01\x00\x00\x17:\xb2\x01\x00\x00\x02\x17:\xb4\x01\x00\x00\t\x15mapiterini" + - "t\x00\x06\x17\"\x13mapType·1\x00\x00\x1d::\rhmap·2\x00\x00\x17:\x0fhiter\xc2" + - "\xb73\x00\x00\x00\t\x11mapdelete\x00\x06\x17\"\xd8\x01\x00\x00\x1d::\xda\x01\x00\x00\x17:\vkey·3" + - "\x00\x00\x00\t\x15mapiternext\x00\x02\x17:\x0fhiter·1\x00\x00\x00\t\x0fmakech" + - "an\x00\x04\x17\"\x15chanType·2\x00\x00\n\xa6\x01\x00\x00\x02\x1f\x06:\x0fhchan·1\x00\x00" + - "\t\x11chanrecv1\x00\x06\x17\"\x15chanType·1\x00\x00\x1f\x02:\x0fhchan·" + - "2\x00\x00\x17:j\x00\x00\x00\t\x11chanrecv2\x00\x06\x17\"\xe8\x01\x00\x00\x1f\x02:\x0fhchan·3" + - "\x00\x00\x17:\relem·4\x00\x00\x01\x00\x00\t\x11chansend1\x00\x06\x17\"\xee\x01\x00\x00\x1f\x04:\xf0" + - "\x01\x00\x00\x17:j\x00\x00\x00\t\x11closechan\x00\x02:\xea\x01\x00\x00\x00\a\x17writeBarri" + - "er\x00\x15\x06\renabled\x00\x00\x00\vneeded\x00\x00\x00\x05cgo\x00\x00\x00\t\x1dwrite" + - "barrierptr\x00\x04\x17:\vdst·1\x00\x00:\vsrc·2\x00\x00\x00\t\x17type" + - "dmemmove\x00\x06\x17\"t\x00\x00\x17:\vdst·2\x00\x00\x17:\vsrc·3\x00\x00\x00\t\x1b" + - "typedslicecopy\x00\x06\x17\"\x06\x00\x00:\vdst·3\x00\x00:\vsrc·4\x00" + - "\x00\x01\x02\x00\t\x17selectnbsend\x00\x06\x17\"\xe8\x01\x00\x00\x1f\x04:\xf4\x01\x00\x00\x17:\xf6\x01\x00\x00\x01" + - "\x00\x00\t\x17selectnbrecv\x00\x06\x17\"\xe8\x01\x00\x00\x17:j\x00\x00\x1f\x02:\x0fhchan·" + - "4\x00\x00\x01\x00\x00\t\x19selectnbrecv2\x00\b\x17\"\xe8\x01\x00\x00\x17:j\x00\x00\x17\x00\x15rec" + - "eived·4\x00\x00\x1f\x02:\x0fhchan·5\x00\x00\x01\x00\x00\t\x11newselect\x00\x06" + - "\x17\"\vsel·1\x00\x00\n\x13selsize·2\x00\x00\b\rsize·3\x00\x00\x00\t\x13s" + - "electsend\x00\x06\x17\"\vsel·2\x00\x00\x1f\x04:\xf4\x01\x00\x00\x17:\xf6\x01\x00\x00\x02\x00\x15se" + - "lected·1\x00\x00\t\x13selectrecv\x00\x06\x17\"\xac\x02\x00\x00\x1f\x02:\xf4\x01\x00\x00\x17:" + - "\xf6\x01\x00\x00\x02\x00\xae\x02\x00\x00\t\x15selectrecv2\x00\b\x17\"\xac\x02\x00\x00\x1f\x02:\xf4\x01\x00\x00\x17:" + - "\xf6\x01\x00\x00\x17\x00\x15received·5\x00\x00\x02\x00\xae\x02\x00\x00\t\x19selectdefaul" + - "t\x00\x02\x17\"\xac\x02\x00\x00\x02\x00\xae\x02\x00\x00\t\x0fselectgo\x00\x02\x17\"\xa4\x02\x00\x00\x00\t\tbloc" + - "k\x00\x00\x00\t\x11makeslice\x00\x06\x17\"\x06\x00\x00\x02\vlen·3\x00\x00\x02\vcap·4" + - "\x00\x00\x02\x11:\vary·1\x00\x00\t\x15makeslice64\x00\x06\x17\"\x06\x00\x00\n\xbe\x02\x00\x00\n" + - "\xc0\x02\x00\x00\x02\x11:\xc2\x02\x00\x00\t\x11growslice\x00\x06\x17\"\x06\x00\x00\x11:\vold·3\x00\x00" + - "\x02\xc0\x02\x00\x00\x02\x11:\xc2\x02\x00\x00\t\rmemmove\x00\x06\x17:\tto·1\x00\x00\x17:\vfrm\xc2" + - "\xb72\x00\x00\x16\x11length·3\x00^\x00\t\vmemclr\x00\x04\x17\"\vptr·1\x00\x00\x16" + - "\x11length·2\x00^\x00\t\x0fmemequal\x00\x06\x17:\ax·2\x00\x00\x17:\ay·" + - "3\x00\x00\x16\rsize·4\x00^\x01\x00\x00\t\x11memequal8\x00\x04\x17:\xda\x02\x00\x00\x17:\xdc\x02" + - "\x00\x00\x01\x00\x00\t\x13memequal16\x00\x04\x17:\xda\x02\x00\x00\x17:\xdc\x02\x00\x00\x01\x00\x00\t\x13meme" + - "qual32\x00\x04\x17:\xda\x02\x00\x00\x17:\xdc\x02\x00\x00\x01\x00\x00\t\x13memequal64\x00\x04\x17:\xda" + - "\x02\x00\x00\x17:\xdc\x02\x00\x00\x01\x00\x00\t\x15memequal128\x00\x04\x17:\xda\x02\x00\x00\x17:\xdc\x02\x00\x00\x01" + - "\x00\x00\t\x0fint64div\x00\x03\n\x00\n\x00\x01\n\x00\t\x11uint64div\x00\x03\x14\x00\x14\x00\x01\x14" + - "\x00\t\x0fint64mod\x00\x03\n\x00\n\x00\x01\n\x00\t\x11uint64mod\x00\x03\x14\x00\x14\x00\x01\x14\x00" + - "\t\x1bfloat64toint64\x00\x01\x1a\x00\x01\n\x00\t\x1dfloat64touint64" + - "\x00\x01\x1a\x00\x01\x14\x00\t\x1dfloat64touint32\x00\x01\x1a\x00\x01\x12\x00\t\x1bint64to" + - "float64\x00\x01\n\x00\x01\x1a\x00\t\x1duint64tofloat64\x00\x01\x14\x00\x01\x1a\x00\t\x1d" + - "uint32tofloat64\x00\x01\x12\x00\x01\x1a\x00\t\x19complex128div\x00\x04\x1e" + - "\vnum·2\x00\x00\x1e\vden·3\x00\x00\x02\x1e\vquo·1\x00\x00\t\x19racefunc" + - "enter\x00\x01\x16^\x00\t\x17racefuncexit\x00\x00\x00\t\x0fraceread\x00\x01\x16" + - "^\x00\t\x11racewrite\x00\x01\x16^\x00\t\x19racereadrange\x00\x04\x16\radd" + - "r·1\x00^\x16\rsize·2\x00^\x00\t\x1bracewriterange\x00\x04\x16\x90\x03\x00" + - "^\x16\x92\x03\x00^\x00\t\x0fmsanread\x00\x04\x16\x90\x03\x00^\x16\x92\x03\x00^\x00\t\x11msanwrit" + - "e\x00\x04\x16\x90\x03\x00^\x16\x92\x03\x00^\x00\v\xf6\x01\v\x00\x01\x00\n$$\n" + "licestringcopy\x00\x04:X\x00\x00:Z\x00\x00\x01\x02\x00\t\rconvI2I\x00\x04\x17\"" + + "\x06\x00\x00:\relem·3\x00\x00\x02:\vret·1\x00\x00\t\rconvT2E\x00\x04\x17\"\x06\x00" + + "\x00\x17:d\x00\x00\x02:f\x00\x00\t\rconvT2I\x00\x04\x17\"\vtab·2\x00\x00\x17:d\x00\x00\x02:" + + "f\x00\x00\t\x11assertE2E\x00\x06\x17\"\vtyp·1\x00\x00:\x0fiface·2\x00\x00\x17" + + ":\vret·3\x00\x00\x00\t\x13assertE2E2\x00\x06\x17\"\x06\x00\x00:\x0fiface·3" + + "\x00\x00\x17:\vret·4\x00\x00\x01\x00\x00\t\x11assertE2I\x00\x06\x17\"p\x00\x00:r\x00\x00\x17:" + + "t\x00\x00\x00\t\x13assertE2I2\x00\x06\x17\"\x06\x00\x00:x\x00\x00\x17:z\x00\x00\x01\x00\x00\t\x11ass" + + "ertE2T\x00\x06\x17\"p\x00\x00:r\x00\x00\x17:t\x00\x00\x00\t\x13assertE2T2\x00\x06\x17\"\x06" + + "\x00\x00:x\x00\x00\x17:z\x00\x00\x01\x00\x00\t\x11assertI2E\x00\x06\x17\"p\x00\x00:r\x00\x00\x17:t\x00" + + "\x00\x00\t\x13assertI2E2\x00\x06\x17\"\x06\x00\x00:x\x00\x00\x17:z\x00\x00\x01\x00\x00\t\x11asser" + + "tI2I\x00\x06\x17\"p\x00\x00:r\x00\x00\x17:t\x00\x00\x00\t\x13assertI2I2\x00\x06\x17\"\x06\x00\x00" + + ":x\x00\x00\x17:z\x00\x00\x01\x00\x00\t\x11assertI2T\x00\x06\x17\"p\x00\x00:r\x00\x00\x17:t\x00\x00\x00" + + "\t\x13assertI2T2\x00\x06\x17\"\x06\x00\x00:x\x00\x00\x17:z\x00\x00\x01\x00\x00\t\x17panicdo" + + "ttype\x00\x06\x17\"\rhave·1\x00\x00\x17\"\rwant·2\x00\x00\x17\"x\x00\x00\x00\t\ri" + + "faceeq\x00\x04:\ti1·2\x00\x00:\ti2·3\x00\x00\x02\x00f\x00\x00\t\refaceeq" + + "\x00\x04:\x98\x01\x00\x00:\x9a\x01\x00\x00\x02\x00f\x00\x00\t\rmakemap\x00\b\x17\"\x13mapType·" + + "2\x00\x00\n\rhint·3\x00\x00\x17:\x11mapbuf·4\x00\x00\x17:\x17bucketbuf" + + "·5\x00\x00\x02\x1d::\rhmap·1\x00\x00\t\x13mapaccess1\x00\x06\x17\"\xa0\x01\x00\x00\x1d" + + "::\rhmap·3\x00\x00\x17:\vkey·4\x00\x00\x02\x17:\vval·1\x00\x00\t!map" + + "access1_fast32\x00\x06\x17\"\xa0\x01\x00\x00\x1d::\xac\x01\x00\x00:\xae\x01\x00\x00\x02\x17:\xb0\x01\x00" + + "\x00\t!mapaccess1_fast64\x00\x06\x17\"\xa0\x01\x00\x00\x1d::\xac\x01\x00\x00:\xae\x01\x00\x00" + + "\x02\x17:\xb0\x01\x00\x00\t#mapaccess1_faststr\x00\x06\x17\"\xa0\x01\x00\x00\x1d::\xac\x01" + + "\x00\x00:\xae\x01\x00\x00\x02\x17:\xb0\x01\x00\x00\t\x1bmapaccess1_fat\x00\b\x17\"\xa0\x01\x00\x00\x1d:" + + ":\xac\x01\x00\x00\x17:\xae\x01\x00\x00\x17\"\rzero·5\x00\x00\x02\x17:\xb0\x01\x00\x00\t\x13mapacces" + + "s2\x00\x06\x17\"\x13mapType·3\x00\x00\x1d::\rhmap·4\x00\x00\x17:\vkey·" + + "5\x00\x00\x04\x17:\xb0\x01\x00\x00\x00\rpres·2\x00\x00\t!mapaccess2_fast32" + + "\x00\x06\x17\"\xbe\x01\x00\x00\x1d::\xc0\x01\x00\x00:\xc2\x01\x00\x00\x04\x17:\xb0\x01\x00\x00\x00\xc4\x01\x00\x00\t!mapacc" + + "ess2_fast64\x00\x06\x17\"\xbe\x01\x00\x00\x1d::\xc0\x01\x00\x00:\xc2\x01\x00\x00\x04\x17:\xb0\x01\x00\x00\x00\xc4" + + "\x01\x00\x00\t#mapaccess2_faststr\x00\x06\x17\"\xbe\x01\x00\x00\x1d::\xc0\x01\x00\x00:\xc2" + + "\x01\x00\x00\x04\x17:\xb0\x01\x00\x00\x00\xc4\x01\x00\x00\t\x1bmapaccess2_fat\x00\b\x17\"\xbe\x01\x00\x00\x1d" + + "::\xc0\x01\x00\x00\x17:\xc2\x01\x00\x00\x17\"\rzero·6\x00\x00\x04\x17:\xb0\x01\x00\x00\x00\xc4\x01\x00\x00\t\x11ma" + + "passign\x00\x06\x17\"\xa0\x01\x00\x00\x1d::\xac\x01\x00\x00\x17:\xae\x01\x00\x00\x02\x17:\xb0\x01\x00\x00\t\x15map" + + "iterinit\x00\x06\x17\"\x13mapType·1\x00\x00\x1d::\rhmap·2\x00\x00\x17:" + + "\x0fhiter·3\x00\x00\x00\t\x11mapdelete\x00\x06\x17\"\xd4\x01\x00\x00\x1d::\xd6\x01\x00\x00\x17:" + + "\vkey·3\x00\x00\x00\t\x15mapiternext\x00\x02\x17:\x0fhiter·1\x00\x00\x00\t" + + "\x0fmakechan\x00\x04\x17\"\x15chanType·2\x00\x00\n\xa2\x01\x00\x00\x02\x1f\x06:\x0fhch" + + "an·1\x00\x00\t\x11chanrecv1\x00\x06\x17\"\x15chanType·1\x00\x00\x1f\x02:\x0f" + + "hchan·2\x00\x00\x17:d\x00\x00\x00\t\x11chanrecv2\x00\x06\x17\"\xe4\x01\x00\x00\x1f\x02:\x0fh" + + "chan·3\x00\x00\x17:\relem·4\x00\x00\x01\x00\x00\t\x11chansend1\x00\x06\x17\"\xea" + + "\x01\x00\x00\x1f\x04:\xec\x01\x00\x00\x17:d\x00\x00\x00\t\x11closechan\x00\x02:\xe6\x01\x00\x00\x00\a\x17wri" + + "teBarrier\x00\x15\x06\renabled\x00\x00\x00\vneeded\x00\x00\x00\x05cgo\x00\x00\x00" + + "\t\x1dwritebarrierptr\x00\x04\x17:\vdst·1\x00\x00:\vsrc·2\x00\x00" + + "\x00\t\x17typedmemmove\x00\x06\x17\"p\x00\x00\x17:\vdst·2\x00\x00\x17:\vsrc\xc2" + + "\xb73\x00\x00\x00\t\x1btypedslicecopy\x00\x06\x17\"\x06\x00\x00:\vdst·3\x00\x00:\v" + + "src·4\x00\x00\x01\x02\x00\t\x17selectnbsend\x00\x06\x17\"\xe4\x01\x00\x00\x1f\x04:\xf0\x01\x00\x00" + + "\x17:\xf2\x01\x00\x00\x01\x00\x00\t\x17selectnbrecv\x00\x06\x17\"\xe4\x01\x00\x00\x17:d\x00\x00\x1f\x02:\x0f" + + "hchan·4\x00\x00\x01\x00\x00\t\x19selectnbrecv2\x00\b\x17\"\xe4\x01\x00\x00\x17:d\x00" + + "\x00\x17\x00\x15received·4\x00\x00\x1f\x02:\x0fhchan·5\x00\x00\x01\x00\x00\t\x11news" + + "elect\x00\x06\x17\"\vsel·1\x00\x00\n\x13selsize·2\x00\x00\b\rsize·" + + "3\x00\x00\x00\t\x13selectsend\x00\x06\x17\"\vsel·2\x00\x00\x1f\x04:\xf0\x01\x00\x00\x17:\xf2\x01" + + "\x00\x00\x02\x00\x15selected·1\x00\x00\t\x13selectrecv\x00\x06\x17\"\xa8\x02\x00\x00\x1f\x02" + + ":\xf0\x01\x00\x00\x17:\xf2\x01\x00\x00\x02\x00\xaa\x02\x00\x00\t\x15selectrecv2\x00\b\x17\"\xa8\x02\x00\x00\x1f\x02" + + ":\xf0\x01\x00\x00\x17:\xf2\x01\x00\x00\x17\x00\x15received·5\x00\x00\x02\x00\xaa\x02\x00\x00\t\x19selec" + + "tdefault\x00\x02\x17\"\xa8\x02\x00\x00\x02\x00\xaa\x02\x00\x00\t\x0fselectgo\x00\x02\x17\"\xa0\x02\x00\x00" + + "\x00\t\tblock\x00\x00\x00\t\x11makeslice\x00\x06\x17\"\x06\x00\x00\x02\vlen·3\x00\x00\x02" + + "\vcap·4\x00\x00\x02\x11:\vary·1\x00\x00\t\x15makeslice64\x00\x06\x17\"\x06\x00" + + "\x00\n\xba\x02\x00\x00\n\xbc\x02\x00\x00\x02\x11:\xbe\x02\x00\x00\t\x11growslice\x00\x06\x17\"\x06\x00\x00\x11:\vo" + + "ld·3\x00\x00\x02\xbc\x02\x00\x00\x02\x11:\xbe\x02\x00\x00\t\rmemmove\x00\x06\x17:\tto·1\x00\x00" + + "\x17:\vfrm·2\x00\x00\x16\x11length·3\x00^\x00\t\vmemclr\x00\x04\x17\"\vpt" + + "r·1\x00\x00\x16\x11length·2\x00^\x00\t\x0fmemequal\x00\x06\x17:\ax·2\x00" + + "\x00\x17:\ay·3\x00\x00\x16\rsize·4\x00^\x01\x00\x00\t\x11memequal8\x00\x04\x17:\xd6" + + "\x02\x00\x00\x17:\xd8\x02\x00\x00\x01\x00\x00\t\x13memequal16\x00\x04\x17:\xd6\x02\x00\x00\x17:\xd8\x02\x00\x00\x01\x00" + + "\x00\t\x13memequal32\x00\x04\x17:\xd6\x02\x00\x00\x17:\xd8\x02\x00\x00\x01\x00\x00\t\x13memequal" + + "64\x00\x04\x17:\xd6\x02\x00\x00\x17:\xd8\x02\x00\x00\x01\x00\x00\t\x15memequal128\x00\x04\x17:\xd6\x02\x00\x00" + + "\x17:\xd8\x02\x00\x00\x01\x00\x00\t\x0fint64div\x00\x03\n\x00\n\x00\x01\n\x00\t\x11uint64div\x00" + + "\x03\x14\x00\x14\x00\x01\x14\x00\t\x0fint64mod\x00\x03\n\x00\n\x00\x01\n\x00\t\x11uint64mod\x00\x03" + + "\x14\x00\x14\x00\x01\x14\x00\t\x1bfloat64toint64\x00\x01\x1a\x00\x01\n\x00\t\x1dfloat64t" + + "ouint64\x00\x01\x1a\x00\x01\x14\x00\t\x1dfloat64touint32\x00\x01\x1a\x00\x01\x12\x00\t\x1b" + + "int64tofloat64\x00\x01\n\x00\x01\x1a\x00\t\x1duint64tofloat64\x00\x01" + + "\x14\x00\x01\x1a\x00\t\x1duint32tofloat64\x00\x01\x12\x00\x01\x1a\x00\t\x19complex12" + + "8div\x00\x04\x1e\vnum·2\x00\x00\x1e\vden·3\x00\x00\x02\x1e\vquo·1\x00\x00\t\x19r" + + "acefuncenter\x00\x01\x16^\x00\t\x17racefuncexit\x00\x00\x00\t\x0frace" + + "read\x00\x01\x16^\x00\t\x11racewrite\x00\x01\x16^\x00\t\x19racereadrange" + + "\x00\x04\x16\raddr·1\x00^\x16\rsize·2\x00^\x00\t\x1bracewriterang" + + "e\x00\x04\x16\x8c\x03\x00^\x16\x8e\x03\x00^\x00\t\x0fmsanread\x00\x04\x16\x8c\x03\x00^\x16\x8e\x03\x00^\x00\t\x11m" + + "sanwrite\x00\x04\x16\x8c\x03\x00^\x16\x8e\x03\x00^\x00\v\xf4\x01\v\x00\x01\x00\n$$\n" const unsafeimport = "" + "version 2\n\n\x00\x00\x01\vunsafe\x00\t\x0fOffsetof\x00\x01:\x00\x01\x16\x00\t" + diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 4600896af5..ae7e98693b 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -58,7 +58,6 @@ func slicecopy(to any, fr any, wid uintptr) int func slicestringcopy(to any, fr any) int // interface conversions -func convI2E(elem any) (ret any) func convI2I(typ *byte, elem any) (ret any) func convT2E(typ *byte, elem *any) (ret any) func convT2I(tab *byte, elem *any) (ret any) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index e2699d1f0a..55d129ef8e 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -410,16 +410,14 @@ func walkexprlistcheap(s []*Node, init *Nodes) { } } -// Build name of function: convI2E etc. +// Build name of function for interface conversion. // Not all names are possible -// (e.g., we'll never generate convE2E or convE2I). +// (e.g., we'll never generate convE2E or convE2I or convI2E). func convFuncName(from, to *Type) string { tkind := to.iet() switch from.iet() { case 'I': switch tkind { - case 'E': - return "convI2E" case 'I': return "convI2I" } @@ -1080,6 +1078,34 @@ opswitch: break } + // Implement interface to empty interface conversion. + // tmp = i.itab + // if tmp != nil { + // tmp = tmp.type + // } + // e = iface{tmp, i.data} + if n.Type.IsEmptyInterface() && n.Left.Type.IsInterface() && !n.Left.Type.IsEmptyInterface() { + // Evaluate the input interface. + c := temp(n.Left.Type) + init.Append(nod(OAS, c, n.Left)) + + // Get the itab out of the interface. + tmp := temp(ptrto(Types[TUINT8])) + init.Append(nod(OAS, tmp, typecheck(nod(OITAB, c, nil), Erv))) + + // Get the type out of the itab. + nif := nod(OIF, typecheck(nod(ONE, tmp, nodnil()), Erv), nil) + nif.Nbody.Set1(nod(OAS, tmp, itabType(tmp))) + init.Append(nif) + + // Build the result. + e := nod(OEFACE, tmp, ifaceData(c, ptrto(Types[TUINT8]))) + e.Type = n.Type // assign type manually, typecheck doesn't understand OEFACE. + e.Typecheck = 1 + n = e + break + } + var ll []*Node if n.Type.IsEmptyInterface() { if !n.Left.Type.IsInterface() { diff --git a/src/runtime/iface.go b/src/runtime/iface.go index 476ec7e8b2..b55a9ed893 100644 --- a/src/runtime/iface.go +++ b/src/runtime/iface.go @@ -264,16 +264,6 @@ func assertE2T2(t *_type, e eface, r unsafe.Pointer) bool { return true } -func convI2E(i iface) (r eface) { - tab := i.tab - if tab == nil { - return - } - r._type = tab._type - r.data = i.data - return -} - func assertI2E(inter *interfacetype, i iface, r *eface) { tab := i.tab if tab == nil { -- 2.48.1