mirror of
https://github.com/golang/go
synced 2024-11-22 02:34:40 -07:00
Move sys.Reflect and sys.Unreflect into unsafe.
R=rsc DELTA=19 (4 added, 5 deleted, 10 changed) OCL=28563 CL=28566
This commit is contained in:
parent
d4fa253837
commit
c367d1b789
@ -56,8 +56,6 @@ char *sysimport =
|
|||||||
"func sys.arrays2d (old *any, nel int) (ary []any)\n"
|
"func sys.arrays2d (old *any, nel int) (ary []any)\n"
|
||||||
"func sys.closure ()\n"
|
"func sys.closure ()\n"
|
||||||
"func sys.Breakpoint ()\n"
|
"func sys.Breakpoint ()\n"
|
||||||
"func sys.Reflect (i interface { }) (? uint64, ? string, ? bool)\n"
|
|
||||||
"func sys.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n"
|
|
||||||
"var sys.Args []string\n"
|
"var sys.Args []string\n"
|
||||||
"var sys.Envs []string\n"
|
"var sys.Envs []string\n"
|
||||||
"func sys.Gosched ()\n"
|
"func sys.Gosched ()\n"
|
||||||
@ -72,5 +70,7 @@ char *unsafeimport =
|
|||||||
"func unsafe.Offsetof (? any) (? int)\n"
|
"func unsafe.Offsetof (? any) (? int)\n"
|
||||||
"func unsafe.Sizeof (? any) (? int)\n"
|
"func unsafe.Sizeof (? any) (? int)\n"
|
||||||
"func unsafe.Alignof (? any) (? int)\n"
|
"func unsafe.Alignof (? any) (? int)\n"
|
||||||
|
"func unsafe.Reflect (i interface { }) (? uint64, ? string, ? bool)\n"
|
||||||
|
"func unsafe.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n"
|
||||||
"\n"
|
"\n"
|
||||||
"$$\n";
|
"$$\n";
|
||||||
|
@ -77,9 +77,6 @@ func closure(); // has args, but compiler fills in
|
|||||||
|
|
||||||
func Breakpoint();
|
func Breakpoint();
|
||||||
|
|
||||||
func Reflect(i interface { }) (uint64, string, bool);
|
|
||||||
func Unreflect(uint64, string, bool) (ret interface { });
|
|
||||||
|
|
||||||
var Args []string;
|
var Args []string;
|
||||||
var Envs []string;
|
var Envs []string;
|
||||||
|
|
||||||
|
@ -9,3 +9,5 @@ type Pointer *any;
|
|||||||
func Offsetof(any) int;
|
func Offsetof(any) int;
|
||||||
func Sizeof(any) int;
|
func Sizeof(any) int;
|
||||||
func Alignof(any) int;
|
func Alignof(any) int;
|
||||||
|
func Reflect(i interface { }) (uint64, string, bool);
|
||||||
|
func Unreflect(uint64, string, bool) (ret interface { });
|
||||||
|
@ -314,7 +314,7 @@ func TestInterfaceValue(t *testing.T) {
|
|||||||
|
|
||||||
i3 := v2.Interface();
|
i3 := v2.Interface();
|
||||||
if f, ok := i3.(float); !ok {
|
if f, ok := i3.(float); !ok {
|
||||||
a, typ, c := sys.Reflect(i3);
|
a, typ, c := unsafe.Reflect(i3);
|
||||||
t.Error("v2.Interface() did not return float, got ", typ);
|
t.Error("v2.Interface() did not return float, got ", typ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,12 +62,12 @@ func (c *commonValue) Interface() interface {} {
|
|||||||
case c.typ.Kind() == InterfaceKind:
|
case c.typ.Kind() == InterfaceKind:
|
||||||
i = *(*interface{})(c.addr);
|
i = *(*interface{})(c.addr);
|
||||||
case c.typ.Size() > 8: // TODO(rsc): how do we know it is 8?
|
case c.typ.Size() > 8: // TODO(rsc): how do we know it is 8?
|
||||||
i = sys.Unreflect(uint64(uintptr(c.addr)), c.typ.String(), true);
|
i = unsafe.Unreflect(uint64(uintptr(c.addr)), c.typ.String(), true);
|
||||||
default:
|
default:
|
||||||
if uintptr(c.addr) == 0 {
|
if uintptr(c.addr) == 0 {
|
||||||
panicln("reflect: address 0 for", c.typ.String());
|
panicln("reflect: address 0 for", c.typ.String());
|
||||||
}
|
}
|
||||||
i = sys.Unreflect(uint64(uintptr(*(*Addr)(c.addr))), c.typ.String(), false);
|
i = unsafe.Unreflect(uint64(uintptr(*(*Addr)(c.addr))), c.typ.String(), false);
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@ -902,7 +902,7 @@ func copyArray(dst ArrayValue, src ArrayValue, n int) {
|
|||||||
|
|
||||||
// NewValue creates a new Value from the interface{} object provided.
|
// NewValue creates a new Value from the interface{} object provided.
|
||||||
func NewValue(e interface {}) Value {
|
func NewValue(e interface {}) Value {
|
||||||
value, typestring, indir := sys.Reflect(e);
|
value, typestring, indir := unsafe.Reflect(e);
|
||||||
typ, ok := typecache[typestring];
|
typ, ok := typecache[typestring];
|
||||||
if !ok {
|
if !ok {
|
||||||
typ = ParseTypeString("", typestring);
|
typ = ParseTypeString("", typestring);
|
||||||
|
@ -560,7 +560,7 @@ sys·printinter(Iface i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sys·Reflect(Iface i, uint64 retit, String rettype, bool retindir)
|
unsafe·Reflect(Iface i, uint64 retit, String rettype, bool retindir)
|
||||||
{
|
{
|
||||||
int32 wid;
|
int32 wid;
|
||||||
|
|
||||||
@ -602,7 +602,7 @@ extern int32 ngotypesigs;
|
|||||||
// on the fake signature are:
|
// on the fake signature are:
|
||||||
//
|
//
|
||||||
// (1) any interface conversion using the signature will fail
|
// (1) any interface conversion using the signature will fail
|
||||||
// (2) calling sys.Reflect() returns the args to unreflect
|
// (2) calling unsafe.Reflect() returns the args to unreflect
|
||||||
// (3) the right algorithm type is used, for == and map insertion
|
// (3) the right algorithm type is used, for == and map insertion
|
||||||
//
|
//
|
||||||
// (1) is ensured by the fact that we allocate a new Sigt,
|
// (1) is ensured by the fact that we allocate a new Sigt,
|
||||||
@ -757,7 +757,7 @@ findtype(String type, bool indir)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sys·Unreflect(uint64 it, String type, bool indir, Iface ret)
|
unsafe·Unreflect(uint64 it, String type, bool indir, Iface ret)
|
||||||
{
|
{
|
||||||
Sigt *sigt;
|
Sigt *sigt;
|
||||||
|
|
||||||
@ -767,8 +767,8 @@ sys·Unreflect(uint64 it, String type, bool indir, Iface ret)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if(type.len > 10 && mcmp(type.str, (byte*)"interface ", 10) == 0) {
|
if(type.len > 10 && mcmp(type.str, (byte*)"interface ", 10) == 0) {
|
||||||
printf("sys.Unreflect: cannot put %S in interface\n", type);
|
printf("unsafe.Unreflect: cannot put %S in interface\n", type);
|
||||||
throw("sys.Unreflect");
|
throw("unsafe.Unreflect");
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we think the type should be indirect
|
// if we think the type should be indirect
|
||||||
|
@ -9,7 +9,7 @@ package main
|
|||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
func typeof(x interface{}) string {
|
func typeof(x interface{}) string {
|
||||||
val, typ, indir := sys.Reflect(x);
|
val, typ, indir := unsafe.Reflect(x);
|
||||||
return typ;
|
return typ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user