iface: todo

This commit is contained in:
xushiwei
2024-05-25 11:57:09 +08:00
parent c7abc03fee
commit 980a537930
6 changed files with 49 additions and 77 deletions

View File

@@ -74,3 +74,9 @@ func Printf(format *Char, __llgo_va_list ...any) Int
//go:linkname Fprintf C.fprintf //go:linkname Fprintf C.fprintf
func Fprintf(fp FilePtr, format *Char, __llgo_va_list ...any) Int func Fprintf(fp FilePtr, format *Char, __llgo_va_list ...any) Int
//go:linkname Fwrite C.fwrite
func Fwrite(data Pointer, size, count uintptr, fp FilePtr) uintptr
//go:linkname Fputc C.fputc
func Fputc(c Int, fp FilePtr) Int

Binary file not shown.

View File

@@ -13,11 +13,6 @@ type eface struct {
data unsafe.Pointer data unsafe.Pointer
} }
/*
func efaceOf(ep *any) *eface {
return (*eface)(unsafe.Pointer(ep))
}
type iface struct { type iface struct {
tab *itab tab *itab
data unsafe.Pointer data unsafe.Pointer
@@ -35,6 +30,11 @@ type itab struct {
fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter. fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
} }
/*
func efaceOf(ep *any) *eface {
return (*eface)(unsafe.Pointer(ep))
}
func MakeInterface(inter *InterfaceType, typ *Type, data unsafe.Pointer) Interface { func MakeInterface(inter *InterfaceType, typ *Type, data unsafe.Pointer) Interface {
tab := &itab{inter: inter, _type: typ, hash: 0, fun: [1]uintptr{0}} tab := &itab{inter: inter, _type: typ, hash: 0, fun: [1]uintptr{0}}
return Interface{ return Interface{

View File

@@ -1,70 +0,0 @@
/*
* 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 runtime
import (
"unsafe"
"github.com/goplus/llgo/internal/abi"
)
type Eface = eface
// -----------------------------------------------------------------------------
func MakeAnyIntptr(typ *Type, data uintptr) Eface {
return eface{
_type: typ, data: unsafe.Pointer(data),
}
}
func MakeAnyString(data string) Eface {
typ := basicTypes[abi.String]
return eface{
_type: typ, data: unsafe.Pointer(&data),
}
}
func I2Int(v Eface, t *Type) uintptr {
if v._type == t {
return uintptr(v.data)
}
panic("I2Int: type mismatch")
}
func CheckI2Int(v Eface, t *Type) (uintptr, bool) {
if v._type == t {
return uintptr(v.data), true
}
return 0, false
}
func I2String(v Eface) string {
if v._type.Kind() == abi.String {
return *(*string)(v.data)
}
panic("I2String: type mismatch")
}
func CheckI2String(v Eface) (string, bool) {
if v._type.Kind() == abi.String {
return *(*string)(v.data), true
}
return "", false
}
// -----------------------------------------------------------------------------

View File

@@ -7,7 +7,7 @@ package runtime
import ( import (
"unsafe" "unsafe"
"github.com/goplus/llgo/c" "github.com/goplus/llgo/internal/runtime/c"
) )
func PrintByte(v byte) { func PrintByte(v byte) {

View File

@@ -22,11 +22,47 @@ import (
"github.com/goplus/llgo/internal/abi" "github.com/goplus/llgo/internal/abi"
) )
// ----------------------------------------------------------------------------- type (
Eface = eface
Iface = iface
Itab = itab
)
type Kind = abi.Kind type Kind = abi.Kind
type Type = abi.Type type Type = abi.Type
type InterfaceType = abi.InterfaceType
// -----------------------------------------------------------------------------
// Interface returns an interface type.
func Interface(pkgPath string) *Type {
// TODO(xsw): pkgPath
// npkg := abi.NewName(pkgPath, "", false, false)
ret := &abi.InterfaceType{
Type: Type{
Size_: unsafe.Sizeof(eface{}),
Hash: uint32(abi.Interface), // TODO(xsw): hash
Kind_: uint8(abi.Interface),
},
//PkgPath: npkg,
Methods: nil,
}
return &ret.Type
}
// NewItab returns a new itab.
func NewItab(inter *InterfaceType, typ *Type) *Itab {
return &itab{
inter: inter,
_type: typ,
hash: typ.Hash,
//fun: nil, TODO(xsw)
}
}
// -----------------------------------------------------------------------------
func Basic(kind Kind) *Type { func Basic(kind Kind) *Type {
return basicTypes[kind] return basicTypes[kind]
} }