aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.1/libgo/runtime/go-assert-interface.c
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2016-02-04 18:51:25 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-02-04 18:51:25 +0000
commitedbbe53c4ffa154a5f9ae3f89ba8105993d8800e (patch)
tree4cedb380a14027d9c4d1e531c2340c43cbd79175 /gcc-4.8.1/libgo/runtime/go-assert-interface.c
parenta4ca82cac69c3147143d7b4b4d7cdeb5e02f20ef (diff)
parent3186be22b6598fbd467b126347d1c7f48ccb7f71 (diff)
downloadtoolchain_gcc-edbbe53c4ffa154a5f9ae3f89ba8105993d8800e.tar.gz
toolchain_gcc-edbbe53c4ffa154a5f9ae3f89ba8105993d8800e.tar.bz2
toolchain_gcc-edbbe53c4ffa154a5f9ae3f89ba8105993d8800e.zip
Merge "Check in a pristine copy of GCC 4.8.1."
Diffstat (limited to 'gcc-4.8.1/libgo/runtime/go-assert-interface.c')
-rw-r--r--gcc-4.8.1/libgo/runtime/go-assert-interface.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc-4.8.1/libgo/runtime/go-assert-interface.c b/gcc-4.8.1/libgo/runtime/go-assert-interface.c
new file mode 100644
index 000000000..2510f9aef
--- /dev/null
+++ b/gcc-4.8.1/libgo/runtime/go-assert-interface.c
@@ -0,0 +1,45 @@
+/* go-assert-interface.c -- interface type assertion for Go.
+
+ 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. */
+
+#include "runtime.h"
+#include "go-alloc.h"
+#include "go-assert.h"
+#include "go-panic.h"
+#include "go-type.h"
+#include "interface.h"
+
+/* This is called by the compiler to implement a type assertion from
+ one interface type to another. This returns the value that should
+ go in the first field of the result tuple. The result may be an
+ empty or a non-empty interface. */
+
+const void *
+__go_assert_interface (const struct __go_type_descriptor *lhs_descriptor,
+ const struct __go_type_descriptor *rhs_descriptor)
+{
+ const struct __go_interface_type *lhs_interface;
+
+ if (rhs_descriptor == NULL)
+ {
+ struct __go_empty_interface panic_arg;
+
+ /* A type assertion is not permitted with a nil interface. */
+
+ runtime_newTypeAssertionError (NULL, NULL, lhs_descriptor->__reflection,
+ NULL, &panic_arg);
+ __go_panic (panic_arg);
+ }
+
+ /* A type assertion to an empty interface just returns the object
+ descriptor. */
+
+ __go_assert (lhs_descriptor->__code == GO_INTERFACE);
+ lhs_interface = (const struct __go_interface_type *) lhs_descriptor;
+ if (lhs_interface->__methods.__count == 0)
+ return rhs_descriptor;
+
+ return __go_convert_interface_2 (lhs_descriptor, rhs_descriptor, 0);
+}