diff --git a/internal/runtime/c/c.go b/internal/runtime/c/c.go index c26c8748..eb502d92 100644 --- a/internal/runtime/c/c.go +++ b/internal/runtime/c/c.go @@ -74,3 +74,9 @@ func Printf(format *Char, __llgo_va_list ...any) Int //go:linkname Fprintf C.fprintf 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 diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 4187e819..bd66305d 100644 Binary files a/internal/runtime/llgo_autogen.lla and b/internal/runtime/llgo_autogen.lla differ diff --git a/internal/runtime/runtime2.go b/internal/runtime/runtime2.go index 027c408f..69d80ae1 100644 --- a/internal/runtime/runtime2.go +++ b/internal/runtime/runtime2.go @@ -13,11 +13,6 @@ type eface struct { data unsafe.Pointer } -/* -func efaceOf(ep *any) *eface { - return (*eface)(unsafe.Pointer(ep)) -} - type iface struct { tab *itab data unsafe.Pointer @@ -35,6 +30,11 @@ type itab struct { 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 { tab := &itab{inter: inter, _type: typ, hash: 0, fun: [1]uintptr{0}} return Interface{ diff --git a/internal/runtime/z_eface.go b/internal/runtime/z_eface.go deleted file mode 100644 index a0f96d03..00000000 --- a/internal/runtime/z_eface.go +++ /dev/null @@ -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 -} - -// ----------------------------------------------------------------------------- diff --git a/internal/runtime/z_print.go b/internal/runtime/z_print.go index 7aeca7f3..27a47ac7 100644 --- a/internal/runtime/z_print.go +++ b/internal/runtime/z_print.go @@ -7,7 +7,7 @@ package runtime import ( "unsafe" - "github.com/goplus/llgo/c" + "github.com/goplus/llgo/internal/runtime/c" ) func PrintByte(v byte) { diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index e28dd638..93eb6420 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -22,11 +22,47 @@ import ( "github.com/goplus/llgo/internal/abi" ) -// ----------------------------------------------------------------------------- +type ( + Eface = eface + Iface = iface + Itab = itab +) type Kind = abi.Kind 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 { return basicTypes[kind] }