diff options
author | Peter Waller <p@pwaller.net> | 2014-12-26 17:33:04 +0000 |
---|---|---|
committer | Peter Waller <p@pwaller.net> | 2014-12-26 17:33:04 +0000 |
commit | a521f6d83a0c82047d49328a275acbb98b5dc4fe (patch) | |
tree | d19ea60f6112f64872d312e45e27ecc20e82bb51 | |
parent | 8f5144afd65c59bc18cf069a0c9a95c18dc1c07e (diff) | |
parent | 2484deb259a31d4bb668339ad7de661a92989480 (diff) | |
download | gl-a521f6d83a0c82047d49328a275acbb98b5dc4fe.tar.gz |
Merge pull request #175 from simleb/master
Fix #174 ptr() panic on uintptr
-rw-r--r-- | gl.go | 8 | ||||
-rw-r--r-- | gl_test.go | 36 |
2 files changed, 43 insertions, 1 deletions
@@ -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) + } + } +} |