github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libgo/runtime/go-check-interface.c (about) 1 /* go-check-interface.c -- check an interface type for a conversion 2 3 Copyright 2010 The Go Authors. All rights reserved. 4 Use of this source code is governed by a BSD-style 5 license that can be found in the LICENSE file. */ 6 7 #include "runtime.h" 8 #include "go-panic.h" 9 #include "go-type.h" 10 #include "interface.h" 11 12 /* Check that an interface type matches for a conversion to a 13 non-interface type. This panics if the types are bad. The actual 14 extraction of the object is inlined. */ 15 16 void 17 __go_check_interface_type ( 18 const struct __go_type_descriptor *lhs_descriptor, 19 const struct __go_type_descriptor *rhs_descriptor, 20 const struct __go_type_descriptor *rhs_inter_descriptor) 21 { 22 if (rhs_descriptor == NULL) 23 { 24 struct __go_empty_interface panic_arg; 25 26 runtime_newTypeAssertionError(NULL, NULL, lhs_descriptor->__reflection, 27 NULL, &panic_arg); 28 __go_panic(panic_arg); 29 } 30 31 if (lhs_descriptor != rhs_descriptor 32 && !__go_type_descriptors_equal (lhs_descriptor, rhs_descriptor) 33 && ((lhs_descriptor->__code & GO_CODE_MASK) != GO_UNSAFE_POINTER 34 || !__go_is_pointer_type (rhs_descriptor)) 35 && ((rhs_descriptor->__code & GO_CODE_MASK) != GO_UNSAFE_POINTER 36 || !__go_is_pointer_type (lhs_descriptor))) 37 { 38 struct __go_empty_interface panic_arg; 39 40 runtime_newTypeAssertionError(rhs_inter_descriptor->__reflection, 41 rhs_descriptor->__reflection, 42 lhs_descriptor->__reflection, 43 NULL, &panic_arg); 44 __go_panic(panic_arg); 45 } 46 }