bind: support exported variables

basic types, struct*, interface.

TODO: error, non-pointer struct, pointer basic types, slice of bytes.

Update golang/go#12475.

Change-Id: I5ff91059b1f963b0cadb6f76cb0e12f7b6b98718
Reviewed-on: https://go-review.googlesource.com/15340
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Hyang-Ah (Hana) Kim 2015-10-01 22:04:03 -04:00 коммит произвёл Hyang-Ah Hana Kim
Родитель 7fe809f8e0
Коммит 45ed283c80
16 изменённых файлов: 1166 добавлений и 6 удалений

Просмотреть файл

@ -32,6 +32,7 @@ var tests = []string{
"testdata/issue12328.go",
"testdata/issue12403.go",
"testdata/try.go",
"testdata/vars.go",
}
var fset = token.NewFileSet()

Просмотреть файл

@ -192,6 +192,29 @@ func (g *goGen) genStruct(obj *types.TypeName, T *types.Struct) {
g.Printf("}\n\n")
}
func (g *goGen) genVar(o *types.Var) {
// TODO(hyangah): non-struct pointer types (*int), struct type.
v := fmt.Sprintf("%s.%s", g.pkg.Name(), o.Name())
// var I int
//
// func var_setI(out, in *seq.Buffer)
g.Printf("func var_set%s(out, in *seq.Buffer) {\n", o.Name())
g.Indent()
g.genRead("v", "in", o.Type())
g.Printf("%s = v\n", v)
g.Outdent()
g.Printf("}\n")
// func var_getI(out, in *seq.Buffer)
g.Printf("func var_get%s(out, in *seq.Buffer) {\n", o.Name())
g.Indent()
g.genWrite(v, "out", o.Type())
g.Outdent()
g.Printf("}\n")
}
func (g *goGen) genInterface(obj *types.TypeName) {
iface := obj.Type().(*types.Named).Underlying().(*types.Interface)
ifaceDesc := fmt.Sprintf("go.%s.%s", g.pkg.Name(), obj.Name())
@ -374,7 +397,7 @@ func (g *goGen) typeString(typ types.Type) string {
func (g *goGen) gen() error {
g.genPreamble()
var funcs []string
var funcs, vars []string
scope := g.pkg.Scope()
names := scope.Names()
@ -401,6 +424,9 @@ func (g *goGen) gen() error {
case *types.Interface:
g.genInterface(obj)
}
case *types.Var:
g.genVar(obj)
vars = append(vars, obj.Name())
case *types.Const:
default:
g.errorf("not yet supported, name for %v / %T", obj, obj)
@ -418,6 +444,18 @@ func (g *goGen) gen() error {
g.Printf("}\n")
}
if len(vars) > 0 {
g.Printf("func init() {\n")
g.Indent()
for _, name := range vars {
varDesc := fmt.Sprintf("%s.%s", g.pkg.Name(), name)
g.Printf("seq.Register(%q, %d, var_set%s)\n", varDesc, 1, name)
g.Printf("seq.Register(%q, %d, var_get%s)\n", varDesc, 2, name)
}
g.Outdent()
g.Printf("}\n")
}
if len(g.err) > 0 {
return g.err
}

Просмотреть файл

@ -459,6 +459,35 @@ func (g *javaGen) funcSignature(o *types.Func, static bool) error {
return nil
}
func (g *javaGen) genVar(o *types.Var) {
jType := g.javaType(o.Type())
varDesc := fmt.Sprintf("%s.%s", g.pkg.Name(), o.Name())
// setter
g.Printf("public static void set%s(%s v) {\n", o.Name(), jType)
g.Indent()
g.Printf("Seq in = new Seq();\n")
g.Printf("Seq out = new Seq();\n")
g.Printf("in.write%s;\n", seqWrite(o.Type(), "v"))
g.Printf("Seq.send(%q, 1, in, out);\n", varDesc)
g.Outdent()
g.Printf("}\n")
g.Printf("\n")
// getter
g.Printf("public static %s get%s() {\n", jType, o.Name())
g.Indent()
g.Printf("Seq in = new Seq();\n")
g.Printf("Seq out = new Seq();\n")
g.Printf("Seq.send(%q, 2, in, out);\n", varDesc)
g.Printf("%s ", jType)
g.genRead("v", "out", o.Type())
g.Printf("return v;\n")
g.Outdent()
g.Printf("}\n")
g.Printf("\n")
}
func (g *javaGen) genFunc(o *types.Func, method bool) {
if err := g.funcSignature(o, !method); err != nil {
g.errorf("%v", err)
@ -634,9 +663,11 @@ func (g *javaGen) gen() error {
g.Printf("public abstract class %s {\n", g.className())
g.Indent()
g.Printf("private %s() {} // uninstantiable\n\n", g.className())
var funcs []string
scope := g.pkg.Scope()
names := scope.Names()
var funcs []string
for _, name := range names {
obj := scope.Lookup(name)
if !obj.Exported() {
@ -663,6 +694,8 @@ func (g *javaGen) gen() error {
}
case *types.Const:
g.genConst(o)
case *types.Var:
g.genVar(o)
default:
g.errorf("unsupported exported type: %T", obj)
}

Просмотреть файл

@ -29,6 +29,7 @@ type objcGen struct {
funcs []*types.Func
names []*types.TypeName
constants []*types.Const
vars []*types.Var
}
func (g *objcGen) init() {
@ -56,9 +57,10 @@ func (g *objcGen) init() {
continue
}
g.constants = append(g.constants, obj)
case *types.Var:
g.vars = append(g.vars, obj)
default:
g.errorf("unsupported exported type for %s: %T", obj.Name(), obj)
// TODO(hyangah): *types.Var
}
}
}
@ -119,6 +121,14 @@ func (g *objcGen) genH() error {
g.Printf("\n")
}
// var
for _, obj := range g.vars {
objcType := g.objcType(obj.Type())
g.Printf("FOUNDATION_EXPORT void %s_set%s(%s v);\n", g.namePrefix, obj.Name(), objcType)
g.Printf("FOUNDATION_EXPORT %s %s%s();\n", objcType, g.namePrefix, obj.Name())
g.Printf("\n")
}
// static functions.
for _, obj := range g.funcs {
g.genFuncH(obj)
@ -186,6 +196,15 @@ func (g *objcGen) genM() error {
if len(g.constants) > 0 {
g.Printf("\n")
}
// vars
for _, o := range g.vars {
g.genVarM(o)
}
if len(g.vars) > 0 {
g.Printf("\n")
}
// global functions.
for _, obj := range g.funcs {
g.genFuncM(obj)
@ -210,6 +229,35 @@ func (g *objcGen) genM() error {
return nil
}
func (g *objcGen) genVarM(o *types.Var) {
varDesc := fmt.Sprintf("%q", g.pkg.Name()+"."+o.Name())
objcType := g.objcType(o.Type())
// setter
s1 := &funcSummary{
name: g.namePrefix + "_set" + o.Name(),
ret: "void",
params: []paramInfo{{typ: o.Type(), name: "v"}},
}
g.Printf("void %s(%s v) {\n", s1.name, objcType)
g.Indent()
g.genFunc(varDesc, "1", s1, false)
g.Outdent()
g.Printf("}\n\n")
// getter
s2 := &funcSummary{
name: g.namePrefix + o.Name(),
ret: objcType,
retParams: []paramInfo{{typ: o.Type(), name: "ret"}},
}
g.Printf("%s %s() {\n", s2.ret, s2.name)
g.Indent()
g.genFunc(varDesc, "2", s2, false)
g.Outdent()
g.Printf("}\n\n")
}
func (g *objcGen) genConstM(o *types.Const) {
cName := fmt.Sprintf("%s%s", g.namePrefix, o.Name())
cType := g.objcType(o.Type())

Просмотреть файл

@ -33,6 +33,34 @@ public class SeqTest extends AndroidTestCase {
assertEquals("const MaxFloat32", 3.40282346638528859811704183484516925440e+38, Testpkg.MaxFloat32, 0.0001);
assertEquals("const Log2E", 1/0.693147180559945309417232121458176568075500134360255254120680009, Testpkg.Log2E, 0.0001);
}
public void testVar() {
assertEquals("var StringVar", "a string var", Testpkg.getStringVar());
String newStringVar = "a new string var";
Testpkg.setStringVar(newStringVar);
assertEquals("var StringVar", newStringVar, Testpkg.getStringVar());
assertEquals("var IntVar", 77, Testpkg.getIntVar());
long newIntVar = 777;
Testpkg.setIntVar(newIntVar);
assertEquals("var IntVar", newIntVar, Testpkg.getIntVar());
Testpkg.S s0 = Testpkg.getStructVar();
assertEquals("var StructVar", "a struct var", s0.String());
Testpkg.S s1 = Testpkg.New();
Testpkg.setStructVar(s1);
assertEquals("var StructVar", s1.String(), Testpkg.getStructVar().String());
// TODO(hyangah): handle nil return value (translate to null)
AnI obj = new AnI();
obj.name = "this is an I";
Testpkg.setInterfaceVar(obj);
assertEquals("var InterfaceVar", obj.String(), Testpkg.getInterfaceVar().String());
}
public void testAssets() {
String want = "Hello, Assets.\n";
String got = Testpkg.ReadAsset();

Просмотреть файл

@ -39,6 +39,13 @@ const (
Log2E = math.Log2E
)
var (
StringVar = "a string var"
IntVar = 77
StructVar = &S{name: "a struct var"}
InterfaceVar I
)
type I interface {
F()
@ -104,8 +111,10 @@ func finalizeInner(a *int) {
numSCollected++
}
var seq = 0
func New() *S {
s := &S{innerObj: new(int), name: "new"}
s := &S{innerObj: new(int), name: fmt.Sprintf("new%d", seq)}
runtime.SetFinalizer(s.innerObj, finalizeInner)
return s
}

Просмотреть файл

@ -271,6 +271,50 @@ void testIssue12403() {
}
}
void testVar() {
NSString *s = GoTestpkgStringVar();
if (![s isEqualToString:@"a string var"]) {
ERROR(@"GoTestpkgStringVar = %@, want 'a string var'", s);
}
s = @"a new string var";
GoTestpkg_setStringVar(s);
NSString *s2 = GoTestpkgStringVar();
if (![s2 isEqualToString:s]) {
ERROR(@"GoTestpkgStringVar = %@, want %@", s2, s);
}
int64_t i = GoTestpkgIntVar();
if (i != 77) {
ERROR(@"GoTestpkgIntVar = %lld, want 77", i);
}
GoTestpkg_setIntVar(777);
i = GoTestpkgIntVar();
if (i != 777) {
ERROR(@"GoTestpkgIntVar = %lld, want 777", i);
}
GoTestpkgNode *n0 = GoTestpkgStructVar();
if (![n0.V isEqualToString:@"a struct var"]) {
ERROR(@"GoTestpkgStructVar = %@, want 'a struct var'", n0.V);
}
GoTestpkgNode *n1 = GoTestpkgNewNode(@"a new struct var");
GoTestpkg_setStructVar(n1);
GoTestpkgNode *n2 = GoTestpkgStructVar();
if (![n2.V isEqualToString:@"a new struct var"]) {
ERROR(@"GoTestpkgStructVar = %@, want 'a new struct var'", n2.V);
}
Number *num = [[Number alloc] init];
num.value = 12345;
GoTestpkg_setInterfaceVar(num);
id<GoTestpkgI> iface = GoTestpkgInterfaceVar();
int64_t x = [iface Times:10];
int64_t y = [num Times:10];
if (x != y) {
ERROR(@"GoTestpkgInterfaceVar Times 10 = %lld, want %lld", x, y);
}
}
// Invokes functions and object methods defined in Testpkg.h.
//
// TODO(hyangah): apply testing framework (e.g. XCTestCase)
@ -286,8 +330,6 @@ int main(void) {
ERROR(@"GoTestpkgSum(31, 21) = %lld, want 52\n", sum);
}
testConst();
testHello(@"세계"); // korean, utf-8, world.
unichar t[] = {
@ -315,7 +357,11 @@ int main(void) {
numI);
}
testConst();
testIssue12307();
testVar();
}
fprintf(stderr, "%s\n", err ? "FAIL" : "PASS");

Просмотреть файл

@ -158,6 +158,26 @@ func proxy_Int(out, in *seq.Buffer) {
testpkg.Int(param_x)
}
func var_setIntVar(out, in *seq.Buffer) {
v := in.ReadInt()
testpkg.IntVar = v
}
func var_getIntVar(out, in *seq.Buffer) {
out.WriteInt(testpkg.IntVar)
}
func var_setInterfaceVar(out, in *seq.Buffer) {
var v testpkg.I
v_ref := in.ReadRef()
if v_ref.Num < 0 { // go object
v = v_ref.Get().(testpkg.I)
} else { // foreign object
v = (*proxyI)(v_ref)
}
testpkg.InterfaceVar = v
}
func var_getInterfaceVar(out, in *seq.Buffer) {
out.WriteGoRef(testpkg.InterfaceVar)
}
func proxy_Multiply(out, in *seq.Buffer) {
param_idx := in.ReadInt32()
param_val := in.ReadInt32()
@ -312,6 +332,22 @@ func init() {
seq.Register(proxyS_Descriptor, proxyS_TryTwoStrings_Code, proxyS_TryTwoStrings)
}
func var_setStringVar(out, in *seq.Buffer) {
v := in.ReadString()
testpkg.StringVar = v
}
func var_getStringVar(out, in *seq.Buffer) {
out.WriteString(testpkg.StringVar)
}
func var_setStructVar(out, in *seq.Buffer) {
// Must be a Go object
v_ref := in.ReadRef()
v := v_ref.Get().(*testpkg.Node)
testpkg.StructVar = v
}
func var_getStructVar(out, in *seq.Buffer) {
out.WriteGoRef(testpkg.StructVar)
}
func proxy_Sum(out, in *seq.Buffer) {
param_x := in.ReadInt64()
param_y := in.ReadInt64()
@ -343,3 +379,13 @@ func init() {
seq.Register("testpkg", 16, proxy_Sum)
seq.Register("testpkg", 17, proxy_UnregisterI)
}
func init() {
seq.Register("testpkg.IntVar", 1, var_setIntVar)
seq.Register("testpkg.IntVar", 2, var_getIntVar)
seq.Register("testpkg.InterfaceVar", 1, var_setInterfaceVar)
seq.Register("testpkg.InterfaceVar", 2, var_getInterfaceVar)
seq.Register("testpkg.StringVar", 1, var_setStringVar)
seq.Register("testpkg.StringVar", 2, var_getStringVar)
seq.Register("testpkg.StructVar", 1, var_setStructVar)
seq.Register("testpkg.StructVar", 2, var_getStructVar)
}

Просмотреть файл

@ -56,6 +56,18 @@ FOUNDATION_EXPORT const int64_t GoTestpkgMinInt64;
FOUNDATION_EXPORT const float GoTestpkgSmallestNonzeroFloat32;
FOUNDATION_EXPORT const double GoTestpkgSmallestNonzeroFloat64;
FOUNDATION_EXPORT void GoTestpkg_setIntVar(int v);
FOUNDATION_EXPORT int GoTestpkgIntVar();
FOUNDATION_EXPORT void GoTestpkg_setInterfaceVar(id<GoTestpkgI> v);
FOUNDATION_EXPORT id<GoTestpkgI> GoTestpkgInterfaceVar();
FOUNDATION_EXPORT void GoTestpkg_setStringVar(NSString* v);
FOUNDATION_EXPORT NSString* GoTestpkgStringVar();
FOUNDATION_EXPORT void GoTestpkg_setStructVar(GoTestpkgNode* v);
FOUNDATION_EXPORT GoTestpkgNode* GoTestpkgStructVar();
FOUNDATION_EXPORT NSData* GoTestpkgBytesAppend(NSData* a, NSData* b);
FOUNDATION_EXPORT BOOL GoTestpkgCallIError(id<GoTestpkgI> i, BOOL triggerError, NSError** error);

Просмотреть файл

@ -312,6 +312,101 @@ const int64_t GoTestpkgMinInt64 = -9223372036854775807LL-1;
const float GoTestpkgSmallestNonzeroFloat32 = 0;
const double GoTestpkgSmallestNonzeroFloat64 = 5e-324;
void GoTestpkg_setIntVar(int v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt(&in_, v);
go_seq_send("testpkg.IntVar", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int GoTestpkgIntVar() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("testpkg.IntVar", 2, &in_, &out_);
int ret = go_seq_readInt(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoTestpkg_setInterfaceVar(id<GoTestpkgI> v) {
GoSeq in_ = {};
GoSeq out_ = {};
if ([(id<NSObject>)(v) isKindOfClass:[GoTestpkgI class]]) {
id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
go_seq_writeRef(&in_, v_proxy.ref);
} else {
go_seq_writeObjcRef(&in_, v);
}
go_seq_send("testpkg.InterfaceVar", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
id<GoTestpkgI> GoTestpkgInterfaceVar() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("testpkg.InterfaceVar", 2, &in_, &out_);
GoSeqRef* ret_ref = go_seq_readRef(&out_);
id<GoTestpkgI> ret = ret_ref.obj;
if (ret == NULL) {
ret = [[GoTestpkgI alloc] initWithRef:ret_ref];
}
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoTestpkg_setStringVar(NSString* v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeUTF8(&in_, v);
go_seq_send("testpkg.StringVar", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
NSString* GoTestpkgStringVar() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("testpkg.StringVar", 2, &in_, &out_);
NSString* ret = go_seq_readUTF8(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoTestpkg_setStructVar(GoTestpkgNode* v) {
GoSeq in_ = {};
GoSeq out_ = {};
if ([(id<NSObject>)(v) isKindOfClass:[GoTestpkgNode class]]) {
id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
go_seq_writeRef(&in_, v_proxy.ref);
} else {
go_seq_writeObjcRef(&in_, v);
}
go_seq_send("testpkg.StructVar", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
GoTestpkgNode* GoTestpkgStructVar() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("testpkg.StructVar", 2, &in_, &out_);
GoSeqRef* ret_ref = go_seq_readRef(&out_);
GoTestpkgNode* ret = ret_ref.obj;
if (ret == NULL) {
ret = [[GoTestpkgNode alloc] initWithRef:ret_ref];
}
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
NSData* GoTestpkgBytesAppend(NSData* a, NSData* b) {
GoSeq in_ = {};
GoSeq out_ = {};

Просмотреть файл

@ -32,6 +32,13 @@ const (
Log2E = math.Log2E
)
var (
StringVar = "a string var"
IntVar = 77
StructVar = &Node{V: "a struct var"}
InterfaceVar I
)
type I interface {
Times(v int32) int64
Error(triggerError bool) error

24
bind/testdata/vars.go поставляемый Normal file
Просмотреть файл

@ -0,0 +1,24 @@
package vars
var (
AString = "String"
AnInt = -1
AnInt8 int8 = 8
AnInt16 int16 = 16
AnInt32 int32 = 32
AnInt64 int64 = 64
AFloat = -2.0
AFloat32 float32 = 32.0
AFloat64 float64 = 64.0
ABool = true
AStructPtr *S
AnInterface I
)
type S struct{}
type I interface{}

145
bind/testdata/vars.go.golden поставляемый Normal file
Просмотреть файл

@ -0,0 +1,145 @@
// Package go_vars is an autogenerated binder stub for package vars.
// gobind -lang=go vars
//
// File is generated by gobind. Do not edit.
package go_vars
import (
"golang.org/x/mobile/bind/seq"
"vars"
)
func var_setABool(out, in *seq.Buffer) {
v := in.ReadBool()
vars.ABool = v
}
func var_getABool(out, in *seq.Buffer) {
out.WriteBool(vars.ABool)
}
func var_setAFloat(out, in *seq.Buffer) {
v := in.ReadFloat64()
vars.AFloat = v
}
func var_getAFloat(out, in *seq.Buffer) {
out.WriteFloat64(vars.AFloat)
}
func var_setAFloat32(out, in *seq.Buffer) {
v := in.ReadFloat32()
vars.AFloat32 = v
}
func var_getAFloat32(out, in *seq.Buffer) {
out.WriteFloat32(vars.AFloat32)
}
func var_setAFloat64(out, in *seq.Buffer) {
v := in.ReadFloat64()
vars.AFloat64 = v
}
func var_getAFloat64(out, in *seq.Buffer) {
out.WriteFloat64(vars.AFloat64)
}
func var_setAString(out, in *seq.Buffer) {
v := in.ReadString()
vars.AString = v
}
func var_getAString(out, in *seq.Buffer) {
out.WriteString(vars.AString)
}
func var_setAStructPtr(out, in *seq.Buffer) {
// Must be a Go object
v_ref := in.ReadRef()
v := v_ref.Get().(*vars.S)
vars.AStructPtr = v
}
func var_getAStructPtr(out, in *seq.Buffer) {
out.WriteGoRef(vars.AStructPtr)
}
func var_setAnInt(out, in *seq.Buffer) {
v := in.ReadInt()
vars.AnInt = v
}
func var_getAnInt(out, in *seq.Buffer) {
out.WriteInt(vars.AnInt)
}
func var_setAnInt16(out, in *seq.Buffer) {
v := in.ReadInt16()
vars.AnInt16 = v
}
func var_getAnInt16(out, in *seq.Buffer) {
out.WriteInt16(vars.AnInt16)
}
func var_setAnInt32(out, in *seq.Buffer) {
v := in.ReadInt32()
vars.AnInt32 = v
}
func var_getAnInt32(out, in *seq.Buffer) {
out.WriteInt32(vars.AnInt32)
}
func var_setAnInt64(out, in *seq.Buffer) {
v := in.ReadInt64()
vars.AnInt64 = v
}
func var_getAnInt64(out, in *seq.Buffer) {
out.WriteInt64(vars.AnInt64)
}
func var_setAnInt8(out, in *seq.Buffer) {
v := in.ReadInt8()
vars.AnInt8 = v
}
func var_getAnInt8(out, in *seq.Buffer) {
out.WriteInt8(vars.AnInt8)
}
func var_setAnInterface(out, in *seq.Buffer) {
var v vars.I
v_ref := in.ReadRef()
if v_ref.Num < 0 { // go object
v = v_ref.Get().(vars.I)
} else { // foreign object
v = (*proxyI)(v_ref)
}
vars.AnInterface = v
}
func var_getAnInterface(out, in *seq.Buffer) {
out.WriteGoRef(vars.AnInterface)
}
const (
proxyI_Descriptor = "go.vars.I"
)
type proxyI seq.Ref
const (
proxyS_Descriptor = "go.vars.S"
)
type proxyS seq.Ref
func init() {
}
func init() {
seq.Register("vars.ABool", 1, var_setABool)
seq.Register("vars.ABool", 2, var_getABool)
seq.Register("vars.AFloat", 1, var_setAFloat)
seq.Register("vars.AFloat", 2, var_getAFloat)
seq.Register("vars.AFloat32", 1, var_setAFloat32)
seq.Register("vars.AFloat32", 2, var_getAFloat32)
seq.Register("vars.AFloat64", 1, var_setAFloat64)
seq.Register("vars.AFloat64", 2, var_getAFloat64)
seq.Register("vars.AString", 1, var_setAString)
seq.Register("vars.AString", 2, var_getAString)
seq.Register("vars.AStructPtr", 1, var_setAStructPtr)
seq.Register("vars.AStructPtr", 2, var_getAStructPtr)
seq.Register("vars.AnInt", 1, var_setAnInt)
seq.Register("vars.AnInt", 2, var_getAnInt)
seq.Register("vars.AnInt16", 1, var_setAnInt16)
seq.Register("vars.AnInt16", 2, var_getAnInt16)
seq.Register("vars.AnInt32", 1, var_setAnInt32)
seq.Register("vars.AnInt32", 2, var_getAnInt32)
seq.Register("vars.AnInt64", 1, var_setAnInt64)
seq.Register("vars.AnInt64", 2, var_getAnInt64)
seq.Register("vars.AnInt8", 1, var_setAnInt8)
seq.Register("vars.AnInt8", 2, var_getAnInt8)
seq.Register("vars.AnInterface", 1, var_setAnInterface)
seq.Register("vars.AnInterface", 2, var_getAnInterface)
}

261
bind/testdata/vars.java.golden поставляемый Normal file
Просмотреть файл

@ -0,0 +1,261 @@
// Java class go.vars.Vars is a proxy for talking to a Go program.
// gobind -lang=java vars
//
// File is generated by gobind. Do not edit.
package go.vars;
import go.Seq;
public abstract class Vars {
private Vars() {} // uninstantiable
public static void setABool(boolean v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeBool(v);
Seq.send("vars.ABool", 1, in, out);
}
public static boolean getABool() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.ABool", 2, in, out);
boolean v = out.readBool();
return v;
}
public static void setAFloat(double v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeFloat64(v);
Seq.send("vars.AFloat", 1, in, out);
}
public static double getAFloat() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AFloat", 2, in, out);
double v = out.readFloat64();
return v;
}
public static void setAFloat32(float v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeFloat32(v);
Seq.send("vars.AFloat32", 1, in, out);
}
public static float getAFloat32() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AFloat32", 2, in, out);
float v = out.readFloat32();
return v;
}
public static void setAFloat64(double v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeFloat64(v);
Seq.send("vars.AFloat64", 1, in, out);
}
public static double getAFloat64() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AFloat64", 2, in, out);
double v = out.readFloat64();
return v;
}
public static void setAString(String v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeString(v);
Seq.send("vars.AString", 1, in, out);
}
public static String getAString() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AString", 2, in, out);
String v = out.readString();
return v;
}
public static void setAStructPtr(S v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeRef(v.ref());
Seq.send("vars.AStructPtr", 1, in, out);
}
public static S getAStructPtr() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AStructPtr", 2, in, out);
S v = new S(out.readRef());
return v;
}
public static void setAnInt(long v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeInt(v);
Seq.send("vars.AnInt", 1, in, out);
}
public static long getAnInt() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInt", 2, in, out);
long v = out.readInt();
return v;
}
public static void setAnInt16(short v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeInt16(v);
Seq.send("vars.AnInt16", 1, in, out);
}
public static short getAnInt16() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInt16", 2, in, out);
short v = out.readInt16();
return v;
}
public static void setAnInt32(int v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeInt32(v);
Seq.send("vars.AnInt32", 1, in, out);
}
public static int getAnInt32() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInt32", 2, in, out);
int v = out.readInt32();
return v;
}
public static void setAnInt64(long v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeInt64(v);
Seq.send("vars.AnInt64", 1, in, out);
}
public static long getAnInt64() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInt64", 2, in, out);
long v = out.readInt64();
return v;
}
public static void setAnInt8(byte v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeInt8(v);
Seq.send("vars.AnInt8", 1, in, out);
}
public static byte getAnInt8() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInt8", 2, in, out);
byte v = out.readInt8();
return v;
}
public static void setAnInterface(I v) {
Seq in = new Seq();
Seq out = new Seq();
in.writeRef(v.ref());
Seq.send("vars.AnInterface", 1, in, out);
}
public static I getAnInterface() {
Seq in = new Seq();
Seq out = new Seq();
Seq.send("vars.AnInterface", 2, in, out);
I v = new I.Proxy(out.readRef());
return v;
}
public interface I extends go.Seq.Object {
public static abstract class Stub implements I {
static final String DESCRIPTOR = "go.vars.I";
private final go.Seq.Ref ref;
public Stub() {
ref = go.Seq.createRef(this);
}
public go.Seq.Ref ref() { return ref; }
public void call(int code, go.Seq in, go.Seq out) {
switch (code) {
default:
throw new RuntimeException("unknown code: "+ code);
}
}
}
static final class Proxy implements I {
static final String DESCRIPTOR = Stub.DESCRIPTOR;
private go.Seq.Ref ref;
Proxy(go.Seq.Ref ref) { this.ref = ref; }
public go.Seq.Ref ref() { return ref; }
public void call(int code, go.Seq in, go.Seq out) {
throw new RuntimeException("cycle: cannot call proxy");
}
}
}
public static final class S implements go.Seq.Object {
private static final String DESCRIPTOR = "go.vars.S";
private go.Seq.Ref ref;
private S(go.Seq.Ref ref) { this.ref = ref; }
public go.Seq.Ref ref() { return ref; }
public void call(int code, go.Seq in, go.Seq out) {
throw new RuntimeException("internal error: cycle: cannot call concrete proxy");
}
@Override public boolean equals(Object o) {
if (o == null || !(o instanceof S)) {
return false;
}
S that = (S)o;
return true;
}
@Override public int hashCode() {
return java.util.Arrays.hashCode(new Object[] {});
}
@Override public String toString() {
StringBuilder b = new StringBuilder();
b.append("S").append("{");
return b.append("}").toString();
}
}
private static final String DESCRIPTOR = "vars";
}

59
bind/testdata/vars.objc.h.golden поставляемый Normal file
Просмотреть файл

@ -0,0 +1,59 @@
// Objective-C API for talking to vars Go package.
// gobind -lang=objc vars
//
// File is generated by gobind. Do not edit.
#ifndef __GoVars_H__
#define __GoVars_H__
#include <Foundation/Foundation.h>
@class GoVarsS;
@protocol GoVarsI
@end
@interface GoVarsS : NSObject {
}
@property(strong, readonly) id ref;
- (id)initWithRef:(id)ref;
@end
FOUNDATION_EXPORT void GoVars_setABool(BOOL v);
FOUNDATION_EXPORT BOOL GoVarsABool();
FOUNDATION_EXPORT void GoVars_setAFloat(double v);
FOUNDATION_EXPORT double GoVarsAFloat();
FOUNDATION_EXPORT void GoVars_setAFloat32(float v);
FOUNDATION_EXPORT float GoVarsAFloat32();
FOUNDATION_EXPORT void GoVars_setAFloat64(double v);
FOUNDATION_EXPORT double GoVarsAFloat64();
FOUNDATION_EXPORT void GoVars_setAString(NSString* v);
FOUNDATION_EXPORT NSString* GoVarsAString();
FOUNDATION_EXPORT void GoVars_setAStructPtr(GoVarsS* v);
FOUNDATION_EXPORT GoVarsS* GoVarsAStructPtr();
FOUNDATION_EXPORT void GoVars_setAnInt(int v);
FOUNDATION_EXPORT int GoVarsAnInt();
FOUNDATION_EXPORT void GoVars_setAnInt16(int16_t v);
FOUNDATION_EXPORT int16_t GoVarsAnInt16();
FOUNDATION_EXPORT void GoVars_setAnInt32(int32_t v);
FOUNDATION_EXPORT int32_t GoVarsAnInt32();
FOUNDATION_EXPORT void GoVars_setAnInt64(int64_t v);
FOUNDATION_EXPORT int64_t GoVarsAnInt64();
FOUNDATION_EXPORT void GoVars_setAnInt8(int8_t v);
FOUNDATION_EXPORT int8_t GoVarsAnInt8();
FOUNDATION_EXPORT void GoVars_setAnInterface(id<GoVarsI> v);
FOUNDATION_EXPORT id<GoVarsI> GoVarsAnInterface();
#endif

308
bind/testdata/vars.objc.m.golden поставляемый Normal file
Просмотреть файл

@ -0,0 +1,308 @@
// Objective-C API for talking to vars Go package.
// gobind -lang=objc vars
//
// File is generated by gobind. Do not edit.
#include "GoVars.h"
#include <Foundation/Foundation.h>
#include "seq.h"
static NSString* errDomain = @"go.vars";
@protocol goSeqRefInterface
-(GoSeqRef*) ref;
@end
#define _DESCRIPTOR_ "vars"
#define _GO_vars_I_DESCRIPTOR_ "go.vars.I"
@interface GoVarsI : NSObject <GoVarsI> {
}
@property(strong, readonly) id ref;
- (id)initWithRef:(id)ref;
@end
@implementation GoVarsI {
}
- (id)initWithRef:(id)ref {
self = [super init];
if (self) { _ref = ref; }
return self;
}
@end
static void proxyGoVarsI(id obj, int code, GoSeq* in, GoSeq* out) {
switch (code) {
default:
NSLog(@"unknown code %x for _GO_vars_I_DESCRIPTOR_", code);
}
}
#define _GO_vars_S_DESCRIPTOR_ "go.vars.S"
@implementation GoVarsS {
}
- (id)initWithRef:(id)ref {
self = [super init];
if (self) { _ref = ref; }
return self;
}
@end
void GoVars_setABool(BOOL v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeBool(&in_, v);
go_seq_send("vars.ABool", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
BOOL GoVarsABool() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.ABool", 2, &in_, &out_);
BOOL ret = go_seq_readBool(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAFloat(double v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeFloat64(&in_, v);
go_seq_send("vars.AFloat", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
double GoVarsAFloat() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AFloat", 2, &in_, &out_);
double ret = go_seq_readFloat64(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAFloat32(float v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeFloat32(&in_, v);
go_seq_send("vars.AFloat32", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
float GoVarsAFloat32() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AFloat32", 2, &in_, &out_);
float ret = go_seq_readFloat32(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAFloat64(double v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeFloat64(&in_, v);
go_seq_send("vars.AFloat64", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
double GoVarsAFloat64() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AFloat64", 2, &in_, &out_);
double ret = go_seq_readFloat64(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAString(NSString* v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeUTF8(&in_, v);
go_seq_send("vars.AString", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
NSString* GoVarsAString() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AString", 2, &in_, &out_);
NSString* ret = go_seq_readUTF8(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAStructPtr(GoVarsS* v) {
GoSeq in_ = {};
GoSeq out_ = {};
if ([(id<NSObject>)(v) isKindOfClass:[GoVarsS class]]) {
id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
go_seq_writeRef(&in_, v_proxy.ref);
} else {
go_seq_writeObjcRef(&in_, v);
}
go_seq_send("vars.AStructPtr", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
GoVarsS* GoVarsAStructPtr() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AStructPtr", 2, &in_, &out_);
GoSeqRef* ret_ref = go_seq_readRef(&out_);
GoVarsS* ret = ret_ref.obj;
if (ret == NULL) {
ret = [[GoVarsS alloc] initWithRef:ret_ref];
}
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInt(int v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt(&in_, v);
go_seq_send("vars.AnInt", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int GoVarsAnInt() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInt", 2, &in_, &out_);
int ret = go_seq_readInt(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInt16(int16_t v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt16(&in_, v);
go_seq_send("vars.AnInt16", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int16_t GoVarsAnInt16() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInt16", 2, &in_, &out_);
int16_t ret = go_seq_readInt16(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInt32(int32_t v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt32(&in_, v);
go_seq_send("vars.AnInt32", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int32_t GoVarsAnInt32() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInt32", 2, &in_, &out_);
int32_t ret = go_seq_readInt32(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInt64(int64_t v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt64(&in_, v);
go_seq_send("vars.AnInt64", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int64_t GoVarsAnInt64() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInt64", 2, &in_, &out_);
int64_t ret = go_seq_readInt64(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInt8(int8_t v) {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_writeInt8(&in_, v);
go_seq_send("vars.AnInt8", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
int8_t GoVarsAnInt8() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInt8", 2, &in_, &out_);
int8_t ret = go_seq_readInt8(&out_);
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
void GoVars_setAnInterface(id<GoVarsI> v) {
GoSeq in_ = {};
GoSeq out_ = {};
if ([(id<NSObject>)(v) isKindOfClass:[GoVarsI class]]) {
id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
go_seq_writeRef(&in_, v_proxy.ref);
} else {
go_seq_writeObjcRef(&in_, v);
}
go_seq_send("vars.AnInterface", 1, &in_, &out_);
go_seq_free(&in_);
go_seq_free(&out_);
}
id<GoVarsI> GoVarsAnInterface() {
GoSeq in_ = {};
GoSeq out_ = {};
go_seq_send("vars.AnInterface", 2, &in_, &out_);
GoSeqRef* ret_ref = go_seq_readRef(&out_);
id<GoVarsI> ret = ret_ref.obj;
if (ret == NULL) {
ret = [[GoVarsI alloc] initWithRef:ret_ref];
}
go_seq_free(&in_);
go_seq_free(&out_);
return ret;
}
__attribute__((constructor)) static void init() {
go_seq_register_proxy("go.vars.I", proxyGoVarsI);
}