@@ -3,7 +3,6 @@ package bbolt
33import (
44 "fmt"
55 "os"
6- "reflect"
76 "sort"
87 "unsafe"
98)
@@ -51,52 +50,46 @@ func (p *page) typ() string {
5150
5251// meta returns a pointer to the metadata section of the page.
5352func (p * page ) meta () * meta {
54- return (* meta )(unsafe . Pointer ( uintptr ( unsafe .Pointer (p )) + unsafe .Sizeof (* p )))
53+ return (* meta )(unsafeAdd ( unsafe .Pointer (p ), unsafe .Sizeof (* p )))
5554}
5655
5756// leafPageElement retrieves the leaf node by index
5857func (p * page ) leafPageElement (index uint16 ) * leafPageElement {
59- off := uintptr ( index ) * leafPageElementSize
60- return ( * leafPageElement )( unsafe . Pointer ( uintptr ( unsafe . Pointer ( p )) + unsafe . Sizeof ( * p ) + off ))
58+ return ( * leafPageElement )( unsafeIndex ( unsafe . Pointer ( p ), unsafe . Sizeof ( * p ),
59+ leafPageElementSize , int ( index ) ))
6160}
6261
6362// leafPageElements retrieves a list of leaf nodes.
6463func (p * page ) leafPageElements () []leafPageElement {
6564 if p .count == 0 {
6665 return nil
6766 }
68- return * (* []leafPageElement )(unsafe .Pointer (& reflect.SliceHeader {
69- Data : uintptr (unsafe .Pointer (p )) + unsafe .Sizeof (* p ),
70- Len : int (p .count ),
71- Cap : int (p .count ),
72- }))
67+ var elems []leafPageElement
68+ data := unsafeAdd (unsafe .Pointer (p ), unsafe .Sizeof (* p ))
69+ unsafeSlice (unsafe .Pointer (& elems ), data , int (p .count ))
70+ return elems
7371}
7472
7573// branchPageElement retrieves the branch node by index
7674func (p * page ) branchPageElement (index uint16 ) * branchPageElement {
77- off := uintptr ( index ) * unsafe .Sizeof (branchPageElement {})
78- return ( * branchPageElement )( unsafe .Pointer ( uintptr ( unsafe . Pointer ( p )) + unsafe . Sizeof ( * p ) + off ))
75+ return ( * branchPageElement )( unsafeIndex ( unsafe . Pointer ( p ), unsafe .Sizeof (* p ),
76+ unsafe .Sizeof ( branchPageElement {}), int ( index ) ))
7977}
8078
8179// branchPageElements retrieves a list of branch nodes.
8280func (p * page ) branchPageElements () []branchPageElement {
8381 if p .count == 0 {
8482 return nil
8583 }
86- return * (* []branchPageElement )(unsafe .Pointer (& reflect.SliceHeader {
87- Data : uintptr (unsafe .Pointer (p )) + unsafe .Sizeof (* p ),
88- Len : int (p .count ),
89- Cap : int (p .count ),
90- }))
84+ var elems []branchPageElement
85+ data := unsafeAdd (unsafe .Pointer (p ), unsafe .Sizeof (* p ))
86+ unsafeSlice (unsafe .Pointer (& elems ), data , int (p .count ))
87+ return elems
9188}
9289
9390// dump writes n bytes of the page to STDERR as hex output.
9491func (p * page ) hexdump (n int ) {
95- buf := * (* []byte )(unsafe .Pointer (& reflect.SliceHeader {
96- Data : uintptr (unsafe .Pointer (p )),
97- Len : n ,
98- Cap : n ,
99- }))
92+ buf := unsafeByteSlice (unsafe .Pointer (p ), 0 , 0 , n )
10093 fmt .Fprintf (os .Stderr , "%x\n " , buf )
10194}
10295
@@ -115,11 +108,7 @@ type branchPageElement struct {
115108
116109// key returns a byte slice of the node key.
117110func (n * branchPageElement ) key () []byte {
118- return * (* []byte )(unsafe .Pointer (& reflect.SliceHeader {
119- Data : uintptr (unsafe .Pointer (n )) + uintptr (n .pos ),
120- Len : int (n .ksize ),
121- Cap : int (n .ksize ),
122- }))
111+ return unsafeByteSlice (unsafe .Pointer (n ), 0 , int (n .pos ), int (n .pos )+ int (n .ksize ))
123112}
124113
125114// leafPageElement represents a node on a leaf page.
@@ -132,20 +121,16 @@ type leafPageElement struct {
132121
133122// key returns a byte slice of the node key.
134123func (n * leafPageElement ) key () []byte {
135- return * (* []byte )(unsafe .Pointer (& reflect.SliceHeader {
136- Data : uintptr (unsafe .Pointer (n )) + uintptr (n .pos ),
137- Len : int (n .ksize ),
138- Cap : int (n .ksize ),
139- }))
124+ i := int (n .pos )
125+ j := i + int (n .ksize )
126+ return unsafeByteSlice (unsafe .Pointer (n ), 0 , i , j )
140127}
141128
142129// value returns a byte slice of the node value.
143130func (n * leafPageElement ) value () []byte {
144- return * (* []byte )(unsafe .Pointer (& reflect.SliceHeader {
145- Data : uintptr (unsafe .Pointer (n )) + uintptr (n .pos ) + uintptr (n .ksize ),
146- Len : int (n .vsize ),
147- Cap : int (n .vsize ),
148- }))
131+ i := int (n .pos ) + int (n .ksize )
132+ j := i + int (n .vsize )
133+ return unsafeByteSlice (unsafe .Pointer (n ), 0 , i , j )
149134}
150135
151136// PageInfo represents human readable information about a page.
0 commit comments