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  }