/* go-runtime-error.c -- Go runtime error.

   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"

/* The compiler generates calls to this function.  This enum values
   are known to the compiler and used by compiled code.  Any change
   here must be reflected in the compiler.  */

enum
{
  /* Slice index out of bounds: negative or larger than the length of
     the slice.  */
  SLICE_INDEX_OUT_OF_BOUNDS = 0,

  /* Array index out of bounds.  */
  ARRAY_INDEX_OUT_OF_BOUNDS = 1,

  /* String index out of bounds.  */
  STRING_INDEX_OUT_OF_BOUNDS = 2,

  /* Slice slice out of bounds: negative or larger than the length of
     the slice or high bound less than low bound.  */
  SLICE_SLICE_OUT_OF_BOUNDS = 3,

  /* Array slice out of bounds.  */
  ARRAY_SLICE_OUT_OF_BOUNDS = 4,

  /* String slice out of bounds.  */
  STRING_SLICE_OUT_OF_BOUNDS = 5,

  /* Dereference of nil pointer.  This is used when there is a
     dereference of a pointer to a very large struct or array, to
     ensure that a gigantic array is not used a proxy to access random
     memory locations.  */
  NIL_DEREFERENCE = 6,

  /* Slice length or capacity out of bounds in make: negative or
     overflow or length greater than capacity.  */
  MAKE_SLICE_OUT_OF_BOUNDS = 7,

  /* Map capacity out of bounds in make: negative or overflow.  */
  MAKE_MAP_OUT_OF_BOUNDS = 8,

  /* Channel capacity out of bounds in make: negative or overflow.  */
  MAKE_CHAN_OUT_OF_BOUNDS = 9,

  /* Integer division by zero.  */
  DIVISION_BY_ZERO = 10,

  /* Go statement with nil function.  */
  GO_NIL = 11
};

extern void __go_runtime_error (int32) __attribute__ ((noreturn));

void
__go_runtime_error (int32 i)
{
  struct funcfileline_return fileline;
  bool in_runtime;

  fileline = runtime_funcfileline ((uintptr) runtime_getcallerpc()-1, 0);
  in_runtime = (fileline.retfn.len > 0
		&& (__builtin_strncmp ((const char *) fileline.retfn.str,
				      "runtime.", 8)
		    == 0));

  switch (i)
    {
    case SLICE_INDEX_OUT_OF_BOUNDS:
    case ARRAY_INDEX_OUT_OF_BOUNDS:
    case STRING_INDEX_OUT_OF_BOUNDS:
      if (in_runtime)
	runtime_throw ("index out of range");
      runtime_panicstring ("index out of range");

    case SLICE_SLICE_OUT_OF_BOUNDS:
    case ARRAY_SLICE_OUT_OF_BOUNDS:
    case STRING_SLICE_OUT_OF_BOUNDS:
      if (in_runtime)
	runtime_throw ("slice bounds out of range");
      runtime_panicstring ("slice bounds out of range");

    case NIL_DEREFERENCE:
      runtime_panicstring ("nil pointer dereference");

    case MAKE_SLICE_OUT_OF_BOUNDS:
      runtime_panicstring ("make slice len or cap out of range");

    case MAKE_MAP_OUT_OF_BOUNDS:
      runtime_panicstring ("make map len out of range");

    case MAKE_CHAN_OUT_OF_BOUNDS:
      runtime_panicstring ("make chan len out of range");

    case DIVISION_BY_ZERO:
      runtime_panicstring ("integer divide by zero");

    case GO_NIL:
      /* This one is a throw, rather than a panic.  Set throwing to
	 not dump full stacks.  */
      runtime_g()->m->throwing = -1;
      runtime_throw ("go of nil func value");

    default:
      runtime_panicstring ("unknown runtime error");
    }
}
