From 50d0695ccff6391d1506173b53069d1601c504c0 Mon Sep 17 00:00:00 2001 From: Rob Pike <r@golang.org> Date: Tue, 9 Dec 2008 15:41:21 -0800 Subject: [PATCH] use unsafe.pointer in reflection objects R=rsc DELTA=326 (4 added, 259 deleted, 63 changed) OCL=20853 CL=20856 --- src/lib/fmt/print.go | 8 +- src/lib/reflect/Makefile | 3 +- src/lib/reflect/cast_amd64.s | 193 ----------------------------------- src/lib/reflect/gencast.sh | 42 -------- src/lib/reflect/tostring.go | 2 +- src/lib/reflect/value.go | 120 +++++++++------------- 6 files changed, 55 insertions(+), 313 deletions(-) delete mode 100644 src/lib/reflect/cast_amd64.s delete mode 100755 src/lib/reflect/gencast.sh diff --git a/src/lib/fmt/print.go b/src/lib/fmt/print.go index 5a2dc67e9e..05e2087642 100644 --- a/src/lib/fmt/print.go +++ b/src/lib/fmt/print.go @@ -272,10 +272,10 @@ func getFloat64(v reflect.Value) (val float64, ok bool) { return 0.0, false; } -func getPtr(v reflect.Value) (val uint64, ok bool) { +func getPtr(v reflect.Value) (val uintptr, ok bool) { switch v.Kind() { case reflect.PtrKind: - return v.(reflect.PtrValue).Get(), true; + return uintptr(v.(reflect.PtrValue)), true; } return 0, false; } @@ -356,7 +356,7 @@ func (p *P) printField(field reflect.Value) (was_string bool) { } else { p.add('0'); p.add('x'); - s = p.fmt.uX64(v).str(); + s = p.fmt.uX64(uint64(v)).str(); } } case reflect.StructKind: @@ -555,7 +555,7 @@ func (p *P) doprintf(format string, v reflect.StructValue) { if v == nil { s = "<nil>" } else { - s = "0x" + p.fmt.uX64(v).str() + s = "0x" + p.fmt.uX64(uint64(v)).str() } } else { goto badtype diff --git a/src/lib/reflect/Makefile b/src/lib/reflect/Makefile index 708bce9ed2..b354320b91 100644 --- a/src/lib/reflect/Makefile +++ b/src/lib/reflect/Makefile @@ -32,7 +32,6 @@ coverage: packages $(AS) $*.s O1=\ - cast_$(GOARCH).$O\ type.$O\ typestring.$O\ @@ -45,7 +44,7 @@ O3=\ reflect.a: a1 a2 a3 a1: $(O1) - $(AR) grc reflect.a cast_$(GOARCH).$O type.$O typestring.$O + $(AR) grc reflect.a type.$O typestring.$O rm -f $(O1) a2: $(O2) diff --git a/src/lib/reflect/cast_amd64.s b/src/lib/reflect/cast_amd64.s deleted file mode 100644 index d0e97a3c2c..0000000000 --- a/src/lib/reflect/cast_amd64.s +++ /dev/null @@ -1,193 +0,0 @@ -// Conversion operators - really just casts -// *** Created by gencast.sh - Do Not Edit *** - -TEXT reflect·AddrToPtrAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrAddrToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInt(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrIntToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInt8(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrInt8ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInt16(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrInt16ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInt32(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrInt32ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInt64(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrInt64ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrUint(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrUintToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrUint8(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrUint8ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrUint16(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrUint16ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrUint32(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrUint32ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrUint64(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrUint64ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrFloat(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrFloatToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrFloat32(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrFloat32ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrFloat64(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrFloat64ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrFloat80(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrFloat80ToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrString(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrStringToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrBool(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrBoolToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrRuntimeArray(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrRuntimeArrayToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·AddrToPtrInterface(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - -TEXT reflect·PtrInterfaceToAddr(SB),7,$-8 - MOVQ 8(SP), AX - MOVQ AX, 16(SP) - RET - diff --git a/src/lib/reflect/gencast.sh b/src/lib/reflect/gencast.sh deleted file mode 100755 index afb60de1a4..0000000000 --- a/src/lib/reflect/gencast.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -awk ' -BEGIN { - print("// Conversion operators - really just casts") - print("// *** Created by gencast.sh - Do Not Edit ***\n")} -{ - print("TEXT reflect·AddrToPtr" $0 "(SB),7,$-8") - print("\tMOVQ 8(SP), AX") - print("\tMOVQ AX, 16(SP)") - print("\tRET") - print("") - print("TEXT reflect·Ptr" $0 "ToAddr(SB),7,$-8") - print("\tMOVQ 8(SP), AX") - print("\tMOVQ AX, 16(SP)") - print("\tRET") - print("") -} -' > cast_$GOARCH.s << '!' -Addr -Int -Int8 -Int16 -Int32 -Int64 -Uint -Uint8 -Uint16 -Uint32 -Uint64 -Float -Float32 -Float64 -Float80 -String -Bool -RuntimeArray -Interface -! diff --git a/src/lib/reflect/tostring.go b/src/lib/reflect/tostring.go index f33f5272a2..8d2d764244 100644 --- a/src/lib/reflect/tostring.go +++ b/src/lib/reflect/tostring.go @@ -171,7 +171,7 @@ func ValueToString(val Value) string { } case PtrKind: v := val.(PtrValue); - return TypeToString(typ, false) + "(" + integer(int64(v.Get())) + ")"; + return TypeToString(typ, false) + "(" + integer(int64(uintptr(v.Get()))) + ")"; case ArrayKind: t := typ.(ArrayType); v := val.(ArrayValue); diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index 65d4b5ca97..04570803cf 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -9,34 +9,10 @@ package reflect import ( "reflect"; + "unsafe"; ) -type Addr uint64 // TODO: where are ptrint/intptr etc? - -// Conversion functions, implemented in assembler -type RuntimeArray struct -func AddrToPtrAddr(Addr) *Addr -func AddrToPtrInt(Addr) *int -func AddrToPtrInt8(Addr) *int8 -func AddrToPtrInt16(Addr) *int16 -func AddrToPtrInt32(Addr) *int32 -func AddrToPtrInt64(Addr) *int64 -func AddrToPtrUint(Addr) *uint -func AddrToPtrUint8(Addr) *uint8 -func PtrUint8ToAddr(*uint8) Addr -func AddrToPtrUint16(Addr) *uint16 -func AddrToPtrUint32(Addr) *uint32 -func AddrToPtrUint64(Addr) *uint64 -func PtrUint64ToAddr(*uint64) Addr -func AddrToPtrFloat(Addr) *float -func AddrToPtrFloat32(Addr) *float32 -func AddrToPtrFloat64(Addr) *float64 -func AddrToPtrFloat80(Addr) *float80 -func AddrToPtrString(Addr) *string -func AddrToPtrBool(Addr) *bool -func AddrToPtrRuntimeArray(Addr) *RuntimeArray -func PtrRuntimeArrayToAddr(*RuntimeArray) Addr -func AddrToPtrInterface(Addr) *interface{} +type Addr unsafe.pointer // TODO: where are ptrint/intptr etc? export type Value interface { Kind() int; @@ -66,7 +42,7 @@ func (c *Common) Addr() Addr { } func (c *Common) Interface() interface {} { - return sys.unreflect(*AddrToPtrAddr(c.addr), c.typ.String()); + return sys.unreflect(uint64(uintptr(*c.addr.(*Addr))), c.typ.String()); } func NewValueAddr(typ Type, addr Addr) Value @@ -107,11 +83,11 @@ func IntCreator(typ Type, addr Addr) Value { } func (v *IntValueStruct) Get() int { - return *AddrToPtrInt(v.addr) + return *v.addr.(*int) } func (v *IntValueStruct) Set(i int) { - *AddrToPtrInt(v.addr) = i + *v.addr.(*int) = i } // -- Int8 @@ -132,11 +108,11 @@ func Int8Creator(typ Type, addr Addr) Value { } func (v *Int8ValueStruct) Get() int8 { - return *AddrToPtrInt8(v.addr) + return *v.addr.(*int8) } func (v *Int8ValueStruct) Set(i int8) { - *AddrToPtrInt8(v.addr) = i + *v.addr.(*int8) = i } // -- Int16 @@ -157,11 +133,11 @@ func Int16Creator(typ Type, addr Addr) Value { } func (v *Int16ValueStruct) Get() int16 { - return *AddrToPtrInt16(v.addr) + return *v.addr.(*int16) } func (v *Int16ValueStruct) Set(i int16) { - *AddrToPtrInt16(v.addr) = i + *v.addr.(*int16) = i } // -- Int32 @@ -182,11 +158,11 @@ func Int32Creator(typ Type, addr Addr) Value { } func (v *Int32ValueStruct) Get() int32 { - return *AddrToPtrInt32(v.addr) + return *v.addr.(*int32) } func (v *Int32ValueStruct) Set(i int32) { - *AddrToPtrInt32(v.addr) = i + *v.addr.(*int32) = i } // -- Int64 @@ -207,11 +183,11 @@ func Int64Creator(typ Type, addr Addr) Value { } func (v *Int64ValueStruct) Get() int64 { - return *AddrToPtrInt64(v.addr) + return *v.addr.(*int64) } func (v *Int64ValueStruct) Set(i int64) { - *AddrToPtrInt64(v.addr) = i + *v.addr.(*int64) = i } // -- Uint @@ -232,11 +208,11 @@ func UintCreator(typ Type, addr Addr) Value { } func (v *UintValueStruct) Get() uint { - return *AddrToPtrUint(v.addr) + return *v.addr.(*uint) } func (v *UintValueStruct) Set(i uint) { - *AddrToPtrUint(v.addr) = i + *v.addr.(*uint) = i } // -- Uint8 @@ -257,11 +233,11 @@ func Uint8Creator(typ Type, addr Addr) Value { } func (v *Uint8ValueStruct) Get() uint8 { - return *AddrToPtrUint8(v.addr) + return *v.addr.(*uint8) } func (v *Uint8ValueStruct) Set(i uint8) { - *AddrToPtrUint8(v.addr) = i + *v.addr.(*uint8) = i } // -- Uint16 @@ -282,11 +258,11 @@ func Uint16Creator(typ Type, addr Addr) Value { } func (v *Uint16ValueStruct) Get() uint16 { - return *AddrToPtrUint16(v.addr) + return *v.addr.(*uint16) } func (v *Uint16ValueStruct) Set(i uint16) { - *AddrToPtrUint16(v.addr) = i + *v.addr.(*uint16) = i } // -- Uint32 @@ -307,11 +283,11 @@ func Uint32Creator(typ Type, addr Addr) Value { } func (v *Uint32ValueStruct) Get() uint32 { - return *AddrToPtrUint32(v.addr) + return *v.addr.(*uint32) } func (v *Uint32ValueStruct) Set(i uint32) { - *AddrToPtrUint32(v.addr) = i + *v.addr.(*uint32) = i } // -- Uint64 @@ -332,11 +308,11 @@ func Uint64Creator(typ Type, addr Addr) Value { } func (v *Uint64ValueStruct) Get() uint64 { - return *AddrToPtrUint64(v.addr) + return *v.addr.(*uint64) } func (v *Uint64ValueStruct) Set(i uint64) { - *AddrToPtrUint64(v.addr) = i + *v.addr.(*uint64) = i } // -- Float @@ -357,11 +333,11 @@ func FloatCreator(typ Type, addr Addr) Value { } func (v *FloatValueStruct) Get() float { - return *AddrToPtrFloat(v.addr) + return *v.addr.(*float) } func (v *FloatValueStruct) Set(f float) { - *AddrToPtrFloat(v.addr) = f + *v.addr.(*float) = f } // -- Float32 @@ -382,11 +358,11 @@ func Float32Creator(typ Type, addr Addr) Value { } func (v *Float32ValueStruct) Get() float32 { - return *AddrToPtrFloat32(v.addr) + return *v.addr.(*float32) } func (v *Float32ValueStruct) Set(f float32) { - *AddrToPtrFloat32(v.addr) = f + *v.addr.(*float32) = f } // -- Float64 @@ -407,11 +383,11 @@ func Float64Creator(typ Type, addr Addr) Value { } func (v *Float64ValueStruct) Get() float64 { - return *AddrToPtrFloat64(v.addr) + return *v.addr.(*float64) } func (v *Float64ValueStruct) Set(f float64) { - *AddrToPtrFloat64(v.addr) = f + *v.addr.(*float64) = f } // -- Float80 @@ -434,12 +410,11 @@ func Float80Creator(typ Type, addr Addr) Value { /* BUG: can't gen code for float80s func (v *Float80ValueStruct) Get() float80 { - return *AddrToPtrFloat80(v.addr) - return 0; + return *v.addr.(*float80) } func (v *Float80ValueStruct) Set(f float80) { - *AddrToPtrFloat80(v.addr) = f + *v.addr.(*float80) = f } */ @@ -461,11 +436,11 @@ func StringCreator(typ Type, addr Addr) Value { } func (v *StringValueStruct) Get() string { - return *AddrToPtrString(v.addr) + return *v.addr.(*string) } func (v *StringValueStruct) Set(s string) { - *AddrToPtrString(v.addr) = s + *v.addr.(*string) = s } // -- Bool @@ -486,11 +461,11 @@ func BoolCreator(typ Type, addr Addr) Value { } func (v *BoolValueStruct) Get() bool { - return *AddrToPtrBool(v.addr) + return *v.addr.(*bool) } func (v *BoolValueStruct) Set(b bool) { - *AddrToPtrBool(v.addr) = b + *v.addr.(*bool) = b } // -- Pointer @@ -508,7 +483,7 @@ type PtrValueStruct struct { } func (v *PtrValueStruct) Get() Addr { - return *AddrToPtrAddr(v.addr) + return *v.addr.(*Addr) } func (v *PtrValueStruct) Sub() Value { @@ -521,7 +496,7 @@ func (v *PtrValueStruct) SetSub(subv Value) { if a != b { panicln("reflect: incompatible types in PtrValue.SetSub:", a, b); } - *AddrToPtrAddr(v.addr) = subv.Addr(); + *v.addr.(*Addr) = subv.Addr(); } func PtrCreator(typ Type, addr Addr) Value { @@ -581,7 +556,8 @@ func (v *OpenArrayValueStruct) SetLen(len int) { } func (v *OpenArrayValueStruct) Elem(i int) Value { - return NewValueAddr(v.elemtype, v.array.data + Addr(i * v.elemsize)); + data_uint := uintptr(v.array.data) + uintptr(i * v.elemsize); + return NewValueAddr(v.elemtype, Addr(data_uint)); } type FixedArrayValueStruct struct { @@ -607,7 +583,8 @@ func (v *FixedArrayValueStruct) SetLen(len int) { } func (v *FixedArrayValueStruct) Elem(i int) Value { - return NewValueAddr(v.elemtype, v.addr + Addr(i * v.elemsize)); + data_uint := uintptr(v.addr) + uintptr(i * v.elemsize); + return NewValueAddr(v.elemtype, Addr(data_uint)); return nil } @@ -620,7 +597,7 @@ func ArrayCreator(typ Type, addr Addr) Value { v.typ = typ; v.elemtype = arraytype.Elem(); v.elemsize = v.elemtype.Size(); - v.array = AddrToPtrRuntimeArray(addr); + v.array = addr.(*RuntimeArray); return v; } v := new(FixedArrayValueStruct); @@ -702,7 +679,8 @@ func StructCreator(typ Type, addr Addr) Value { v := &StructValueStruct{ Common{StructKind, typ, addr}, new([]Value, nfield) }; for i := 0; i < nfield; i++ { name, ftype, str, offset := t.Field(i); - v.field[i] = NewValueAddr(ftype, addr + Addr(offset)); + addr_uint := uintptr(addr) + uintptr(offset); + v.field[i] = NewValueAddr(ftype, Addr(addr_uint)); } v.typ = typ; return v; @@ -721,7 +699,7 @@ type InterfaceValueStruct struct { } func (v *InterfaceValueStruct) Get() interface{} { - return *AddrToPtrInterface(v.addr); + return *v.addr.(*interface{}) } func InterfaceCreator(typ Type, addr Addr) Value { @@ -799,7 +777,7 @@ export func NewInitValue(typ Type) Value { size = 1; } data := new([]uint8, size); - return NewValueAddr(typ, PtrUint8ToAddr(&data[0])); + return NewValueAddr(typ, Addr(&data[0])); } /* @@ -821,11 +799,11 @@ export func NewOpenArrayValue(typ ArrayType, len, cap int) ArrayValue { size = 1; } data := new([]uint8, size); - array.data = PtrUint8ToAddr(&data[0]); + array.data = Addr(&data[0]); array.len = uint32(len); array.cap = uint32(cap); - return NewValueAddr(typ, PtrRuntimeArrayToAddr(array)); + return NewValueAddr(typ, Addr(array)); } export func NewValue(e interface {}) Value { @@ -841,5 +819,5 @@ export func NewValue(e interface {}) Value { // so we can modify the contents. Values contain pointers to 'values'. ap := new(uint64); *ap = value; - return NewValueAddr(*p, PtrUint64ToAddr(ap)); + return NewValueAddr(*p, ap.(Addr)); } -- 2.30.9