mirror of
https://github.com/golang/go
synced 2024-11-22 03:14:41 -07:00
cgo: support export for built-in types
This change doesn't pay attention to structs so they still cannot be exported, see Issue 2552. Fixes #2462. R=dvyukov, rsc, iant CC=golang-dev https://golang.org/cl/5487058
This commit is contained in:
parent
16bf7d9e82
commit
7be6229f9f
@ -16,6 +16,7 @@ CGOFILES=\
|
|||||||
issue1222.go\
|
issue1222.go\
|
||||||
issue1328.go\
|
issue1328.go\
|
||||||
issue1560.go\
|
issue1560.go\
|
||||||
|
issue2462.go\
|
||||||
duplicate_symbol.go\
|
duplicate_symbol.go\
|
||||||
|
|
||||||
CGO_OFILES=\
|
CGO_OFILES=\
|
||||||
|
@ -128,9 +128,9 @@ func testMultipleAssign(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
uint = (C.uint)(0)
|
cuint = (C.uint)(0)
|
||||||
ulong C.ulong
|
culong C.ulong
|
||||||
char C.char
|
cchar C.char
|
||||||
)
|
)
|
||||||
|
|
||||||
type Context struct {
|
type Context struct {
|
||||||
|
102
misc/cgo/test/issue2462.go
Normal file
102
misc/cgo/test/issue2462.go
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package cgotest
|
||||||
|
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
//export exportbyte
|
||||||
|
func exportbyte() byte {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportbool
|
||||||
|
func exportbool() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportrune
|
||||||
|
func exportrune() rune {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exporterror
|
||||||
|
func exporterror() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportint
|
||||||
|
func exportint() int {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuint
|
||||||
|
func exportuint() uint {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuintptr
|
||||||
|
func exportuintptr() uintptr {
|
||||||
|
return (uintptr)(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportint8
|
||||||
|
func exportint8() int8 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuint8
|
||||||
|
func exportuint8() uint8 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportint16
|
||||||
|
func exportint16() int16 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuint16
|
||||||
|
func exportuint16() uint16 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportint32
|
||||||
|
func exportint32() int32 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuint32
|
||||||
|
func exportuint32() uint32 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportint64
|
||||||
|
func exportint64() int64 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportuint64
|
||||||
|
func exportuint64() uint64 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportfloat32
|
||||||
|
func exportfloat32() float32 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportfloat64
|
||||||
|
func exportfloat64() float64 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportcomplex64
|
||||||
|
func exportcomplex64() complex64 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//export exportcomplex128
|
||||||
|
func exportcomplex128() complex128 {
|
||||||
|
return 0
|
||||||
|
}
|
@ -599,8 +599,11 @@ func c(repr string, args ...interface{}) *TypeRepr {
|
|||||||
|
|
||||||
// Map predeclared Go types to Type.
|
// Map predeclared Go types to Type.
|
||||||
var goTypes = map[string]*Type{
|
var goTypes = map[string]*Type{
|
||||||
|
"bool": {Size: 1, Align: 1, C: c("uchar")},
|
||||||
|
"byte": {Size: 1, Align: 1, C: c("uchar")},
|
||||||
"int": {Size: 4, Align: 4, C: c("int")},
|
"int": {Size: 4, Align: 4, C: c("int")},
|
||||||
"uint": {Size: 4, Align: 4, C: c("uint")},
|
"uint": {Size: 4, Align: 4, C: c("uint")},
|
||||||
|
"rune": {Size: 4, Align: 4, C: c("int")},
|
||||||
"int8": {Size: 1, Align: 1, C: c("schar")},
|
"int8": {Size: 1, Align: 1, C: c("schar")},
|
||||||
"uint8": {Size: 1, Align: 1, C: c("uchar")},
|
"uint8": {Size: 1, Align: 1, C: c("uchar")},
|
||||||
"int16": {Size: 2, Align: 2, C: c("short")},
|
"int16": {Size: 2, Align: 2, C: c("short")},
|
||||||
@ -632,7 +635,7 @@ func (p *Package) cgoType(e ast.Expr) *Type {
|
|||||||
case *ast.FuncType:
|
case *ast.FuncType:
|
||||||
return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("void*")}
|
return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("void*")}
|
||||||
case *ast.InterfaceType:
|
case *ast.InterfaceType:
|
||||||
return &Type{Size: 3 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
|
return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
|
||||||
case *ast.MapType:
|
case *ast.MapType:
|
||||||
return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoMap")}
|
return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoMap")}
|
||||||
case *ast.ChanType:
|
case *ast.ChanType:
|
||||||
@ -666,6 +669,9 @@ func (p *Package) cgoType(e ast.Expr) *Type {
|
|||||||
if t.Name == "string" {
|
if t.Name == "string" {
|
||||||
return &Type{Size: p.PtrSize + 4, Align: p.PtrSize, C: c("GoString")}
|
return &Type{Size: p.PtrSize + 4, Align: p.PtrSize, C: c("GoString")}
|
||||||
}
|
}
|
||||||
|
if t.Name == "error" {
|
||||||
|
return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
|
||||||
|
}
|
||||||
if r, ok := goTypes[t.Name]; ok {
|
if r, ok := goTypes[t.Name]; ok {
|
||||||
if r.Align > p.PtrSize {
|
if r.Align > p.PtrSize {
|
||||||
r.Align = p.PtrSize
|
r.Align = p.PtrSize
|
||||||
|
Loading…
Reference in New Issue
Block a user