iface: todo
This commit is contained in:
@@ -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.
@@ -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{
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user