Emit stricter vtable function-pointer type
diff --git a/internal/cgen/cgen.go b/internal/cgen/cgen.go
index cff1417..ca1b17b 100644
--- a/internal/cgen/cgen.go
+++ b/internal/cgen/cgen.go
@@ -403,7 +403,7 @@
buf.writes("typedef struct {\n\n")
for _, f := range builtInInterfaceMethods[qid] {
- if err := g.writeFuncSignature(buf, f, wfsCFuncPtr); err != nil {
+ if err := g.writeFuncSignature(buf, f, wfsCFuncPtrField); err != nil {
return err
}
buf.writes(";\n")
@@ -1157,7 +1157,11 @@
builtInTokenMap.ByName(iQID[1].Str(g.tm)),
}
for _, f := range builtInInterfaceMethods[altQID] {
- b.printf("(void*)(&%s%s__%s),\n",
+ b.writeb('(')
+ if err := g.writeFuncSignature(b, f, wfsCFuncPtrType); err != nil {
+ return err
+ }
+ b.printf(")(&%s%s__%s),\n",
g.pkgPrefix, nQID[1].Str(g.tm),
f.FuncName().Str(&builtInTokenMap),
)
diff --git a/internal/cgen/expr.go b/internal/cgen/expr.go
index d87a7e8..bbb2de3 100644
--- a/internal/cgen/expr.go
+++ b/internal/cgen/expr.go
@@ -363,9 +363,11 @@
o := n.Inner()
if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
b.writes("wuffs_base__slice_u8")
- b.writeb(' ')
- b.writes(varNamePrefix)
- b.writes(varName)
+ if varNamePrefix != "" {
+ b.writeb(' ')
+ b.writes(varNamePrefix)
+ b.writes(varName)
+ }
return nil
}
return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -374,9 +376,11 @@
o := n.Inner()
if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
b.writes("wuffs_base__table_u8")
- b.writeb(' ')
- b.writes(varNamePrefix)
- b.writes(varName)
+ if varNamePrefix != "" {
+ b.writeb(' ')
+ b.writes(varNamePrefix)
+ b.writes(varName)
+ }
return nil
}
return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -420,9 +424,11 @@
b.writeb('*')
}
- b.writeb(' ')
- b.writes(varNamePrefix)
- b.writes(varName)
+ if varNamePrefix != "" {
+ b.writeb(' ')
+ b.writes(varNamePrefix)
+ b.writes(varName)
+ }
x = n
for ; x != nil && x.IsArrayType(); x = x.Inner() {
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index 1a3cf0c..a6dac27 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -74,9 +74,10 @@
// writeFunctionSignature modes.
const (
- wfsCDecl = 0
- wfsCppDecl = 1
- wfsCFuncPtr = 2
+ wfsCDecl = 0
+ wfsCppDecl = 1
+ wfsCFuncPtrField = 2
+ wfsCFuncPtrType = 3
)
func (g *gen) writeFuncSignature(b *buffer, n *a.Func, wfs uint32) error {
@@ -91,7 +92,7 @@
case wfsCppDecl:
b.writes("inline ")
- case wfsCFuncPtr:
+ case wfsCFuncPtrField, wfsCFuncPtrType:
// No-op.
}
@@ -107,7 +108,7 @@
// The empty // comment makes clang-format place the function name at the
// start of a line.
- if wfs != wfsCFuncPtr {
+ if (wfs != wfsCFuncPtrField) && (wfs != wfsCFuncPtrType) {
b.writes("//\n")
}
@@ -128,14 +129,19 @@
b.writes(n.FuncName().Str(g.tm))
b.writeb('(')
- case wfsCFuncPtr:
+ case wfsCFuncPtrField, wfsCFuncPtrType:
b.writes("(*")
- b.writes(n.FuncName().Str(g.tm))
+ if wfs == wfsCFuncPtrField {
+ b.writes(n.FuncName().Str(g.tm))
+ }
b.writes(")(")
if n.Effect().Pure() {
b.writes("const ")
}
- b.writes("void* self")
+ b.writes("void*")
+ if wfs == wfsCFuncPtrField {
+ b.writes(" self")
+ }
comma = true
}
@@ -145,7 +151,11 @@
}
comma = true
o := o.AsField()
- if err := g.writeCTypeName(b, o.XType(), aPrefix, o.Name().Str(g.tm)); err != nil {
+ varNamePrefix, varName := "", ""
+ if wfs != wfsCFuncPtrType {
+ varNamePrefix, varName = aPrefix, o.Name().Str(g.tm)
+ }
+ if err := g.writeCTypeName(b, o.XType(), varNamePrefix, varName); err != nil {
return err
}
}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 1575010..ddaa006 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -4915,7 +4915,8 @@
const wuffs_base__hasher_u32__func_ptrs
wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
- (void*)(&wuffs_adler32__hasher__update_u32),
+ (uint32_t(*)(void*, wuffs_base__slice_u8))(
+ &wuffs_adler32__hasher__update_u32),
};
// ---------------- Initializer Implementations
@@ -5937,7 +5938,8 @@
const wuffs_base__hasher_u32__func_ptrs
wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
- (void*)(&wuffs_crc32__ieee_hasher__update_u32),
+ (uint32_t(*)(void*, wuffs_base__slice_u8))(
+ &wuffs_crc32__ieee_hasher__update_u32),
};
// ---------------- Initializer Implementations