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(-)
----------------------------------------------------------------------