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/10/07 03:52:57 UTC
[1/2] lucy-clownfish git commit: Better nil-checking in GoToClownfish.
Repository: lucy-clownfish
Updated Branches:
refs/heads/master 6dc5deb06 -> a94a2ec57
Better nil-checking in GoToClownfish.
It's not enough to check nil for the supplied `interface{}` value. You
also have to check nil for certain Go types inside a type switch, in
case the type portion of the interface value is non-nil but the value
portion is nil.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/770e4ce0
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/770e4ce0
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/770e4ce0
Branch: refs/heads/master
Commit: 770e4ce096a4f84efd94d2b60001b0dbb42cdfb7
Parents: 6dc5deb
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Oct 6 18:45:47 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Oct 6 18:45:47 2015 -0700
----------------------------------------------------------------------
runtime/go/clownfish/clownfish.go | 60 ++++++++++++++++++++++------------
1 file changed, 39 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/770e4ce0/runtime/go/clownfish/clownfish.go
----------------------------------------------------------------------
diff --git a/runtime/go/clownfish/clownfish.go b/runtime/go/clownfish/clownfish.go
index 6b4dc28..a881cda 100644
--- a/runtime/go/clownfish/clownfish.go
+++ b/runtime/go/clownfish/clownfish.go
@@ -343,12 +343,18 @@ func goToString(value interface{}, nullable bool) unsafe.Pointer {
func goToBlob(value interface{}, nullable bool) unsafe.Pointer {
switch v := value.(type) {
case []byte:
- size := C.size_t(len(v))
- var buf *C.char = nil
- if size > 0 {
- buf = ((*C.char)(unsafe.Pointer(&v[0])))
+ if v == nil {
+ if nullable {
+ return nil
+ }
+ } else {
+ size := C.size_t(len(v))
+ var buf *C.char = nil
+ if size > 0 {
+ buf = ((*C.char)(unsafe.Pointer(&v[0])))
+ }
+ return unsafe.Pointer(C.cfish_Blob_new(buf, size))
}
- return unsafe.Pointer(C.cfish_Blob_new(buf, size))
case Obj:
certifyCF(v, C.CFISH_BLOB, nullable)
return unsafe.Pointer(C.cfish_incref(unsafe.Pointer(v.TOPTR())))
@@ -434,13 +440,19 @@ func goToBoolean(value interface{}, nullable bool) unsafe.Pointer {
func goToVector(value interface{}, nullable bool) unsafe.Pointer {
switch v := value.(type) {
case []interface{}:
- size := len(v)
- vec := C.cfish_Vec_new(C.size_t(size))
- for i := 0; i < size; i++ {
- elem := GoToClownfish(v[i], nil, true)
- C.CFISH_Vec_Store(vec, C.size_t(i), (*C.cfish_Obj)(elem))
+ if v == nil {
+ if nullable {
+ return nil
+ }
+ } else {
+ size := len(v)
+ vec := C.cfish_Vec_new(C.size_t(size))
+ for i := 0; i < size; i++ {
+ elem := GoToClownfish(v[i], nil, true)
+ C.CFISH_Vec_Store(vec, C.size_t(i), (*C.cfish_Obj)(elem))
+ }
+ return unsafe.Pointer(vec)
}
- return unsafe.Pointer(vec)
case Obj:
certifyCF(v, C.CFISH_VECTOR, nullable)
return unsafe.Pointer(C.cfish_incref(unsafe.Pointer(v.TOPTR())))
@@ -452,17 +464,23 @@ func goToVector(value interface{}, nullable bool) unsafe.Pointer {
func goToHash(value interface{}, nullable bool) unsafe.Pointer {
switch v := value.(type) {
case map[string]interface{}:
- size := len(v)
- hash := C.cfish_Hash_new(C.size_t(size))
- for key, val := range v {
- newVal := GoToClownfish(val, nil, true)
- keySize := len(key)
- keyStr := C.CString(key)
- cfKey := C.cfish_Str_new_steal_utf8(keyStr, C.size_t(keySize))
- defer C.cfish_dec_refcount(unsafe.Pointer(cfKey))
- C.CFISH_Hash_Store(hash, cfKey, (*C.cfish_Obj)(newVal))
+ if v == nil {
+ if nullable {
+ return nil
+ }
+ } else {
+ size := len(v)
+ hash := C.cfish_Hash_new(C.size_t(size))
+ for key, val := range v {
+ newVal := GoToClownfish(val, nil, true)
+ keySize := len(key)
+ keyStr := C.CString(key)
+ cfKey := C.cfish_Str_new_steal_utf8(keyStr, C.size_t(keySize))
+ defer C.cfish_dec_refcount(unsafe.Pointer(cfKey))
+ C.CFISH_Hash_Store(hash, cfKey, (*C.cfish_Obj)(newVal))
+ }
+ return unsafe.Pointer(hash)
}
- return unsafe.Pointer(hash)
case Obj:
certifyCF(v, C.CFISH_HASH, nullable)
return unsafe.Pointer(C.cfish_incref(unsafe.Pointer(v.TOPTR())))
[2/2] lucy-clownfish git commit: Merge branch
'CLOWNFISH-59-go-nullable-args'
Posted by ma...@apache.org.
Merge branch 'CLOWNFISH-59-go-nullable-args'
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/a94a2ec5
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/a94a2ec5
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/a94a2ec5
Branch: refs/heads/master
Commit: a94a2ec5770f012c5c4092238b3c9bcbc6df5031
Parents: 6dc5deb 770e4ce
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Oct 6 18:51:30 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Oct 6 18:51:30 2015 -0700
----------------------------------------------------------------------
runtime/go/clownfish/clownfish.go | 60 ++++++++++++++++++++++------------
1 file changed, 39 insertions(+), 21 deletions(-)
----------------------------------------------------------------------