@@ -62,6 +62,7 @@ import (
6262 "path/filepath"
6363 "runtime"
6464 "sort"
65+ "strconv"
6566 "strings"
6667 "text/template"
6768)
@@ -542,9 +543,47 @@ func (f *Fn) ParamPrintList() string {
542543 return join (f .Params , func (p * Param ) string { return fmt .Sprintf (`"%s=", %s, ` , p .Name , p .Name ) }, `", ", ` )
543544}
544545
545- // SyscallN returns a string representing the SyscallN function.
546- func (f * Fn ) SyscallN () string {
547- return syscalldot () + "SyscallN"
546+ // ParamCount return number of syscall parameters for function f.
547+ func (f * Fn ) ParamCount () int {
548+ n := 0
549+ for _ , p := range f .Params {
550+ n += len (p .SyscallArgList ())
551+ }
552+ return n
553+ }
554+
555+ // SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/...
556+ // to use. It returns parameter count for correspondent SyscallX function.
557+ func (f * Fn ) SyscallParamCount () int {
558+ n := f .ParamCount ()
559+ switch {
560+ case n <= 3 :
561+ return 3
562+ case n <= 6 :
563+ return 6
564+ case n <= 9 :
565+ return 9
566+ case n <= 12 :
567+ return 12
568+ case n <= 15 :
569+ return 15
570+ case n <= 42 : // current SyscallN limit
571+ return n
572+ default :
573+ panic ("too many arguments to system call" )
574+ }
575+ }
576+
577+ // Syscall determines which SyscallX function to use for function f.
578+ func (f * Fn ) Syscall () string {
579+ c := f .SyscallParamCount ()
580+ if c == 3 {
581+ return syscalldot () + "Syscall"
582+ }
583+ if c > 15 {
584+ return syscalldot () + "SyscallN"
585+ }
586+ return syscalldot () + "Syscall" + strconv .Itoa (c )
548587}
549588
550589// SyscallParamList returns source code for SyscallX parameters for function f.
@@ -553,12 +592,9 @@ func (f *Fn) SyscallParamList() string {
553592 for _ , p := range f .Params {
554593 a = append (a , p .SyscallArgList ()... )
555594 }
556-
557- // Check if the number exceeds the current SyscallN limit
558- if len (a ) > 42 {
559- panic ("too many arguments to system call" )
595+ for len (a ) < f .SyscallParamCount () {
596+ a = append (a , "0" )
560597 }
561-
562598 return strings .Join (a , ", " )
563599}
564600
@@ -979,7 +1015,7 @@ func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{
9791015
9801016{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}}
9811017
982- {{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.SyscallN }}(proc{{.DLLFuncName}}.Addr(), {{.SyscallParamList}}){{end}}
1018+ {{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall }}(proc{{.DLLFuncName}}.Addr(),{{if le .ParamCount 15}} {{.ParamCount}},{{end}} {{.SyscallParamList}}){{end}}
9831019
9841020{{define "tmpvarsreadback"}}{{range .Params}}{{if .TmpVarReadbackCode}}
9851021{{.TmpVarReadbackCode}}{{end}}{{end}}{{end}}
0 commit comments