@@ -21,14 +21,19 @@ func init() {
21
21
}
22
22
23
23
var syscallModule js.Object
24
+ var alreadyTriedToLoad = false
24
25
25
26
func syscall (name string ) js.Object {
26
27
defer func () {
27
28
if err := recover (); err != nil {
28
- panic ( " system calls not available, see https://github.com/gopherjs/gopherjs/blob/master/doc/syscalls.md" )
29
+ println ( "warning: system calls not available, see https://github.com/gopherjs/gopherjs/blob/master/doc/syscalls.md" )
29
30
}
30
31
}()
31
32
if syscallModule == nil {
33
+ if alreadyTriedToLoad {
34
+ return nil
35
+ }
36
+ alreadyTriedToLoad = true
32
37
require := js .Global .Get ("require" )
33
38
if require .IsUndefined () {
34
39
syscallHandler := js .Global .Get ("$syscall" )
@@ -43,23 +48,35 @@ func syscall(name string) js.Object {
43
48
}
44
49
45
50
func Syscall (trap , a1 , a2 , a3 uintptr ) (r1 , r2 uintptr , err Errno ) {
46
- r := syscall ("Syscall" ).Invoke (trap , a1 , a2 , a3 )
47
- return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
51
+ if f := syscall ("Syscall" ); f != nil {
52
+ r := f .Invoke (trap , a1 , a2 , a3 )
53
+ return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
54
+ }
55
+ return 0 , 0 , EACCES
48
56
}
49
57
50
58
func Syscall6 (trap , a1 , a2 , a3 , a4 , a5 , a6 uintptr ) (r1 , r2 uintptr , err Errno ) {
51
- r := syscall ("Syscall6" ).Invoke (trap , a1 , a2 , a3 , a4 , a5 , a6 )
52
- return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
59
+ if f := syscall ("Syscall6" ); f != nil {
60
+ r := f .Invoke (trap , a1 , a2 , a3 , a4 , a5 , a6 )
61
+ return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
62
+ }
63
+ return 0 , 0 , EACCES
53
64
}
54
65
55
66
func RawSyscall (trap , a1 , a2 , a3 uintptr ) (r1 , r2 uintptr , err Errno ) {
56
- r := syscall ("Syscall" ).Invoke (trap , a1 , a2 , a3 )
57
- return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
67
+ if f := syscall ("Syscall" ); f != nil {
68
+ r := f .Invoke (trap , a1 , a2 , a3 )
69
+ return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
70
+ }
71
+ return 0 , 0 , EACCES
58
72
}
59
73
60
74
func RawSyscall6 (trap , a1 , a2 , a3 , a4 , a5 , a6 uintptr ) (r1 , r2 uintptr , err Errno ) {
61
- r := syscall ("Syscall6" ).Invoke (trap , a1 , a2 , a3 , a4 , a5 , a6 )
62
- return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
75
+ if f := syscall ("Syscall6" ); f != nil {
76
+ r := f .Invoke (trap , a1 , a2 , a3 , a4 , a5 , a6 )
77
+ return uintptr (r .Index (0 ).Int ()), uintptr (r .Index (1 ).Int ()), Errno (r .Index (2 ).Int ())
78
+ }
79
+ return 0 , 0 , EACCES
63
80
}
64
81
65
82
func BytePtrFromString (s string ) (* byte , error ) {
0 commit comments