aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Waller <p@pwaller.net>2014-12-26 17:33:04 +0000
committerPeter Waller <p@pwaller.net>2014-12-26 17:33:04 +0000
commita521f6d83a0c82047d49328a275acbb98b5dc4fe (patch)
treed19ea60f6112f64872d312e45e27ecc20e82bb51
parent8f5144afd65c59bc18cf069a0c9a95c18dc1c07e (diff)
parent2484deb259a31d4bb668339ad7de661a92989480 (diff)
downloadgl-a521f6d83a0c82047d49328a275acbb98b5dc4fe.tar.gz
Merge pull request #175 from simleb/master
Fix #174 ptr() panic on uintptr
-rw-r--r--gl.go8
-rw-r--r--gl_test.go36
2 files changed, 43 insertions, 1 deletions
diff --git a/gl.go b/gl.go
index 1763b05..82f237c 100644
--- a/gl.go
+++ b/gl.go
@@ -54,7 +54,7 @@ func freeString(ptr *C.GLchar) { C.free(unsafe.Pointer(ptr)) }
func ptr(v interface{}) unsafe.Pointer {
- if v == nil || reflect.ValueOf(v).IsNil() {
+ if v == nil {
return unsafe.Pointer(nil)
}
@@ -65,8 +65,14 @@ func ptr(v interface{}) unsafe.Pointer {
offset, _ := v.(uintptr)
return unsafe.Pointer(offset)
case reflect.Ptr:
+ if rv.IsNil() {
+ return unsafe.Pointer(nil)
+ }
et = rv.Elem()
case reflect.Slice:
+ if rv.IsNil() || rv.Len() == 0 {
+ return unsafe.Pointer(nil)
+ }
et = rv.Index(0)
default:
panic("type must be a pointer, a slice, uintptr or nil")
diff --git a/gl_test.go b/gl_test.go
new file mode 100644
index 0000000..8aba62c
--- /dev/null
+++ b/gl_test.go
@@ -0,0 +1,36 @@
+// Copyright 2012 The go-gl Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gl
+
+import (
+ "testing"
+ "unsafe"
+)
+
+func TestPtr(t *testing.T) {
+ // test nil
+ if p, q := unsafe.Pointer(nil), ptr(nil); p != q {
+ t.Fatalf("expected %#v, got %#v\n", p, q)
+ }
+
+ // test nil interface
+ var r interface{}
+ if p, q := unsafe.Pointer(nil), ptr(r); p != q {
+ t.Fatalf("expected %#v, got %#v\n", p, q)
+ }
+
+ // test nil pointer
+ var s *int
+ if p, q := unsafe.Pointer(nil), ptr(s); p != q {
+ t.Fatalf("expected %#v, got %#v\n", p, q)
+ }
+
+ // test uinptr
+ for _, n := range []uintptr{0, 1, 2, 42} {
+ if p, q := unsafe.Pointer(n), ptr(n); p != q {
+ t.Fatalf("expected %#v, got %#v\n", p, q)
+ }
+ }
+}