github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/compiler/natives/src/syscall/legacy.go (about) 1 //go:build legacy_syscall 2 3 package syscall 4 5 import ( 6 "github.com/gopherjs/gopherjs/js" 7 ) 8 9 var ( 10 syscallModule *js.Object 11 alreadyTriedToLoad = false 12 minusOne = -1 13 ) 14 15 var warningPrinted = false 16 17 func printWarning() { 18 if !warningPrinted { 19 js.Global.Get("console").Call("error", "warning: system calls not available, see https://github.com/gopherjs/gopherjs/blob/master/doc/syscalls.md") 20 } 21 warningPrinted = true 22 } 23 24 func syscallByName(name string) *js.Object { 25 defer recover() // return nil if recovered 26 27 if syscallModule == nil { 28 if alreadyTriedToLoad { 29 return nil 30 } 31 alreadyTriedToLoad = true 32 require := js.Global.Get("require") 33 if require == js.Undefined { 34 panic("") 35 } 36 syscallModule = require.Invoke("syscall") 37 } 38 return syscallModule.Get(name) 39 } 40 41 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { 42 if f := syscallByName("Syscall"); f != nil { 43 r := f.Invoke(trap, a1, a2, a3) 44 return uintptr(r.Index(0).Int()), uintptr(r.Index(1).Int()), Errno(r.Index(2).Int()) 45 } 46 printWarning() 47 return uintptr(minusOne), 0, ENOSYS 48 } 49 50 func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { 51 if f := syscallByName("Syscall6"); f != nil { 52 r := f.Invoke(trap, a1, a2, a3, a4, a5, a6) 53 return uintptr(r.Index(0).Int()), uintptr(r.Index(1).Int()), Errno(r.Index(2).Int()) 54 } 55 if trap != 202 { // kern.osrelease on OS X, happens in init of "os" package 56 printWarning() 57 } 58 return uintptr(minusOne), 0, ENOSYS 59 } 60 61 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { 62 if f := syscallByName("Syscall"); f != nil { 63 r := f.Invoke(trap, a1, a2, a3) 64 return uintptr(r.Index(0).Int()), uintptr(r.Index(1).Int()), Errno(r.Index(2).Int()) 65 } 66 printWarning() 67 return uintptr(minusOne), 0, ENOSYS 68 } 69 70 func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { 71 if f := syscallByName("Syscall"); f != nil { 72 r := f.Invoke(trap, a1, a2, a3) 73 return uintptr(r.Index(0).Int()), uintptr(r.Index(1).Int()) 74 } 75 printWarning() 76 return uintptr(minusOne), 0 77 } 78 79 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { 80 if f := syscallByName("Syscall6"); f != nil { 81 r := f.Invoke(trap, a1, a2, a3, a4, a5, a6) 82 return uintptr(r.Index(0).Int()), uintptr(r.Index(1).Int()), Errno(r.Index(2).Int()) 83 } 84 printWarning() 85 return uintptr(minusOne), 0, ENOSYS 86 }