diff options
author | Dan Albert <danalbert@google.com> | 2016-02-04 18:51:25 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-02-04 18:51:25 +0000 |
commit | edbbe53c4ffa154a5f9ae3f89ba8105993d8800e (patch) | |
tree | 4cedb380a14027d9c4d1e531c2340c43cbd79175 /gcc-4.8.1/libgo/runtime/go-assert-interface.c | |
parent | a4ca82cac69c3147143d7b4b4d7cdeb5e02f20ef (diff) | |
parent | 3186be22b6598fbd467b126347d1c7f48ccb7f71 (diff) | |
download | toolchain_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.c | 45 |
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); +} |