Commit c367d1b7 authored by Rob Pike's avatar Rob Pike

Move sys.Reflect and sys.Unreflect into unsafe.

R=rsc
DELTA=19  (4 added, 5 deleted, 10 changed)
OCL=28563
CL=28566
parent d4fa2538
...@@ -56,8 +56,6 @@ char *sysimport = ...@@ -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 = ...@@ -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 ...@@ -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; ...@@ -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) { ...@@ -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 {} { ...@@ -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) { ...@@ -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) ...@@ -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; ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment