stack allocated buffer

pull/1435/head
Darien Raymond 6 years ago
parent 24288a74a2
commit 770a20d266
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169

@ -2,11 +2,13 @@ package protocol
import ( import (
"io" "io"
"unsafe"
"v2ray.com/core/common" "v2ray.com/core/common"
"v2ray.com/core/common/buf" "v2ray.com/core/common/buf"
"v2ray.com/core/common/net" "v2ray.com/core/common/net"
"v2ray.com/core/common/serial" "v2ray.com/core/common/serial"
"v2ray.com/core/common/stack"
) )
type AddressOption func(*option) type AddressOption func(*option)
@ -232,7 +234,13 @@ func (p *addressParser) writeAddress(writer io.Writer, address net.Address) erro
switch address.Family() { switch address.Family() {
case net.AddressFamilyIPv4, net.AddressFamilyIPv6: case net.AddressFamilyIPv4, net.AddressFamilyIPv6:
if _, err := writer.Write([]byte{tb}); err != nil { var bytes stack.TwoBytes
s := bytes[:1]
s[0] = tb
p := uintptr(unsafe.Pointer(&s))
v := (*[]byte)(unsafe.Pointer(p))
if _, err := writer.Write(*v); err != nil {
return err return err
} }
if _, err := writer.Write(address.IP()); err != nil { if _, err := writer.Write(address.IP()); err != nil {
@ -243,7 +251,15 @@ func (p *addressParser) writeAddress(writer io.Writer, address net.Address) erro
if isDomainTooLong(domain) { if isDomainTooLong(domain) {
return newError("Super long domain is not supported: ", domain) return newError("Super long domain is not supported: ", domain)
} }
if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil {
var bytes stack.TwoBytes
s := bytes[:]
s[0] = tb
s[1] = byte(len(domain))
p := uintptr(unsafe.Pointer(&s))
v := (*[]byte)(unsafe.Pointer(p))
if _, err := writer.Write(*v); err != nil {
return err return err
} }
if _, err := io.WriteString(writer, domain); err != nil { if _, err := io.WriteString(writer, domain); err != nil {

@ -0,0 +1,11 @@
package stack
// TwoBytes is a [8]byte which is always allocated on stack.
//
//go:notinheap
type TwoBytes [2]byte
// EightBytes is a [8]byte which is always allocated on stack.
//
//go:notinheap
type EightBytes [8]byte
Loading…
Cancel
Save