Commit 7be6229f authored by Maxim Pimenov's avatar Maxim Pimenov Committed by Ian Lance Taylor

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
parent 16bf7d9e
...@@ -16,6 +16,7 @@ CGOFILES=\ ...@@ -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) { ...@@ -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 {
......
// 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 { ...@@ -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 { ...@@ -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 { ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment