You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/09/11 23:14:02 UTC
[6/7] lucy-clownfish git commit: Fix refcounting error in Go arg
conversion.
Fix refcounting error in Go arg conversion.
Fix reversed logic for applying decrefs.
* If the arg is decremented but only unwrapped, add a decref.
* If the arg is not decremented but is converted using GoToClownfish
(which returns an incremented value), add a decref.
Then, remove the spurious extra incref in GoToClownfish (a memory leak
in many cases) which had balanced out the extra decref.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/b0049db2
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/b0049db2
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/b0049db2
Branch: refs/heads/master
Commit: b0049db2a1c0c4c8046855bd18075961f33b0f13
Parents: bd9f043
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Aug 28 19:25:24 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Sep 8 19:09:25 2015 -0700
----------------------------------------------------------------------
compiler/src/CFCGoFunc.c | 2 +-
runtime/go/clownfish/clownfish.go | 27 ++++++++-------------------
2 files changed, 9 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b0049db2/compiler/src/CFCGoFunc.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCGoFunc.c b/compiler/src/CFCGoFunc.c
index 0528c11..1d94f04 100644
--- a/compiler/src/CFCGoFunc.c
+++ b/compiler/src/CFCGoFunc.c
@@ -170,7 +170,7 @@ S_prep_start(CFCParcel *parcel, const char *name, CFCClass *invoker,
nullable ? "true" : "false");
converted = CFCUtil_cat(converted, conversion, NULL);
FREEMEM(conversion);
- if (CFCType_decremented(type)) {
+ if (!CFCType_decremented(type)) {
converted = CFCUtil_cat(converted,
"\tdefer C.cfish_decref(unsafe.Pointer(",
go_name, "CF))\n", NULL);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b0049db2/runtime/go/clownfish/clownfish.go
----------------------------------------------------------------------
diff --git a/runtime/go/clownfish/clownfish.go b/runtime/go/clownfish/clownfish.go
index 140f1f2..2cb012f 100644
--- a/runtime/go/clownfish/clownfish.go
+++ b/runtime/go/clownfish/clownfish.go
@@ -260,55 +260,44 @@ func GoToClownfish(value interface{}, class unsafe.Pointer, nullable bool) unsaf
}
// Convert the value according to its type if possible.
- var converted unsafe.Pointer
switch v := value.(type) {
case string:
if klass == C.CFISH_STRING || klass == C.CFISH_OBJ {
- converted = goToString(value, nullable)
+ return goToString(value, nullable)
}
case []byte:
if klass == C.CFISH_BLOB || klass == C.CFISH_OBJ {
- converted = goToBlob(value, nullable)
+ return goToBlob(value, nullable)
}
case int, uint, uintptr, int64, int32, int16, int8, uint64, uint32, uint16, uint8:
if klass == C.CFISH_INTEGER || klass == C.CFISH_OBJ {
- converted = goToInteger(value, nullable)
+ return goToInteger(value, nullable)
}
case float32, float64:
if klass == C.CFISH_FLOAT || klass == C.CFISH_OBJ {
- converted = goToFloat(value, nullable)
+ return goToFloat(value, nullable)
}
case bool:
if klass == C.CFISH_BOOLEAN || klass == C.CFISH_OBJ {
- converted = goToBoolean(value, nullable)
+ return goToBoolean(value, nullable)
}
case []interface{}:
if klass == C.CFISH_VECTOR || klass == C.CFISH_OBJ {
- converted = goToVector(value, nullable)
+ return goToVector(value, nullable)
}
case map[string]interface{}:
if klass == C.CFISH_HASH || klass == C.CFISH_OBJ {
- converted = goToHash(value, nullable)
+ return goToHash(value, nullable)
}
case Obj:
certifyCF(value, klass, nullable)
- converted = unsafe.Pointer(C.cfish_incref(unsafe.Pointer(v.TOPTR())))
+ return unsafe.Pointer(C.cfish_incref(unsafe.Pointer(v.TOPTR())))
case nil:
if nullable {
return nil
}
}
- if converted == nil {
- if nullable {
- return nil
- }
- } else {
- if C.cfish_Obj_is_a((*C.cfish_Obj)(converted), klass) {
- return unsafe.Pointer(C.cfish_incref(converted))
- }
- }
-
// Report a conversion error.
className := StringToGo(unsafe.Pointer(C.CFISH_Class_Get_Name(klass)))
panic(NewErr(fmt.Sprintf("Can't convert a %T to %s", value, className)))