longjmp.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <u.h>
  2. #include <libc.h>
  3. enum {
  4. Njmps = 10000
  5. };
  6. void foo(void);
  7. void
  8. main(void)
  9. {
  10. int i, njmp;
  11. int fail = 0;
  12. jmp_buf label;
  13. while((njmp = setjmp(label)) < Njmps) {
  14. longjmp(label, njmp+1);
  15. }
  16. for(i = 0; i < nelem(label); i++)
  17. fprint(2, "label[%d] = %p\n", i, label[i]);
  18. fprint(2, "main: %p foo: %p\n", main, foo);
  19. if(njmp != Njmps) {
  20. print("njmp is %d, wanted %d\n", njmp, Njmps);
  21. fail++;
  22. }
  23. if(label[JMPBUFPC] < (uintptr_t)main) {
  24. print("label[%d] is %p, which is < main(%p)\n",
  25. JMPBUFPC, label[JMPBUFPC], main);
  26. fail++;
  27. }
  28. if(label[JMPBUFPC] > (uintptr_t)foo) {
  29. print("label[%d] is %p, which is > foo(%p)\n",
  30. JMPBUFPC, label[JMPBUFPC], foo);
  31. fail++;
  32. }
  33. if(label[JMPBUFSP] > (uintptr_t)&label[nelem(label)]) {
  34. print("label[%d] is %p, which is > (uintptr_t)&label[nelem(label)](%p)\n",
  35. JMPBUFSP, label[JMPBUFSP], foo);
  36. fail++;
  37. }
  38. if(fail == 0){
  39. print("PASS\n");
  40. exits("PASS");
  41. }
  42. print("FAIL (%d errors)\n", fail);
  43. exits("FAIL");
  44. return 0;
  45. }
  46. void
  47. foo(void)
  48. {
  49. }