[bugfix] fix GC fault. call pic_get_backtrace function *before* you
allocate new area for error object.
This commit is contained in:
		
							parent
							
								
									a7565e7584
								
							
						
					
					
						commit
						183935a31e
					
				
							
								
								
									
										44
									
								
								src/error.c
								
								
								
								
							
							
						
						
									
										44
									
								
								src/error.c
								
								
								
								
							| 
						 | 
				
			
			@ -70,6 +70,23 @@ pic_pop_try(pic_state *pic)
 | 
			
		|||
  pic->try_jmps = prev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct pic_error *
 | 
			
		||||
error_new(pic_state *pic, short type, pic_str *msg, pic_value irrs)
 | 
			
		||||
{
 | 
			
		||||
  struct pic_error *e;
 | 
			
		||||
  pic_str *stack;
 | 
			
		||||
 | 
			
		||||
  stack = pic_get_backtrace(pic);
 | 
			
		||||
 | 
			
		||||
  e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
 | 
			
		||||
  e->type = type;
 | 
			
		||||
  e->msg = msg;
 | 
			
		||||
  e->irrs = irrs;
 | 
			
		||||
  e->stack = stack;
 | 
			
		||||
 | 
			
		||||
  return e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
noreturn void
 | 
			
		||||
pic_throw(pic_state *pic, struct pic_error *e)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -94,19 +111,12 @@ pic_errorf(pic_state *pic, const char *fmt, ...)
 | 
			
		|||
{
 | 
			
		||||
  va_list ap;
 | 
			
		||||
  pic_value err_line;
 | 
			
		||||
  struct pic_error *e;
 | 
			
		||||
 | 
			
		||||
  va_start(ap, fmt);
 | 
			
		||||
  err_line = pic_vformat(pic, fmt, ap);
 | 
			
		||||
  va_end(ap);
 | 
			
		||||
 | 
			
		||||
  e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
 | 
			
		||||
  e->type = PIC_ERROR_OTHER;
 | 
			
		||||
  e->msg = pic_str_ptr(pic_car(pic, err_line));
 | 
			
		||||
  e->irrs = pic_cdr(pic, err_line);
 | 
			
		||||
  e->stack = pic_get_backtrace(pic);
 | 
			
		||||
 | 
			
		||||
  pic_throw(pic, e);
 | 
			
		||||
  pic_throw(pic, error_new(pic, PIC_ERROR_OTHER, pic_str_ptr(pic_car(pic, err_line)), pic_cdr(pic, err_line)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static pic_value
 | 
			
		||||
| 
						 | 
				
			
			@ -134,17 +144,10 @@ noreturn static pic_value
 | 
			
		|||
pic_error_raise(pic_state *pic)
 | 
			
		||||
{
 | 
			
		||||
  pic_value v;
 | 
			
		||||
  struct pic_error *e;
 | 
			
		||||
 | 
			
		||||
  pic_get_args(pic, "o", &v);
 | 
			
		||||
 | 
			
		||||
  e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
 | 
			
		||||
  e->type = PIC_ERROR_RAISED;
 | 
			
		||||
  e->msg = pic_str_new_cstr(pic, "object is raised");
 | 
			
		||||
  e->irrs = pic_list1(pic, v);
 | 
			
		||||
  e->stack = pic_get_backtrace(pic);
 | 
			
		||||
 | 
			
		||||
  pic_throw(pic, e);
 | 
			
		||||
  pic_throw(pic, error_new(pic, PIC_ERROR_RAISED, pic_str_new_cstr(pic, "object is raised"), pic_list1(pic, v)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
noreturn static pic_value
 | 
			
		||||
| 
						 | 
				
			
			@ -153,17 +156,10 @@ pic_error_error(pic_state *pic)
 | 
			
		|||
  pic_str *str;
 | 
			
		||||
  size_t argc;
 | 
			
		||||
  pic_value *argv;
 | 
			
		||||
  struct pic_error *e;
 | 
			
		||||
 | 
			
		||||
  pic_get_args(pic, "s*", &str, &argc, &argv);
 | 
			
		||||
 | 
			
		||||
  e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
 | 
			
		||||
  e->type = PIC_ERROR_OTHER;
 | 
			
		||||
  e->msg = str;
 | 
			
		||||
  e->irrs = pic_list_by_array(pic, argc, argv);
 | 
			
		||||
  e->stack = pic_get_backtrace(pic);
 | 
			
		||||
 | 
			
		||||
  pic_throw(pic, e);
 | 
			
		||||
  pic_throw(pic, error_new(pic, PIC_ERROR_OTHER, str, pic_list_by_array(pic, argc, argv)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static pic_value
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue