diff --git a/src/cmd/gc/builtin.c.boot b/src/cmd/gc/builtin.c.boot index d935fc564fd..0f189d36340 100644 --- a/src/cmd/gc/builtin.c.boot +++ b/src/cmd/gc/builtin.c.boot @@ -56,8 +56,6 @@ char *sysimport = "func sys.arrays2d (old *any, nel int) (ary []any)\n" "func sys.closure ()\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.Envs []string\n" "func sys.Gosched ()\n" @@ -72,5 +70,7 @@ char *unsafeimport = "func unsafe.Offsetof (? any) (? int)\n" "func unsafe.Sizeof (? 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"; diff --git a/src/cmd/gc/sys.go b/src/cmd/gc/sys.go index 9c2bc4d04fc..f77771a09de 100644 --- a/src/cmd/gc/sys.go +++ b/src/cmd/gc/sys.go @@ -77,9 +77,6 @@ func closure(); // has args, but compiler fills in func Breakpoint(); -func Reflect(i interface { }) (uint64, string, bool); -func Unreflect(uint64, string, bool) (ret interface { }); - var Args []string; var Envs []string; diff --git a/src/cmd/gc/unsafe.go b/src/cmd/gc/unsafe.go index d1dcee02a83..9289a9ca8e7 100644 --- a/src/cmd/gc/unsafe.go +++ b/src/cmd/gc/unsafe.go @@ -9,3 +9,5 @@ type Pointer *any; func Offsetof(any) int; func Sizeof(any) int; func Alignof(any) int; +func Reflect(i interface { }) (uint64, string, bool); +func Unreflect(uint64, string, bool) (ret interface { }); diff --git a/src/lib/reflect/all_test.go b/src/lib/reflect/all_test.go index d193efde239..cc61bbbf104 100644 --- a/src/lib/reflect/all_test.go +++ b/src/lib/reflect/all_test.go @@ -314,7 +314,7 @@ func TestInterfaceValue(t *testing.T) { i3 := v2.Interface(); 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); } } diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index ac7ed2f84a5..c3b50ae68b2 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -62,12 +62,12 @@ func (c *commonValue) Interface() interface {} { case c.typ.Kind() == InterfaceKind: i = *(*interface{})(c.addr); 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: if uintptr(c.addr) == 0 { 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; } @@ -902,7 +902,7 @@ func copyArray(dst ArrayValue, src ArrayValue, n int) { // NewValue creates a new Value from the interface{} object provided. func NewValue(e interface {}) Value { - value, typestring, indir := sys.Reflect(e); + value, typestring, indir := unsafe.Reflect(e); typ, ok := typecache[typestring]; if !ok { typ = ParseTypeString("", typestring); diff --git a/src/runtime/iface.c b/src/runtime/iface.c index e5de5d16d7e..cad7370c5f8 100644 --- a/src/runtime/iface.c +++ b/src/runtime/iface.c @@ -560,7 +560,7 @@ sys·printinter(Iface i) } void -sys·Reflect(Iface i, uint64 retit, String rettype, bool retindir) +unsafe·Reflect(Iface i, uint64 retit, String rettype, bool retindir) { int32 wid; @@ -602,7 +602,7 @@ extern int32 ngotypesigs; // on the fake signature are: // // (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 // // (1) is ensured by the fact that we allocate a new Sigt, @@ -757,7 +757,7 @@ findtype(String type, bool indir) void -sys·Unreflect(uint64 it, String type, bool indir, Iface ret) +unsafe·Unreflect(uint64 it, String type, bool indir, Iface ret) { Sigt *sigt; @@ -767,8 +767,8 @@ sys·Unreflect(uint64 it, String type, bool indir, Iface ret) goto out; if(type.len > 10 && mcmp(type.str, (byte*)"interface ", 10) == 0) { - printf("sys.Unreflect: cannot put %S in interface\n", type); - throw("sys.Unreflect"); + printf("unsafe.Unreflect: cannot put %S in interface\n", type); + throw("unsafe.Unreflect"); } // if we think the type should be indirect diff --git a/test/convert.go b/test/convert.go index 11369e52111..4952e01b76c 100644 --- a/test/convert.go +++ b/test/convert.go @@ -9,7 +9,7 @@ package main import "unsafe" func typeof(x interface{}) string { - val, typ, indir := sys.Reflect(x); + val, typ, indir := unsafe.Reflect(x); return typ; }