[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Copyright 2009 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 walk
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"go/constant"
|
2021-04-15 23:05:49 -04:00
|
|
|
"internal/buildcfg"
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"cmd/compile/internal/base"
|
|
|
|
"cmd/compile/internal/ir"
|
|
|
|
"cmd/compile/internal/reflectdata"
|
|
|
|
"cmd/compile/internal/staticdata"
|
|
|
|
"cmd/compile/internal/typecheck"
|
|
|
|
"cmd/compile/internal/types"
|
|
|
|
"cmd/internal/obj"
|
|
|
|
)
|
|
|
|
|
|
|
|
// The result of walkExpr MUST be assigned back to n, e.g.
|
2022-02-03 14:12:08 -05:00
|
|
|
//
|
|
|
|
// n.Left = walkExpr(n.Left, init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func walkExpr(n ir.Node, init *ir.Nodes) ir.Node {
|
|
|
|
if n == nil {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2021-01-02 01:04:19 -08:00
|
|
|
if n, ok := n.(ir.InitNode); ok && init == n.PtrInit() {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// not okay to use n->ninit when walking n,
|
|
|
|
// because we might replace n with some other node
|
|
|
|
// and would lose the init list.
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("walkExpr init == &n->ninit")
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(n.Init()) != 0 {
|
|
|
|
walkStmtList(n.Init())
|
2021-01-02 01:04:19 -08:00
|
|
|
init.Append(ir.TakeInit(n)...)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
lno := ir.SetPos(n)
|
|
|
|
|
|
|
|
if base.Flag.LowerW > 1 {
|
|
|
|
ir.Dump("before walk expr", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.Typecheck() != 1 {
|
|
|
|
base.Fatalf("missed typecheck: %+v", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.Type().IsUntyped() {
|
|
|
|
base.Fatalf("expression has untyped type: %+v", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
n = walkExpr1(n, init)
|
|
|
|
|
2020-12-26 19:30:12 -08:00
|
|
|
// Eagerly compute sizes of all expressions for the back end.
|
|
|
|
if typ := n.Type(); typ != nil && typ.Kind() != types.TBLANK && !typ.IsFuncArgStruct() {
|
|
|
|
types.CheckSize(typ)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
[dev.regabi] cmd/compile: deref PAUTOHEAPs during SSA construction
Currently, during walk we rewrite PAUTOHEAP uses into derefs of their
corresponding Heapaddr, but we can easily do this instead during SSA
construction. This does involve updating two test cases:
* nilptr3.go
This file had a test that we emit a "removed nil check" diagnostic for
the implicit dereference from accessing a PAUTOHEAP variable. This CL
removes this diagnostic, since it's not really useful to end users:
from the user's point of view, there's no pointer anyway, so they
needn't care about whether we check for nil or not. That's a purely
internal detail. And with the PAUTOHEAP dereference handled during SSA
construction, we can more robustly ensure this happens, rather than
relying on setting a flag in walk and hoping that SSA sees it.
* issue20780.go
Previously, when PAUTOHEAPs were dereferenced during walk, it had a
consequence that when they're passed as a function call argument, they
would first get copied to the stack before being copied to their
actual destination. Moving the dereferencing to SSA had a side-effect
of eliminating this unnecessary temporary, and copying directly to the
destination parameter.
The test is updated to instead call "g(h(), h())" where h() returns a
large value, as the first result will always need to be spilled
somewhere will calling the second function. Maybe eventually we're
smart enough to realize it can be spilled to the heap, but we don't do
that today.
Because I'm concerned that the direct copy-to-parameter optimization
could interfere with race-detector instrumentation (e.g., maybe the
copies were previously necessary to ensure they're not clobbered by
inserted raceread calls?), I've also added issue20780b.go to exercise
this in a few different ways.
Change-Id: I720598cb32b17518bc10a03e555620c0f25fd28d
Reviewed-on: https://go-review.googlesource.com/c/go/+/281293
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2021-01-03 19:49:49 -08:00
|
|
|
if n, ok := n.(*ir.Name); ok && n.Heapaddr != nil {
|
|
|
|
types.CheckSize(n.Heapaddr.Type())
|
|
|
|
}
|
2020-12-26 19:30:12 -08:00
|
|
|
if ir.IsConst(n, constant.String) {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Emit string symbol now to avoid emitting
|
|
|
|
// any concurrently during the backend.
|
2020-12-26 19:30:12 -08:00
|
|
|
_ = staticdata.StringSym(n.Pos(), constant.StringVal(n.Val()))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if base.Flag.LowerW != 0 && n != nil {
|
|
|
|
ir.Dump("after walk expr", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
base.Pos = lno
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
func walkExpr1(n ir.Node, init *ir.Nodes) ir.Node {
|
|
|
|
switch n.Op() {
|
|
|
|
default:
|
|
|
|
ir.Dump("walk", n)
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("walkExpr: switch 1 unknown op %+v", n.Op())
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
panic("unreachable")
|
|
|
|
|
[dev.typeparams] cmd/compile: desugar ORECOVER into ORECOVERFP
Currently ORECOVER is a single operation that both (1) calculates
the (logical) caller frame pointer and (2) calls runtime.gorecover.
This is normally fine, but it's inconvenient for regabi, which wants
to wrap "defer recover()" into "defer func() { recover() }" and
needs (1) and (2) to happen at different times.
The current solution is to apply walkRecover early to split it into
the two steps, but calling it during order is a minor layering
violation. It works well today because the order and walk phases are
closely related anyway and walkRecover is relatively simple, but it
won't work for go/defer wrapping earlier into the frontend.
This CL adds a new, lower-level ORECOVERFP primitive, which represents
just part (2); and OGETCALLER{PC,SP} primitives, which provide a way
to compute (1) in the frontend too.
OGETCALLERPC isn't needed/used today, but it seems worth including for
completeness. Maybe it will be useful at some point for intrinsifying
runtime.getcaller{pc,sp}, like we already do for runtime.getg.
Change-Id: Iaa8ae51e09306c45c147b6759a5b7c24dcc317ca
Reviewed-on: https://go-review.googlesource.com/c/go/+/330192
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2021-06-22 13:44:18 -07:00
|
|
|
case ir.OGETG, ir.OGETCALLERPC, ir.OGETCALLERSP:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return n
|
|
|
|
|
2021-01-17 00:47:12 +07:00
|
|
|
case ir.OTYPE, ir.ONAME, ir.OLITERAL, ir.ONIL, ir.OLINKSYMOFFSET:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// TODO(mdempsky): Just return n; see discussion on CL 38655.
|
|
|
|
// Perhaps refactor to use Node.mayBeShared for these instead.
|
|
|
|
// If these return early, make sure to still call
|
2021-01-15 14:12:35 -08:00
|
|
|
// StringSym for constant strings.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return n
|
|
|
|
|
2020-12-26 18:33:27 -08:00
|
|
|
case ir.OMETHEXPR:
|
|
|
|
// TODO(mdempsky): Do this right after type checking.
|
2020-12-28 16:14:11 -08:00
|
|
|
n := n.(*ir.SelectorExpr)
|
2020-12-26 18:33:27 -08:00
|
|
|
return n.FuncName()
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.ONOT, ir.ONEG, ir.OPLUS, ir.OBITNOT, ir.OREAL, ir.OIMAG, ir.OSPTR, ir.OITAB, ir.OIDATA:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
|
|
|
|
case ir.ODOTMETH, ir.ODOTINTER:
|
|
|
|
n := n.(*ir.SelectorExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
|
|
|
|
case ir.OADDR:
|
|
|
|
n := n.(*ir.AddrExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
|
|
|
|
case ir.ODEREF:
|
|
|
|
n := n.(*ir.StarExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
|
2021-04-21 02:11:15 -07:00
|
|
|
case ir.OEFACE, ir.OAND, ir.OANDNOT, ir.OSUB, ir.OMUL, ir.OADD, ir.OOR, ir.OXOR, ir.OLSH, ir.ORSH,
|
|
|
|
ir.OUNSAFEADD:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
n.Y = walkExpr(n.Y, init)
|
|
|
|
return n
|
|
|
|
|
2021-04-21 02:11:15 -07:00
|
|
|
case ir.OUNSAFESLICE:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
return walkUnsafeSlice(n, init)
|
|
|
|
|
2022-08-16 17:52:13 +08:00
|
|
|
case ir.OUNSAFESTRING:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
return walkUnsafeString(n, init)
|
|
|
|
|
|
|
|
case ir.OUNSAFESTRINGDATA, ir.OUNSAFESLICEDATA:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
return walkUnsafeData(n, init)
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.ODOT, ir.ODOTPTR:
|
|
|
|
n := n.(*ir.SelectorExpr)
|
|
|
|
return walkDot(n, init)
|
|
|
|
|
|
|
|
case ir.ODOTTYPE, ir.ODOTTYPE2:
|
|
|
|
n := n.(*ir.TypeAssertExpr)
|
|
|
|
return walkDotType(n, init)
|
|
|
|
|
2021-07-26 17:41:02 -07:00
|
|
|
case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
|
|
|
|
n := n.(*ir.DynamicTypeAssertExpr)
|
|
|
|
return walkDynamicDotType(n, init)
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.OLEN, ir.OCAP:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
return walkLenCap(n, init)
|
|
|
|
|
|
|
|
case ir.OCOMPLEX:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
n.Y = walkExpr(n.Y, init)
|
|
|
|
return n
|
|
|
|
|
|
|
|
case ir.OEQ, ir.ONE, ir.OLT, ir.OLE, ir.OGT, ir.OGE:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
return walkCompare(n, init)
|
|
|
|
|
|
|
|
case ir.OANDAND, ir.OOROR:
|
|
|
|
n := n.(*ir.LogicalExpr)
|
|
|
|
return walkLogical(n, init)
|
|
|
|
|
|
|
|
case ir.OPRINT, ir.OPRINTN:
|
|
|
|
return walkPrint(n.(*ir.CallExpr), init)
|
|
|
|
|
|
|
|
case ir.OPANIC:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
return mkcall("gopanic", nil, init, n.X)
|
|
|
|
|
[dev.typeparams] cmd/compile: desugar ORECOVER into ORECOVERFP
Currently ORECOVER is a single operation that both (1) calculates
the (logical) caller frame pointer and (2) calls runtime.gorecover.
This is normally fine, but it's inconvenient for regabi, which wants
to wrap "defer recover()" into "defer func() { recover() }" and
needs (1) and (2) to happen at different times.
The current solution is to apply walkRecover early to split it into
the two steps, but calling it during order is a minor layering
violation. It works well today because the order and walk phases are
closely related anyway and walkRecover is relatively simple, but it
won't work for go/defer wrapping earlier into the frontend.
This CL adds a new, lower-level ORECOVERFP primitive, which represents
just part (2); and OGETCALLER{PC,SP} primitives, which provide a way
to compute (1) in the frontend too.
OGETCALLERPC isn't needed/used today, but it seems worth including for
completeness. Maybe it will be useful at some point for intrinsifying
runtime.getcaller{pc,sp}, like we already do for runtime.getg.
Change-Id: Iaa8ae51e09306c45c147b6759a5b7c24dcc317ca
Reviewed-on: https://go-review.googlesource.com/c/go/+/330192
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2021-06-22 13:44:18 -07:00
|
|
|
case ir.ORECOVERFP:
|
|
|
|
return walkRecoverFP(n.(*ir.CallExpr), init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
2021-01-04 16:33:30 -08:00
|
|
|
case ir.OCFUNC:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return n
|
|
|
|
|
2021-06-25 22:24:29 +07:00
|
|
|
case ir.OCALLINTER, ir.OCALLFUNC:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
n := n.(*ir.CallExpr)
|
|
|
|
return walkCall(n, init)
|
|
|
|
|
|
|
|
case ir.OAS, ir.OASOP:
|
|
|
|
return walkAssign(init, n)
|
|
|
|
|
|
|
|
case ir.OAS2:
|
|
|
|
n := n.(*ir.AssignListStmt)
|
|
|
|
return walkAssignList(init, n)
|
|
|
|
|
|
|
|
// a,b,... = fn()
|
|
|
|
case ir.OAS2FUNC:
|
|
|
|
n := n.(*ir.AssignListStmt)
|
|
|
|
return walkAssignFunc(init, n)
|
|
|
|
|
|
|
|
// x, y = <-c
|
|
|
|
// order.stmt made sure x is addressable or blank.
|
|
|
|
case ir.OAS2RECV:
|
|
|
|
n := n.(*ir.AssignListStmt)
|
|
|
|
return walkAssignRecv(init, n)
|
|
|
|
|
|
|
|
// a,b = m[i]
|
|
|
|
case ir.OAS2MAPR:
|
|
|
|
n := n.(*ir.AssignListStmt)
|
|
|
|
return walkAssignMapRead(init, n)
|
|
|
|
|
|
|
|
case ir.ODELETE:
|
|
|
|
n := n.(*ir.CallExpr)
|
|
|
|
return walkDelete(init, n)
|
|
|
|
|
|
|
|
case ir.OAS2DOTTYPE:
|
|
|
|
n := n.(*ir.AssignListStmt)
|
|
|
|
return walkAssignDotType(n, init)
|
|
|
|
|
|
|
|
case ir.OCONVIFACE:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkConvInterface(n, init)
|
|
|
|
|
2021-07-23 18:10:58 -07:00
|
|
|
case ir.OCONVIDATA:
|
|
|
|
n := n.(*ir.ConvExpr)
|
2021-08-04 22:18:23 -07:00
|
|
|
return walkConvIData(n, init)
|
2021-07-23 18:10:58 -07:00
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.OCONV, ir.OCONVNOP:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkConv(n, init)
|
|
|
|
|
2022-09-12 13:01:57 -07:00
|
|
|
case ir.OSLICE2ARR:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkSliceToArray(n, init)
|
|
|
|
|
2021-03-14 14:24:47 -07:00
|
|
|
case ir.OSLICE2ARRPTR:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.ODIV, ir.OMOD:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
return walkDivMod(n, init)
|
|
|
|
|
|
|
|
case ir.OINDEX:
|
|
|
|
n := n.(*ir.IndexExpr)
|
|
|
|
return walkIndex(n, init)
|
|
|
|
|
|
|
|
case ir.OINDEXMAP:
|
|
|
|
n := n.(*ir.IndexExpr)
|
|
|
|
return walkIndexMap(n, init)
|
|
|
|
|
|
|
|
case ir.ORECV:
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("walkExpr ORECV") // should see inside OAS only
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
panic("unreachable")
|
|
|
|
|
|
|
|
case ir.OSLICEHEADER:
|
|
|
|
n := n.(*ir.SliceHeaderExpr)
|
|
|
|
return walkSliceHeader(n, init)
|
|
|
|
|
2022-08-16 17:52:13 +08:00
|
|
|
case ir.OSTRINGHEADER:
|
|
|
|
n := n.(*ir.StringHeaderExpr)
|
|
|
|
return walkStringHeader(n, init)
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
case ir.OSLICE, ir.OSLICEARR, ir.OSLICESTR, ir.OSLICE3, ir.OSLICE3ARR:
|
|
|
|
n := n.(*ir.SliceExpr)
|
|
|
|
return walkSlice(n, init)
|
|
|
|
|
|
|
|
case ir.ONEW:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
return walkNew(n, init)
|
|
|
|
|
|
|
|
case ir.OADDSTR:
|
|
|
|
return walkAddString(n.(*ir.AddStringExpr), init)
|
|
|
|
|
|
|
|
case ir.OAPPEND:
|
|
|
|
// order should make sure we only see OAS(node, OAPPEND), which we handle above.
|
|
|
|
base.Fatalf("append outside assignment")
|
|
|
|
panic("unreachable")
|
|
|
|
|
|
|
|
case ir.OCOPY:
|
|
|
|
return walkCopy(n.(*ir.BinaryExpr), init, base.Flag.Cfg.Instrumenting && !base.Flag.CompilingRuntime)
|
|
|
|
|
|
|
|
case ir.OCLOSE:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
return walkClose(n, init)
|
|
|
|
|
|
|
|
case ir.OMAKECHAN:
|
|
|
|
n := n.(*ir.MakeExpr)
|
|
|
|
return walkMakeChan(n, init)
|
|
|
|
|
|
|
|
case ir.OMAKEMAP:
|
|
|
|
n := n.(*ir.MakeExpr)
|
|
|
|
return walkMakeMap(n, init)
|
|
|
|
|
|
|
|
case ir.OMAKESLICE:
|
|
|
|
n := n.(*ir.MakeExpr)
|
|
|
|
return walkMakeSlice(n, init)
|
|
|
|
|
|
|
|
case ir.OMAKESLICECOPY:
|
|
|
|
n := n.(*ir.MakeExpr)
|
|
|
|
return walkMakeSliceCopy(n, init)
|
|
|
|
|
|
|
|
case ir.ORUNESTR:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkRuneToString(n, init)
|
|
|
|
|
|
|
|
case ir.OBYTES2STR, ir.ORUNES2STR:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkBytesRunesToString(n, init)
|
|
|
|
|
|
|
|
case ir.OBYTES2STRTMP:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkBytesToStringTemp(n, init)
|
|
|
|
|
|
|
|
case ir.OSTR2BYTES:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkStringToBytes(n, init)
|
|
|
|
|
|
|
|
case ir.OSTR2BYTESTMP:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkStringToBytesTemp(n, init)
|
|
|
|
|
|
|
|
case ir.OSTR2RUNES:
|
|
|
|
n := n.(*ir.ConvExpr)
|
|
|
|
return walkStringToRunes(n, init)
|
|
|
|
|
|
|
|
case ir.OARRAYLIT, ir.OSLICELIT, ir.OMAPLIT, ir.OSTRUCTLIT, ir.OPTRLIT:
|
|
|
|
return walkCompLit(n, init)
|
|
|
|
|
|
|
|
case ir.OSEND:
|
|
|
|
n := n.(*ir.SendStmt)
|
|
|
|
return walkSend(n, init)
|
|
|
|
|
|
|
|
case ir.OCLOSURE:
|
|
|
|
return walkClosure(n.(*ir.ClosureExpr), init)
|
|
|
|
|
2021-06-27 01:28:38 +07:00
|
|
|
case ir.OMETHVALUE:
|
|
|
|
return walkMethodValue(n.(*ir.SelectorExpr), init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// No return! Each case must return (or panic),
|
|
|
|
// to avoid confusion about what gets returned
|
|
|
|
// in the presence of type assertions.
|
|
|
|
}
|
|
|
|
|
|
|
|
// walk the whole tree of the body of an
|
|
|
|
// expression or simple statement.
|
|
|
|
// the types expressions are calculated.
|
|
|
|
// compile-time constants are evaluated.
|
|
|
|
// complex side effects like statements are appended to init
|
|
|
|
func walkExprList(s []ir.Node, init *ir.Nodes) {
|
|
|
|
for i := range s {
|
|
|
|
s[i] = walkExpr(s[i], init)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func walkExprListCheap(s []ir.Node, init *ir.Nodes) {
|
|
|
|
for i, n := range s {
|
|
|
|
s[i] = cheapExpr(n, init)
|
|
|
|
s[i] = walkExpr(s[i], init)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func walkExprListSafe(s []ir.Node, init *ir.Nodes) {
|
|
|
|
for i, n := range s {
|
|
|
|
s[i] = safeExpr(n, init)
|
|
|
|
s[i] = walkExpr(s[i], init)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// return side-effect free and cheap n, appending side effects to init.
|
|
|
|
// result may not be assignable.
|
|
|
|
func cheapExpr(n ir.Node, init *ir.Nodes) ir.Node {
|
|
|
|
switch n.Op() {
|
|
|
|
case ir.ONAME, ir.OLITERAL, ir.ONIL:
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
return copyExpr(n, n.Type(), init)
|
|
|
|
}
|
|
|
|
|
|
|
|
// return side effect-free n, appending side effects to init.
|
|
|
|
// result is assignable if n is.
|
|
|
|
func safeExpr(n ir.Node, init *ir.Nodes) ir.Node {
|
|
|
|
if n == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(n.Init()) != 0 {
|
|
|
|
walkStmtList(n.Init())
|
2021-01-02 01:04:19 -08:00
|
|
|
init.Append(ir.TakeInit(n)...)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Op() {
|
2021-01-17 00:47:12 +07:00
|
|
|
case ir.ONAME, ir.OLITERAL, ir.ONIL, ir.OLINKSYMOFFSET:
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return n
|
|
|
|
|
|
|
|
case ir.OLEN, ir.OCAP:
|
|
|
|
n := n.(*ir.UnaryExpr)
|
|
|
|
l := safeExpr(n.X, init)
|
|
|
|
if l == n.X {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
a := ir.Copy(n).(*ir.UnaryExpr)
|
|
|
|
a.X = l
|
|
|
|
return walkExpr(typecheck.Expr(a), init)
|
|
|
|
|
|
|
|
case ir.ODOT, ir.ODOTPTR:
|
|
|
|
n := n.(*ir.SelectorExpr)
|
|
|
|
l := safeExpr(n.X, init)
|
|
|
|
if l == n.X {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
a := ir.Copy(n).(*ir.SelectorExpr)
|
|
|
|
a.X = l
|
|
|
|
return walkExpr(typecheck.Expr(a), init)
|
|
|
|
|
|
|
|
case ir.ODEREF:
|
|
|
|
n := n.(*ir.StarExpr)
|
|
|
|
l := safeExpr(n.X, init)
|
|
|
|
if l == n.X {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
a := ir.Copy(n).(*ir.StarExpr)
|
|
|
|
a.X = l
|
|
|
|
return walkExpr(typecheck.Expr(a), init)
|
|
|
|
|
|
|
|
case ir.OINDEX, ir.OINDEXMAP:
|
|
|
|
n := n.(*ir.IndexExpr)
|
|
|
|
l := safeExpr(n.X, init)
|
|
|
|
r := safeExpr(n.Index, init)
|
|
|
|
if l == n.X && r == n.Index {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
a := ir.Copy(n).(*ir.IndexExpr)
|
|
|
|
a.X = l
|
|
|
|
a.Index = r
|
|
|
|
return walkExpr(typecheck.Expr(a), init)
|
|
|
|
|
|
|
|
case ir.OSTRUCTLIT, ir.OARRAYLIT, ir.OSLICELIT:
|
|
|
|
n := n.(*ir.CompLitExpr)
|
|
|
|
if isStaticCompositeLiteral(n) {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// make a copy; must not be used as an lvalue
|
2020-12-24 18:16:44 +07:00
|
|
|
if ir.IsAddressable(n) {
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("missing lvalue case in safeExpr: %v", n)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
return cheapExpr(n, init)
|
|
|
|
}
|
|
|
|
|
|
|
|
func copyExpr(n ir.Node, t *types.Type, init *ir.Nodes) ir.Node {
|
|
|
|
l := typecheck.Temp(t)
|
|
|
|
appendWalkStmt(init, ir.NewAssignStmt(base.Pos, l, n))
|
|
|
|
return l
|
|
|
|
}
|
|
|
|
|
|
|
|
func walkAddString(n *ir.AddStringExpr, init *ir.Nodes) ir.Node {
|
|
|
|
c := len(n.List)
|
|
|
|
|
|
|
|
if c < 2 {
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("walkAddString count %d too small", c)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
buf := typecheck.NodNil()
|
|
|
|
if n.Esc() == ir.EscNone {
|
|
|
|
sz := int64(0)
|
|
|
|
for _, n1 := range n.List {
|
|
|
|
if n1.Op() == ir.OLITERAL {
|
|
|
|
sz += int64(len(ir.StringVal(n1)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't allocate the buffer if the result won't fit.
|
|
|
|
if sz < tmpstringbufsize {
|
|
|
|
// Create temporary buffer for result string on stack.
|
2021-01-16 18:25:00 -08:00
|
|
|
buf = stackBufAddr(tmpstringbufsize, types.Types[types.TUINT8])
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// build list of string arguments
|
|
|
|
args := []ir.Node{buf}
|
|
|
|
for _, n2 := range n.List {
|
|
|
|
args = append(args, typecheck.Conv(n2, types.Types[types.TSTRING]))
|
|
|
|
}
|
|
|
|
|
|
|
|
var fn string
|
|
|
|
if c <= 5 {
|
|
|
|
// small numbers of strings use direct runtime helpers.
|
|
|
|
// note: order.expr knows this cutoff too.
|
|
|
|
fn = fmt.Sprintf("concatstring%d", c)
|
|
|
|
} else {
|
|
|
|
// large numbers of strings are passed to the runtime as a slice.
|
|
|
|
fn = "concatstrings"
|
|
|
|
|
|
|
|
t := types.NewSlice(types.Types[types.TSTRING])
|
|
|
|
// args[1:] to skip buf arg
|
2022-05-02 18:02:22 -07:00
|
|
|
slice := ir.NewCompLitExpr(base.Pos, ir.OCOMPLIT, t, args[1:])
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
slice.Prealloc = n.Prealloc
|
|
|
|
args = []ir.Node{buf, slice}
|
|
|
|
slice.SetEsc(ir.EscNone)
|
|
|
|
}
|
|
|
|
|
|
|
|
cat := typecheck.LookupRuntime(fn)
|
|
|
|
r := ir.NewCallExpr(base.Pos, ir.OCALL, cat, nil)
|
2021-01-02 01:27:29 -08:00
|
|
|
r.Args = args
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
r1 := typecheck.Expr(r)
|
|
|
|
r1 = walkExpr(r1, init)
|
|
|
|
r1.SetType(n.Type())
|
|
|
|
|
|
|
|
return r1
|
|
|
|
}
|
|
|
|
|
2022-05-20 22:09:58 +00:00
|
|
|
type hookInfo struct {
|
|
|
|
paramType types.Kind
|
|
|
|
argsNum int
|
|
|
|
runtimeFunc string
|
|
|
|
}
|
|
|
|
|
|
|
|
var hooks = map[string]hookInfo{
|
|
|
|
"strings.EqualFold": {paramType: types.TSTRING, argsNum: 2, runtimeFunc: "libfuzzerHookEqualFold"},
|
|
|
|
}
|
|
|
|
|
2021-06-25 22:24:29 +07:00
|
|
|
// walkCall walks an OCALLFUNC or OCALLINTER node.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func walkCall(n *ir.CallExpr, init *ir.Nodes) ir.Node {
|
2021-06-25 22:24:29 +07:00
|
|
|
if n.Op() == ir.OCALLMETH {
|
|
|
|
base.FatalfAt(n.Pos(), "OCALLMETH missed by typecheck")
|
|
|
|
}
|
|
|
|
if n.Op() == ir.OCALLINTER || n.X.Op() == ir.OMETHEXPR {
|
2021-02-12 16:30:51 -05:00
|
|
|
// We expect both interface call reflect.Type.Method and concrete
|
|
|
|
// call reflect.(*rtype).Method.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
usemethod(n)
|
2021-02-12 16:30:51 -05:00
|
|
|
}
|
|
|
|
if n.Op() == ir.OCALLINTER {
|
2021-10-21 18:04:55 -07:00
|
|
|
reflectdata.MarkUsedIfaceMethod(n)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
2021-01-12 12:12:27 -08:00
|
|
|
if n.Op() == ir.OCALLFUNC && n.X.Op() == ir.OCLOSURE {
|
|
|
|
directClosureCall(n)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
2021-04-02 13:24:35 -04:00
|
|
|
if isFuncPCIntrinsic(n) {
|
|
|
|
// For internal/abi.FuncPCABIxxx(fn), if fn is a defined function, rewrite
|
|
|
|
// it to the address of the function of the ABI fn is defined.
|
|
|
|
name := n.X.(*ir.Name).Sym().Name
|
|
|
|
arg := n.Args[0]
|
|
|
|
var wantABI obj.ABI
|
|
|
|
switch name {
|
|
|
|
case "FuncPCABI0":
|
|
|
|
wantABI = obj.ABI0
|
|
|
|
case "FuncPCABIInternal":
|
|
|
|
wantABI = obj.ABIInternal
|
|
|
|
}
|
|
|
|
if isIfaceOfFunc(arg) {
|
|
|
|
fn := arg.(*ir.ConvExpr).X.(*ir.Name)
|
|
|
|
abi := fn.Func.ABI
|
|
|
|
if abi != wantABI {
|
|
|
|
base.ErrorfAt(n.Pos(), "internal/abi.%s expects an %v function, %s is defined as %v", name, wantABI, fn.Sym().Name, abi)
|
|
|
|
}
|
|
|
|
var e ir.Node = ir.NewLinksymExpr(n.Pos(), fn.Sym().LinksymABI(abi), types.Types[types.TUINTPTR])
|
|
|
|
e = ir.NewAddrExpr(n.Pos(), e)
|
|
|
|
e.SetType(types.Types[types.TUINTPTR].PtrTo())
|
2022-08-21 22:52:36 +07:00
|
|
|
return typecheck.Expr(ir.NewConvExpr(n.Pos(), ir.OCONVNOP, n.Type(), e))
|
2021-04-02 13:24:35 -04:00
|
|
|
}
|
|
|
|
// fn is not a defined function. It must be ABIInternal.
|
|
|
|
// Read the address from func value, i.e. *(*uintptr)(idata(fn)).
|
|
|
|
if wantABI != obj.ABIInternal {
|
|
|
|
base.ErrorfAt(n.Pos(), "internal/abi.%s does not accept func expression, which is ABIInternal", name)
|
|
|
|
}
|
|
|
|
arg = walkExpr(arg, init)
|
|
|
|
var e ir.Node = ir.NewUnaryExpr(n.Pos(), ir.OIDATA, arg)
|
|
|
|
e.SetType(n.Type().PtrTo())
|
2022-08-21 22:52:36 +07:00
|
|
|
e.SetTypecheck(1)
|
2021-04-02 13:24:35 -04:00
|
|
|
e = ir.NewStarExpr(n.Pos(), e)
|
|
|
|
e.SetType(n.Type())
|
2022-08-21 22:52:36 +07:00
|
|
|
e.SetTypecheck(1)
|
2021-04-02 13:24:35 -04:00
|
|
|
return e
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
walkCall1(n, init)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
func walkCall1(n *ir.CallExpr, init *ir.Nodes) {
|
2021-01-06 10:47:35 +07:00
|
|
|
if n.Walked() {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return // already walked
|
|
|
|
}
|
2021-01-06 10:47:35 +07:00
|
|
|
n.SetWalked(true)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
2021-02-25 21:32:29 +00:00
|
|
|
if n.Op() == ir.OCALLMETH {
|
2021-06-25 22:24:29 +07:00
|
|
|
base.FatalfAt(n.Pos(), "OCALLMETH missed by typecheck")
|
2021-02-25 21:32:29 +00:00
|
|
|
}
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
2020-12-26 18:33:27 -08:00
|
|
|
args := n.Args
|
2020-12-25 00:34:32 -08:00
|
|
|
params := n.X.Type().Params()
|
|
|
|
|
2020-12-26 18:33:27 -08:00
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
walkExprList(args, init)
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
for i, arg := range args {
|
2021-01-16 16:59:19 -08:00
|
|
|
// Validate argument and parameter types match.
|
|
|
|
param := params.Field(i)
|
|
|
|
if !types.Identical(arg.Type(), param.Type) {
|
|
|
|
base.FatalfAt(n.Pos(), "assigning %L to parameter %v (type %v)", arg, param.Sym, param.Type)
|
|
|
|
}
|
|
|
|
|
2021-01-21 12:08:46 +07:00
|
|
|
// For any argument whose evaluation might require a function call,
|
|
|
|
// store that argument into a temporary variable,
|
|
|
|
// to prevent that calls from clobbering arguments already on the stack.
|
2021-01-16 16:59:19 -08:00
|
|
|
if mayCall(arg) {
|
|
|
|
// assignment of arg to Temp
|
|
|
|
tmp := typecheck.Temp(param.Type)
|
2021-01-21 12:08:46 +07:00
|
|
|
init.Append(convas(typecheck.Stmt(ir.NewAssignStmt(base.Pos, tmp, arg)).(*ir.AssignStmt), init))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// replace arg with temp
|
|
|
|
args[i] = tmp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-20 14:46:38 +07:00
|
|
|
n.Args = args
|
2022-05-20 22:09:58 +00:00
|
|
|
funSym := n.X.Sym()
|
|
|
|
if base.Debug.Libfuzzer != 0 && funSym != nil {
|
|
|
|
if hook, found := hooks[funSym.Pkg.Path+"."+funSym.Name]; found {
|
|
|
|
if len(args) != hook.argsNum {
|
|
|
|
panic(fmt.Sprintf("%s.%s expects %d arguments, but received %d", funSym.Pkg.Path, funSym.Name, hook.argsNum, len(args)))
|
|
|
|
}
|
|
|
|
var hookArgs []ir.Node
|
|
|
|
for _, arg := range args {
|
|
|
|
hookArgs = append(hookArgs, tracecmpArg(arg, types.Types[hook.paramType], init))
|
|
|
|
}
|
|
|
|
hookArgs = append(hookArgs, fakePC(n))
|
|
|
|
init.Append(mkcall(hook.runtimeFunc, nil, init, hookArgs...))
|
|
|
|
}
|
|
|
|
}
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkDivMod walks an ODIV or OMOD node.
|
|
|
|
func walkDivMod(n *ir.BinaryExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
n.Y = walkExpr(n.Y, init)
|
|
|
|
|
|
|
|
// rewrite complex div into function call.
|
|
|
|
et := n.X.Type().Kind()
|
|
|
|
|
|
|
|
if types.IsComplex[et] && n.Op() == ir.ODIV {
|
|
|
|
t := n.Type()
|
|
|
|
call := mkcall("complex128div", types.Types[types.TCOMPLEX128], init, typecheck.Conv(n.X, types.Types[types.TCOMPLEX128]), typecheck.Conv(n.Y, types.Types[types.TCOMPLEX128]))
|
|
|
|
return typecheck.Conv(call, t)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Nothing to do for float divisions.
|
|
|
|
if types.IsFloat[et] {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// rewrite 64-bit div and mod on 32-bit architectures.
|
|
|
|
// TODO: Remove this code once we can introduce
|
|
|
|
// runtime calls late in SSA processing.
|
|
|
|
if types.RegSize < 8 && (et == types.TINT64 || et == types.TUINT64) {
|
|
|
|
if n.Y.Op() == ir.OLITERAL {
|
|
|
|
// Leave div/mod by constant powers of 2 or small 16-bit constants.
|
|
|
|
// The SSA backend will handle those.
|
|
|
|
switch et {
|
|
|
|
case types.TINT64:
|
|
|
|
c := ir.Int64Val(n.Y)
|
|
|
|
if c < 0 {
|
|
|
|
c = -c
|
|
|
|
}
|
|
|
|
if c != 0 && c&(c-1) == 0 {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
case types.TUINT64:
|
|
|
|
c := ir.Uint64Val(n.Y)
|
|
|
|
if c < 1<<16 {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
if c != 0 && c&(c-1) == 0 {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var fn string
|
|
|
|
if et == types.TINT64 {
|
|
|
|
fn = "int64"
|
|
|
|
} else {
|
|
|
|
fn = "uint64"
|
|
|
|
}
|
|
|
|
if n.Op() == ir.ODIV {
|
|
|
|
fn += "div"
|
|
|
|
} else {
|
|
|
|
fn += "mod"
|
|
|
|
}
|
|
|
|
return mkcall(fn, n.Type(), init, typecheck.Conv(n.X, types.Types[et]), typecheck.Conv(n.Y, types.Types[et]))
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkDot walks an ODOT or ODOTPTR node.
|
|
|
|
func walkDot(n *ir.SelectorExpr, init *ir.Nodes) ir.Node {
|
|
|
|
usefield(n)
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
|
|
|
|
func walkDotType(n *ir.TypeAssertExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
// Set up interface type addresses for back end.
|
|
|
|
if !n.Type().IsInterface() && !n.X.Type().IsEmptyInterface() {
|
2022-05-09 17:19:58 -07:00
|
|
|
n.ITab = reflectdata.ITabAddr(n.Type(), n.X.Type())
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2021-07-26 17:41:02 -07:00
|
|
|
// walkDynamicdotType walks an ODYNAMICDOTTYPE or ODYNAMICDOTTYPE2 node.
|
|
|
|
func walkDynamicDotType(n *ir.DynamicTypeAssertExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
2022-05-09 17:19:58 -07:00
|
|
|
n.RType = walkExpr(n.RType, init)
|
|
|
|
n.ITab = walkExpr(n.ITab, init)
|
2021-07-26 17:41:02 -07:00
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// walkIndex walks an OINDEX node.
|
|
|
|
func walkIndex(n *ir.IndexExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
|
|
|
|
// save the original node for bounds checking elision.
|
|
|
|
// If it was a ODIV/OMOD walk might rewrite it.
|
|
|
|
r := n.Index
|
|
|
|
|
|
|
|
n.Index = walkExpr(n.Index, init)
|
|
|
|
|
|
|
|
// if range of type cannot exceed static array bound,
|
|
|
|
// disable bounds check.
|
|
|
|
if n.Bounded() {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
t := n.X.Type()
|
|
|
|
if t != nil && t.IsPtr() {
|
|
|
|
t = t.Elem()
|
|
|
|
}
|
|
|
|
if t.IsArray() {
|
|
|
|
n.SetBounded(bounded(r, t.NumElem()))
|
|
|
|
if base.Flag.LowerM != 0 && n.Bounded() && !ir.IsConst(n.Index, constant.Int) {
|
|
|
|
base.Warn("index bounds check elided")
|
|
|
|
}
|
|
|
|
} else if ir.IsConst(n.X, constant.String) {
|
|
|
|
n.SetBounded(bounded(r, int64(len(ir.StringVal(n.X)))))
|
|
|
|
if base.Flag.LowerM != 0 && n.Bounded() && !ir.IsConst(n.Index, constant.Int) {
|
|
|
|
base.Warn("index bounds check elided")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2021-04-19 17:37:25 -04:00
|
|
|
// mapKeyArg returns an expression for key that is suitable to be passed
|
2021-05-24 12:15:17 +07:00
|
|
|
// as the key argument for runtime map* functions.
|
2021-04-19 17:37:25 -04:00
|
|
|
// n is is the map indexing or delete Node (to provide Pos).
|
2021-05-24 12:15:17 +07:00
|
|
|
func mapKeyArg(fast int, n, key ir.Node, assigned bool) ir.Node {
|
|
|
|
if fast == mapslow {
|
2021-04-19 17:37:25 -04:00
|
|
|
// standard version takes key by reference.
|
2021-05-24 12:15:17 +07:00
|
|
|
// orderState.expr made sure key is addressable.
|
2021-04-19 17:37:25 -04:00
|
|
|
return typecheck.NodAddr(key)
|
2021-05-24 12:15:17 +07:00
|
|
|
}
|
|
|
|
if assigned {
|
|
|
|
// mapassign does distinguish pointer vs. integer key.
|
|
|
|
return key
|
|
|
|
}
|
|
|
|
// mapaccess and mapdelete don't distinguish pointer vs. integer key.
|
|
|
|
switch fast {
|
2021-04-19 17:37:25 -04:00
|
|
|
case mapfast32ptr:
|
|
|
|
return ir.NewConvExpr(n.Pos(), ir.OCONVNOP, types.Types[types.TUINT32], key)
|
|
|
|
case mapfast64ptr:
|
|
|
|
return ir.NewConvExpr(n.Pos(), ir.OCONVNOP, types.Types[types.TUINT64], key)
|
|
|
|
default:
|
|
|
|
// fast version takes key by value.
|
|
|
|
return key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// walkIndexMap walks an OINDEXMAP node.
|
2021-05-24 12:15:17 +07:00
|
|
|
// It replaces m[k] with *map{access1,assign}(maptype, m, &k)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func walkIndexMap(n *ir.IndexExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
n.Index = walkExpr(n.Index, init)
|
|
|
|
map_ := n.X
|
|
|
|
t := map_.Type()
|
2021-05-24 12:15:17 +07:00
|
|
|
fast := mapfast(t)
|
|
|
|
key := mapKeyArg(fast, n, n.Index, n.Assigned)
|
2022-06-14 16:07:46 -07:00
|
|
|
args := []ir.Node{reflectdata.IndexMapRType(base.Pos, n), map_, key}
|
2021-05-24 12:15:17 +07:00
|
|
|
|
|
|
|
var mapFn ir.Node
|
|
|
|
switch {
|
|
|
|
case n.Assigned:
|
|
|
|
mapFn = mapfn(mapassign[fast], t, false)
|
|
|
|
case t.Elem().Size() > zeroValSize:
|
|
|
|
args = append(args, reflectdata.ZeroAddr(t.Elem().Size()))
|
|
|
|
mapFn = mapfn("mapaccess1_fat", t, true)
|
|
|
|
default:
|
|
|
|
mapFn = mapfn(mapaccess1[fast], t, false)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
2021-05-24 12:15:17 +07:00
|
|
|
call := mkcall1(mapFn, nil, init, args...)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
call.SetType(types.NewPtr(t.Elem()))
|
|
|
|
call.MarkNonNil() // mapaccess1* and mapassign always return non-nil pointers.
|
|
|
|
star := ir.NewStarExpr(base.Pos, call)
|
|
|
|
star.SetType(t.Elem())
|
|
|
|
star.SetTypecheck(1)
|
|
|
|
return star
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkLogical walks an OANDAND or OOROR node.
|
|
|
|
func walkLogical(n *ir.LogicalExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
|
|
|
|
// cannot put side effects from n.Right on init,
|
|
|
|
// because they cannot run before n.Left is checked.
|
|
|
|
// save elsewhere and store on the eventual n.Right.
|
|
|
|
var ll ir.Nodes
|
|
|
|
|
|
|
|
n.Y = walkExpr(n.Y, &ll)
|
|
|
|
n.Y = ir.InitExpr(ll, n.Y)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkSend walks an OSEND node.
|
|
|
|
func walkSend(n *ir.SendStmt, init *ir.Nodes) ir.Node {
|
|
|
|
n1 := n.Value
|
|
|
|
n1 = typecheck.AssignConv(n1, n.Chan.Type().Elem(), "chan send")
|
|
|
|
n1 = walkExpr(n1, init)
|
|
|
|
n1 = typecheck.NodAddr(n1)
|
|
|
|
return mkcall1(chanfn("chansend1", 2, n.Chan.Type()), nil, init, n.Chan, n1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
|
|
|
|
func walkSlice(n *ir.SliceExpr, init *ir.Nodes) ir.Node {
|
2021-08-27 20:07:00 +07:00
|
|
|
n.X = walkExpr(n.X, init)
|
2020-12-23 06:06:31 -08:00
|
|
|
n.Low = walkExpr(n.Low, init)
|
|
|
|
if n.Low != nil && ir.IsZero(n.Low) {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Reduce x[0:j] to x[:j] and x[0:j:k] to x[:j:k].
|
2020-12-23 06:06:31 -08:00
|
|
|
n.Low = nil
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
2020-12-23 06:06:31 -08:00
|
|
|
n.High = walkExpr(n.High, init)
|
|
|
|
n.Max = walkExpr(n.Max, init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
if n.Op().IsSlice3() {
|
2020-12-23 06:06:31 -08:00
|
|
|
if n.Max != nil && n.Max.Op() == ir.OCAP && ir.SameSafeExpr(n.X, n.Max.(*ir.UnaryExpr).X) {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Reduce x[i:j:cap(x)] to x[i:j].
|
|
|
|
if n.Op() == ir.OSLICE3 {
|
|
|
|
n.SetOp(ir.OSLICE)
|
|
|
|
} else {
|
|
|
|
n.SetOp(ir.OSLICEARR)
|
|
|
|
}
|
|
|
|
return reduceSlice(n)
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
return reduceSlice(n)
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkSliceHeader walks an OSLICEHEADER node.
|
|
|
|
func walkSliceHeader(n *ir.SliceHeaderExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.Ptr = walkExpr(n.Ptr, init)
|
2020-12-23 05:40:11 -08:00
|
|
|
n.Len = walkExpr(n.Len, init)
|
|
|
|
n.Cap = walkExpr(n.Cap, init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2022-08-16 17:52:13 +08:00
|
|
|
// walkStringHeader walks an OSTRINGHEADER node.
|
|
|
|
func walkStringHeader(n *ir.StringHeaderExpr, init *ir.Nodes) ir.Node {
|
|
|
|
n.Ptr = walkExpr(n.Ptr, init)
|
|
|
|
n.Len = walkExpr(n.Len, init)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// TODO(josharian): combine this with its caller and simplify
|
|
|
|
func reduceSlice(n *ir.SliceExpr) ir.Node {
|
2020-12-23 06:06:31 -08:00
|
|
|
if n.High != nil && n.High.Op() == ir.OLEN && ir.SameSafeExpr(n.X, n.High.(*ir.UnaryExpr).X) {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Reduce x[i:len(x)] to x[i:].
|
2020-12-23 06:06:31 -08:00
|
|
|
n.High = nil
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
2020-12-23 06:06:31 -08:00
|
|
|
if (n.Op() == ir.OSLICE || n.Op() == ir.OSLICESTR) && n.Low == nil && n.High == nil {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Reduce x[:] to x.
|
|
|
|
if base.Debug.Slice > 0 {
|
|
|
|
base.Warn("slice: omit slice operation")
|
|
|
|
}
|
|
|
|
return n.X
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// return 1 if integer n must be in range [0, max), 0 otherwise
|
|
|
|
func bounded(n ir.Node, max int64) bool {
|
|
|
|
if n.Type() == nil || !n.Type().IsInteger() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
sign := n.Type().IsSigned()
|
2021-08-26 12:11:14 -07:00
|
|
|
bits := int32(8 * n.Type().Size())
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
if ir.IsSmallIntConst(n) {
|
|
|
|
v := ir.Int64Val(n)
|
|
|
|
return 0 <= v && v < max
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Op() {
|
|
|
|
case ir.OAND, ir.OANDNOT:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
v := int64(-1)
|
|
|
|
switch {
|
|
|
|
case ir.IsSmallIntConst(n.X):
|
|
|
|
v = ir.Int64Val(n.X)
|
|
|
|
case ir.IsSmallIntConst(n.Y):
|
|
|
|
v = ir.Int64Val(n.Y)
|
|
|
|
if n.Op() == ir.OANDNOT {
|
|
|
|
v = ^v
|
|
|
|
if !sign {
|
|
|
|
v &= 1<<uint(bits) - 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if 0 <= v && v < max {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
case ir.OMOD:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
if !sign && ir.IsSmallIntConst(n.Y) {
|
|
|
|
v := ir.Int64Val(n.Y)
|
|
|
|
if 0 <= v && v <= max {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
case ir.ODIV:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
if !sign && ir.IsSmallIntConst(n.Y) {
|
|
|
|
v := ir.Int64Val(n.Y)
|
|
|
|
for bits > 0 && v >= 2 {
|
|
|
|
bits--
|
|
|
|
v >>= 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
case ir.ORSH:
|
|
|
|
n := n.(*ir.BinaryExpr)
|
|
|
|
if !sign && ir.IsSmallIntConst(n.Y) {
|
|
|
|
v := ir.Int64Val(n.Y)
|
|
|
|
if v > int64(bits) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
bits -= int32(v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !sign && bits <= 62 && 1<<uint(bits) <= max {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-06-24 22:39:16 +07:00
|
|
|
// usemethod checks calls for uses of reflect.Type.{Method,MethodByName}.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func usemethod(n *ir.CallExpr) {
|
2021-02-12 16:30:51 -05:00
|
|
|
// Don't mark reflect.(*rtype).Method, etc. themselves in the reflect package.
|
|
|
|
// Those functions may be alive via the itab, which should not cause all methods
|
|
|
|
// alive. We only want to mark their callers.
|
|
|
|
if base.Ctxt.Pkgpath == "reflect" {
|
|
|
|
switch ir.CurFunc.Nname.Sym().Name { // TODO: is there a better way than hardcoding the names?
|
|
|
|
case "(*rtype).Method", "(*rtype).MethodByName", "(*interfaceType).Method", "(*interfaceType).MethodByName":
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-24 22:39:16 +07:00
|
|
|
dot, ok := n.X.(*ir.SelectorExpr)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Looking for either direct method calls and interface method calls of:
|
|
|
|
// reflect.Type.Method - func(int) reflect.Method
|
|
|
|
// reflect.Type.MethodByName - func(string) (reflect.Method, bool)
|
|
|
|
var pKind types.Kind
|
|
|
|
|
|
|
|
switch dot.Sel.Name {
|
|
|
|
case "Method":
|
|
|
|
pKind = types.TINT
|
|
|
|
case "MethodByName":
|
|
|
|
pKind = types.TSTRING
|
|
|
|
default:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
t := dot.Selection.Type
|
|
|
|
if t.NumParams() != 1 || t.Params().Field(0).Type.Kind() != pKind {
|
|
|
|
return
|
|
|
|
}
|
2021-07-22 23:54:19 +07:00
|
|
|
switch t.NumResults() {
|
|
|
|
case 1:
|
|
|
|
// ok
|
|
|
|
case 2:
|
|
|
|
if t.Results().Field(1).Type.Kind() != types.TBOOL {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
default:
|
2021-06-24 22:39:16 +07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-06-25 14:01:54 +07:00
|
|
|
// Check that first result type is "reflect.Method". Note that we have to check sym name and sym package
|
|
|
|
// separately, as we can't check for exact string "reflect.Method" reliably (e.g., see #19028 and #38515).
|
2021-06-24 22:39:16 +07:00
|
|
|
if s := t.Results().Field(0).Type.Sym(); s != nil && s.Name == "Method" && types.IsReflectPkg(s.Pkg) {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
ir.CurFunc.SetReflectMethod(true)
|
|
|
|
// The LSym is initialized at this point. We need to set the attribute on the LSym.
|
|
|
|
ir.CurFunc.LSym.Set(obj.AttrReflectMethod, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func usefield(n *ir.SelectorExpr) {
|
2021-04-15 23:05:49 -04:00
|
|
|
if !buildcfg.Experiment.FieldTrack {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Op() {
|
|
|
|
default:
|
|
|
|
base.Fatalf("usefield %v", n.Op())
|
|
|
|
|
|
|
|
case ir.ODOT, ir.ODOTPTR:
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
field := n.Selection
|
|
|
|
if field == nil {
|
|
|
|
base.Fatalf("usefield %v %v without paramfld", n.X.Type(), n.Sel)
|
|
|
|
}
|
2020-12-26 18:02:33 -08:00
|
|
|
if field.Sym != n.Sel {
|
|
|
|
base.Fatalf("field inconsistency: %v != %v", field.Sym, n.Sel)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
if !strings.Contains(field.Note, "go:\"track\"") {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
outer := n.X.Type()
|
|
|
|
if outer.IsPtr() {
|
|
|
|
outer = outer.Elem()
|
|
|
|
}
|
|
|
|
if outer.Sym() == nil {
|
|
|
|
base.Errorf("tracked field must be in named struct type")
|
|
|
|
}
|
|
|
|
|
|
|
|
sym := reflectdata.TrackSym(outer, field)
|
|
|
|
if ir.CurFunc.FieldTrack == nil {
|
2020-12-28 19:14:39 -08:00
|
|
|
ir.CurFunc.FieldTrack = make(map[*obj.LSym]struct{})
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
ir.CurFunc.FieldTrack[sym] = struct{}{}
|
|
|
|
}
|