2010-12-03 05:34:57 +01:00
|
|
|
// Copyright 2010 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.
|
|
|
|
|
|
|
|
package reflect
|
|
|
|
#include "go-type.h"
|
|
|
|
#include "interface.h"
|
2011-05-20 02:18:15 +02:00
|
|
|
#include "runtime.h"
|
|
|
|
#include "go-panic.h"
|
2010-12-03 05:34:57 +01:00
|
|
|
|
2011-05-20 02:18:15 +02:00
|
|
|
func ifaceE2I(inter *Type, e Eface, ret *Iface) {
|
|
|
|
const Type *t;
|
|
|
|
Eface err;
|
2010-12-03 05:34:57 +01:00
|
|
|
|
2011-05-20 02:18:15 +02:00
|
|
|
if(((uintptr)e.__type_descriptor&reflectFlags) != 0)
|
|
|
|
runtime_throw("invalid interface value");
|
|
|
|
t = e.__type_descriptor;
|
|
|
|
if(t == nil) {
|
|
|
|
// explicit conversions require non-nil interface value.
|
|
|
|
newTypeAssertionError(nil, nil, inter,
|
|
|
|
nil, nil, inter->__reflection,
|
|
|
|
nil, &err);
|
|
|
|
__go_panic(err);
|
2010-12-03 05:34:57 +01:00
|
|
|
}
|
2011-05-20 02:18:15 +02:00
|
|
|
ret->__object = e.__object;
|
|
|
|
ret->__methods = __go_convert_interface(inter, t);
|
2010-12-03 05:34:57 +01:00
|
|
|
}
|