patch: syscall
This commit is contained in:
@@ -208,6 +208,7 @@ Here are the Go packages that can be imported correctly:
|
|||||||
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
|
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
|
||||||
* [math/bits](https://pkg.go.dev/math/bits)
|
* [math/bits](https://pkg.go.dev/math/bits)
|
||||||
* [math](https://pkg.go.dev/math)
|
* [math](https://pkg.go.dev/math)
|
||||||
|
* [syscall](https://pkg.go.dev/syscall) (partially)
|
||||||
* [sync](https://pkg.go.dev/sync) (partially)
|
* [sync](https://pkg.go.dev/sync) (partially)
|
||||||
* [sync/atomic](https://pkg.go.dev/sync/atomic) (partially)
|
* [sync/atomic](https://pkg.go.dev/sync/atomic) (partially)
|
||||||
|
|
||||||
|
|||||||
11
_demo/syscall/syscall.go
Normal file
11
_demo/syscall/syscall.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
wd, err := syscall.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
println("cwd:", wd)
|
||||||
|
}
|
||||||
@@ -498,7 +498,7 @@ func (p *context) ensureLoaded(pkgTypes *types.Package) *types.Package {
|
|||||||
|
|
||||||
func pkgKindByPath(pkgPath string) int {
|
func pkgKindByPath(pkgPath string) int {
|
||||||
switch pkgPath {
|
switch pkgPath {
|
||||||
case "syscall", "runtime/cgo", "unsafe":
|
case "runtime/cgo", "unsafe":
|
||||||
return PkgDeclOnly
|
return PkgDeclOnly
|
||||||
}
|
}
|
||||||
return PkgNormal
|
return PkgNormal
|
||||||
@@ -520,9 +520,8 @@ func ignoreName(name string) bool {
|
|||||||
*/
|
*/
|
||||||
return strings.HasPrefix(name, "internal/") || strings.HasPrefix(name, "crypto/") ||
|
return strings.HasPrefix(name, "internal/") || strings.HasPrefix(name, "crypto/") ||
|
||||||
strings.HasPrefix(name, "arena.") || strings.HasPrefix(name, "maps.") ||
|
strings.HasPrefix(name, "arena.") || strings.HasPrefix(name, "maps.") ||
|
||||||
strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "syscall.") ||
|
strings.HasPrefix(name, "time.") || strings.HasPrefix(name, "runtime/") ||
|
||||||
strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.") ||
|
strings.HasPrefix(name, "plugin.") || strings.HasPrefix(name, "reflect.")
|
||||||
strings.HasPrefix(name, "runtime/")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -724,6 +724,7 @@ var hasAltPkg = map[string]none{
|
|||||||
"math": {},
|
"math": {},
|
||||||
"sync": {},
|
"sync": {},
|
||||||
"sync/atomic": {},
|
"sync/atomic": {},
|
||||||
|
"syscall": {},
|
||||||
"os": {},
|
"os": {},
|
||||||
"runtime": {},
|
"runtime": {},
|
||||||
}
|
}
|
||||||
|
|||||||
46
internal/lib/syscall/syscall.go
Normal file
46
internal/lib/syscall/syscall.go
Normal 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)
|
||||||
|
}
|
||||||
12
ssa/expr.go
12
ssa/expr.go
@@ -883,11 +883,6 @@ func (b Builder) Do(da DoAction, fn Expr, args ...Expr) (ret Expr) {
|
|||||||
// Go spec (excluding "make" and "new").
|
// Go spec (excluding "make" and "new").
|
||||||
func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
|
func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
|
||||||
switch fn {
|
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":
|
case "len":
|
||||||
if len(args) == 1 {
|
if len(args) == 1 {
|
||||||
arg := args[0]
|
arg := args[0]
|
||||||
@@ -946,6 +941,13 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
|
|||||||
return b.Recover()
|
return b.Recover()
|
||||||
case "print", "println":
|
case "print", "println":
|
||||||
return b.PrintEx(fn == "println", args...)
|
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)
|
panic("todo: " + fn)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user