allow custom setjmp/longjmp
This commit is contained in:
		
							parent
							
								
									bb55bbfdde
								
							
						
					
					
						commit
						b9dde91123
					
				|  | @ -103,7 +103,9 @@ escape_call(pic_state *pic) | ||||||
| 
 | 
 | ||||||
|   pic_load_point(pic, e->data); |   pic_load_point(pic, e->data); | ||||||
| 
 | 
 | ||||||
|   longjmp(((struct pic_escape *)e->data)->jmp, 1); |   PIC_LONGJMP(pic, (void *)((struct pic_escape *)e->data)->jmp, 1); | ||||||
|  | 
 | ||||||
|  |   PIC_UNREACHABLE(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct pic_proc * | struct pic_proc * | ||||||
|  | @ -130,7 +132,7 @@ pic_escape(pic_state *pic, struct pic_proc *proc) | ||||||
| 
 | 
 | ||||||
|   pic_save_point(pic, escape); |   pic_save_point(pic, escape); | ||||||
| 
 | 
 | ||||||
|   if (setjmp(escape->jmp)) { |   if (PIC_SETJMP(pic, (void *)escape->jmp)) { | ||||||
|     return pic_values_by_list(pic, escape->results); |     return pic_values_by_list(pic, escape->results); | ||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|  |  | ||||||
|  | @ -35,7 +35,6 @@ extern "C" { | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <setjmp.h> |  | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | @ -11,6 +11,11 @@ | ||||||
| /** treat false value as none */ | /** treat false value as none */ | ||||||
| /* #define PIC_NONE_IS_FALSE 1 */ | /* #define PIC_NONE_IS_FALSE 1 */ | ||||||
| 
 | 
 | ||||||
|  | /** custom setjmp/longjmp */ | ||||||
|  | /* #define PIC_JMPBUF_SIZE sizeof(jmp_buf) */ | ||||||
|  | /* #define PIC_SETJMP(pic, buf) setjmp(buf) */ | ||||||
|  | /* #define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) */ | ||||||
|  | 
 | ||||||
| /** initial memory size (to be dynamically extended if necessary) */ | /** initial memory size (to be dynamically extended if necessary) */ | ||||||
| /* #define PIC_ARENA_SIZE 1000 */ | /* #define PIC_ARENA_SIZE 1000 */ | ||||||
| 
 | 
 | ||||||
|  | @ -55,6 +60,21 @@ | ||||||
| # define PIC_NONE_IS_FALSE 1 | # define PIC_NONE_IS_FALSE 1 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef PIC_JMPBUF_SIZE | ||||||
|  | # include <setjmp.h> | ||||||
|  | # define PIC_JMPBUF_SIZE sizeof(jmp_buf) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef PIC_SETJMP | ||||||
|  | # include <setjmp.h> | ||||||
|  | # define PIC_SETJMP(pic, buf) setjmp(buf) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef PIC_LONGJMP | ||||||
|  | # include <setjmp.h> | ||||||
|  | # define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifndef PIC_ARENA_SIZE | #ifndef PIC_ARENA_SIZE | ||||||
| # define PIC_ARENA_SIZE (8 * 1024) | # define PIC_ARENA_SIZE (8 * 1024) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| struct pic_escape { | struct pic_escape { | ||||||
|   jmp_buf jmp; |   char jmp[PIC_JMPBUF_SIZE]; | ||||||
| 
 | 
 | ||||||
|   bool valid; |   bool valid; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -34,7 +34,7 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) | ||||||
|   do {                                                                  \ |   do {                                                                  \ | ||||||
|     struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ |     struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ | ||||||
|     pic_save_point(pic, escape);                                        \ |     pic_save_point(pic, escape);                                        \ | ||||||
|     if (setjmp(escape->jmp) == 0) {                                     \ |     if (PIC_SETJMP(pic, (void *)escape->jmp) == 0) {                    \ | ||||||
|       pic_push_try(pic, escape);                                        \ |       pic_push_try(pic, escape);                                        \ | ||||||
|       do |       do | ||||||
| #define pic_catch_(label)                                 \ | #define pic_catch_(label)                                 \ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki