do not pop sp in pic_get_args; OP_CALL takes care of stack unwinding
This commit is contained in:
		
							parent
							
								
									910f370482
								
							
						
					
					
						commit
						36b455d9c2
					
				
							
								
								
									
										14
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										14
									
								
								src/vm.c
								
								
								
								
							| 
						 | 
					@ -71,7 +71,7 @@ void
 | 
				
			||||||
pic_get_args(pic_state *pic, const char *format, ...)
 | 
					pic_get_args(pic_state *pic, const char *format, ...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  char c;
 | 
					  char c;
 | 
				
			||||||
  int i = 0;
 | 
					  int i = -1;
 | 
				
			||||||
  va_list ap;
 | 
					  va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  va_start(ap, format);
 | 
					  va_start(ap, format);
 | 
				
			||||||
| 
						 | 
					@ -82,8 +82,8 @@ pic_get_args(pic_state *pic, const char *format, ...)
 | 
				
			||||||
	pic_value *p;
 | 
						pic_value *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p = va_arg(ap, pic_value*);
 | 
						p = va_arg(ap, pic_value*);
 | 
				
			||||||
	*p = *--pic->sp;
 | 
						*p = pic->sp[i];
 | 
				
			||||||
	i++;
 | 
						i--;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case 'f':
 | 
					    case 'f':
 | 
				
			||||||
| 
						 | 
					@ -91,8 +91,8 @@ pic_get_args(pic_state *pic, const char *format, ...)
 | 
				
			||||||
	double *f;
 | 
						double *f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f = va_arg(ap, double *);
 | 
						f = va_arg(ap, double *);
 | 
				
			||||||
	*f = pic_float(*--pic->sp);
 | 
						*f = pic_float(pic->sp[i]);
 | 
				
			||||||
	i++;
 | 
						i--;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -355,7 +355,6 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
				
			||||||
      pic_value c;
 | 
					      pic_value c;
 | 
				
			||||||
      struct pic_proc *proc;
 | 
					      struct pic_proc *proc;
 | 
				
			||||||
      pic_callinfo *ci;
 | 
					      pic_callinfo *ci;
 | 
				
			||||||
      int ai = pic_gc_arena_preserve(pic);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pic_gc_protect(pic, c = POP());
 | 
					      pic_gc_protect(pic, c = POP());
 | 
				
			||||||
      proc = pic_proc_ptr(c);
 | 
					      proc = pic_proc_ptr(c);
 | 
				
			||||||
| 
						 | 
					@ -363,8 +362,9 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
				
			||||||
      ci->proc = proc;
 | 
					      ci->proc = proc;
 | 
				
			||||||
      ci->argc = pc->u.i;
 | 
					      ci->argc = pc->u.i;
 | 
				
			||||||
      PUSH(proc->u.cfunc(pic));
 | 
					      PUSH(proc->u.cfunc(pic));
 | 
				
			||||||
      pic_gc_arena_restore(pic, ai);
 | 
					      pic->sp -= ci->argc;
 | 
				
			||||||
      POPCI();
 | 
					      POPCI();
 | 
				
			||||||
 | 
					      pic_gc_arena_restore(pic, ai);
 | 
				
			||||||
      NEXT;
 | 
					      NEXT;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    CASE(OP_CONS) {
 | 
					    CASE(OP_CONS) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue