patch: syscall

This commit is contained in:
xushiwei
2024-06-20 02:55:26 +08:00
parent 0c1ef72285
commit 607deaa3c4
6 changed files with 69 additions and 9 deletions

View File

@@ -208,6 +208,7 @@ Here are the Go packages that can be imported correctly:
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
* [math/bits](https://pkg.go.dev/math/bits)
* [math](https://pkg.go.dev/math)
* [syscall](https://pkg.go.dev/syscall) (partially)
* [sync](https://pkg.go.dev/sync) (partially)
* [sync/atomic](https://pkg.go.dev/sync/atomic) (partially)

11
_demo/syscall/syscall.go Normal file
View File

@@ -0,0 +1,11 @@
package main
import "syscall"
func main() {
wd, err := syscall.Getwd()
if err != nil {
panic(err)
}
println("cwd:", wd)
}

View File

@@ -498,7 +498,7 @@ func (p *context) ensureLoaded(pkgTypes *types.Package) *types.Package {
func pkgKindByPath(pkgPath string) int {
switch pkgPath {
case "syscall", "runtime/cgo", "unsafe":
case "runtime/cgo", "unsafe":
return PkgDeclOnly
}
return PkgNormal
@@ -520,9 +520,8 @@ func ignoreName(name string) bool {
*/
return strings.HasPrefix(name, "internal/") || strings.HasPrefix(name, "crypto/") ||
strings.HasPrefix(name, "arena.") || strings.HasPrefix(name, "maps.") ||
strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "syscall.") ||
strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.") ||
strings.HasPrefix(name, "runtime/")
strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "runtime/") ||
strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.")
}
// -----------------------------------------------------------------------------

View File

@@ -724,6 +724,7 @@ var hasAltPkg = map[string]none{
"math": {},
"sync": {},
"sync/atomic": {},
"syscall": {},
"os": {},
"runtime": {},
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package syscall
// llgo:skipall
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/os"
)
func errnoErr(errno c.Int) error {
panic("todo")
}
func Getcwd(buf []byte) (n int, err error) {
ptr := unsafe.Pointer(unsafe.SliceData(buf))
ret := os.Getcwd(ptr, uintptr(len(buf)))
if ret != nil {
return int(c.Strlen(ret)), nil
}
return 0, errnoErr(os.Errno)
}
func Getwd() (string, error) {
wd := os.Getcwd(c.Alloca(os.PATH_MAX), os.PATH_MAX)
if wd != nil {
return c.GoString(wd), nil
}
return "", errnoErr(os.Errno)
}

View File

@@ -883,11 +883,6 @@ func (b Builder) Do(da DoAction, fn Expr, args ...Expr) (ret Expr) {
// Go spec (excluding "make" and "new").
func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
switch fn {
case "String": // unsafe.String
return b.unsafeString(args[0].impl, args[1].impl)
case "Slice": // unsafe.Slice
size := args[1].impl
return b.unsafeSlice(args[0], size, size)
case "len":
if len(args) == 1 {
arg := args[0]
@@ -946,6 +941,13 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
return b.Recover()
case "print", "println":
return b.PrintEx(fn == "println", args...)
case "String": // unsafe.String
return b.unsafeString(args[0].impl, args[1].impl)
case "Slice": // unsafe.Slice
size := args[1].impl
return b.unsafeSlice(args[0], size, size)
case "SliceData":
return b.SliceData(args[0]) // TODO(xsw): check return type
}
panic("todo: " + fn)
}