crash.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package core
  2. import (
  3. "os"
  4. "fmt"
  5. "kumachan/standalone/util/richtext"
  6. "kumachan/support/tools"
  7. )
  8. type CrashKind string
  9. const (
  10. ProgrammedCrash CrashKind = "crash"
  11. ValueUndefined CrashKind = "undefined"
  12. AssertionFailed CrashKind = "assertion failed"
  13. InvariantViolation CrashKind = "invariant violation"
  14. InvalidArgument CrashKind = "invalid argument"
  15. MissingNativeFunction CrashKind = "missing native function"
  16. ErrorInEntryObservable CrashKind = "error occurred in entry observable"
  17. UseAfterFree CrashKind = "use after free of external resources"
  18. FailedToGenerateRandomNumber CrashKind = "failed to generate random number"
  19. )
  20. func Crash(h RuntimeHandle, kind CrashKind, msg string) {
  21. print("[Crash] ", kind, ": ", msg, "\n")
  22. var info = h.GetFrameInfo()
  23. var f = info.DescribeCaller()
  24. var loc = info.CallSite
  25. var b richtext.Block
  26. b.WriteSpan("Crashed in ", richtext.TAG_ERR)
  27. b.WriteSpan(f, richtext.TAG_ERR_INLINE)
  28. b.WriteLineFeed()
  29. b.Append(loc.FormatMessage(describeCrash(kind, msg)))
  30. b.Append(info.DescribeStackTrace().WithLeadingLine("***"))
  31. if d, ok := h.Debugger(); ok && d.NotifyProgramCrash(b) {
  32. // do nothing
  33. } else {
  34. var program_path = h.ProgramPath()
  35. var html = b.RenderHtml()
  36. tools.CrashReport(program_path, html)
  37. }
  38. os.Exit(2)
  39. // noinspection ALL
  40. panic("process should have exited")
  41. }
  42. func describeCrash(kind CrashKind, msg string) richtext.Block {
  43. var b richtext.Block
  44. b.WriteSpan(fmt.Sprintf("%s: ", kind), richtext.TAG_ERR)
  45. b.WriteSpan(msg, richtext.TAG_ERR_NOTE)
  46. return b
  47. }
  48. func Crash1[A any] (h RuntimeHandle, kind CrashKind, msg string) A {
  49. var a A
  50. Crash(h, kind, msg)
  51. return a
  52. }
  53. func Crash2[A any, B any] (h RuntimeHandle, kind CrashKind, msg string) (A,B) {
  54. var a A
  55. var b B
  56. Crash(h, kind, msg)
  57. return a, b
  58. }