1
0
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:
Rob Pike 2009-05-08 14:57:56 -07:00
parent d4fa253837
commit c367d1b789
7 changed files with 14 additions and 15 deletions

View File

@ -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";

View File

@ -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;

View File

@ -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 { });

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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

View File

@ -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;
} }