From 64e3e0c0d69ee8fe4ac211fa491d2994a4959643 Mon Sep 17 00:00:00 2001 From: Slava Date: Sat, 22 Sep 2007 18:56:27 -0400 Subject: [PATCH] Fix callstack relocation --- extra/factory/.factory-menus.swp | Bin 20480 -> 0 bytes vm/image.c | 19 ++++++++++++++----- vm/stack.c | 4 ++-- vm/stack.h | 2 ++ 4 files changed, 18 insertions(+), 7 deletions(-) delete mode 100644 extra/factory/.factory-menus.swp diff --git a/extra/factory/.factory-menus.swp b/extra/factory/.factory-menus.swp deleted file mode 100644 index 241afbf9d743d8df82d29f4298157ebb10de6d4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI4YiJ!=9l(!Co8&f4u55L6h1HY0VAJX(?N;rYZ9^m5m)%xqwxJMKoy?uwJKlL* zXXfT6?Y4dp5yS_ILYGxPi4RbGASfuV_(4CYsH}*(=qFJT1y{uf3i>-|=04KQP17YG zRL+H8Zsxqt|2*dW|L32q99cSlQ68T;BKW*eh~}67a;EaGN5s_qLL|PuW~=Z!e5&q> zXNPx4MD$Hv;OwgHq)|NUuBWk`KWucqt-uXi$(@TbDU1Y+1nx!xt#s9TXhIx0`rt7+ zRe9i^16S@Qw@GUxU?gB9U?gB9U?gB9U?gB9U?lK=Ac1BohQ+^iM~3*h7haIFhi?}~ z^5ehkmR zr{FqV04c=&e*tm(Z-E032r>R^Al-NbuY;GteM0Q}A^ZTIhHt?8;JrYd`^rL;z74dq zbX173U%_{Pu(2EP1O(v2NjL%b2r>E#_&Ct!QR*1^DSREi1~I%H=>N!D;MMRd%p{b( z_eVh8d)MG9+z(?y>_KLGJ_}F5Yk>X?e-1tX?}yXy2s{Y1bBO*A{S%PE&?n#~EW>el zEl|eLOWjeR8lU> zI1B8hx@fOw`Ig)`^&H!;kSfRnt+hN*r@yWm*Gb>2yf3{@c3UUIC?!Scwyk!c`z`1D zr9hT;-NnmA3%x&PH|2gqW+fL3UWsv8R-CGwO`OQO6kXPhXQt45BcW>8kpLHWvxOg0$NKvv_Z z*%N=SxQci_&G3C$Pt)eyZ0_mfL{)btifcQq*Y~q}WkK`qRw(VdohA&ld_wwelBiD8 zC+1An$xignJ32^ck1-ftX#0{?+BZ(S(36>5jM9o*;Yr_P#6majb|jw<(`mYKs3P=w z$b!_O*>3)H%Pr_qzFzXFIdHjTYo}nf=!o52EP?I$gO&>8xzTDhJhcJP>4r+nhLNUq zw>{JLe1vu?upPAu2G9Dawc@*umReSTQ;)r5rmDkFWnYvq6J8rwh8x$iJ*e9Vven4s zyMY~^s;PEu+X(G7x2YF8+A;a?o>dSPO{Bh=$rpKspETYnCh)^nl)r)(zGI`M{KRecHkZwyc?dy zNimnsmcnYp?XZ|LEw;66dTuEuup6$mN`kC0YRH%_)omK}s2$hTTam1rw?ly?I9U!gqH{+0Ev5GiovA z1$oAc-PLG4AH`;aeMPQjVMSfkuNj^3s@tq@#44W}uqcFvMXI*j`uD*}8?jrnInU~;Zg-vrroV78-)Q?@QUzVo z3+Z&Wg!0kXv%aWY(Kl}kR#7*0^CId7@8%ksyG?bF(^9JtQn`6Ej`EO9+ICaU&u762 zZ`ZJ4wPV5_7J}@30n>fCs;#CxVM){g$4Znoae~6o8Pu=(;Hq=?ALgf3b-LO^@ox4mjwR}Gkw=Ul(Z!KzIJiqF(tD_DA^$^2Bmq2BXq7f-qY zeq>jvDNnY}!K7Mq(`2R{%;?5$3TcG_!{k=8tvB17#FfSKm(I?~h8u^jFI%CvF4ych zkwFx*@yf(UJ+vK%gKiY-E?9>&sHxa}$+w84Y=>5?z!z8vvE3`{|5BZlc`Uzy&OZ zx_$JdYfvdFeBJRQM_H6eSjirWOgY(1$W4qo?KZYWZ6nebfPGD-?WzVnG6i;}T>lr` zOAn#XYyBUef35$c*O&hUp8<6K@{@22mViGVF25AGm!A9?D7ygn+mnNzc z;P>z>;L|XI55mYNLEZg73e>&#Id}$c!8_q39E5wh>;F8^pFPvC4@%tee-oYty@CBfZp%1|a;T)U=+Vexpired = T; } +F_FIXNUM delta; + void fixup_stack_frame(F_STACK_FRAME *frame) { code_fixup(&frame->xt); @@ -185,13 +187,22 @@ void fixup_stack_frame(F_STACK_FRAME *frame) } #ifdef CALLSTACK_UP_P - printf("%x %x\n",frame->xt,*(CELL *)(frame->next + 1)); - code_fixup((CELL *)(frame->next + 1)); + F_STACK_FRAME *next = REBASE_FRAME_SUCCESSOR(frame,delta); + code_fixup((XT *)(next + 1)); #else code_fixup(&frame->return_address); #endif } +void fixup_callstack_object(F_CALLSTACK *stack) +{ + CELL top = (CELL)(stack + 1); + CELL bottom = top + untag_fixnum_fast(stack->length); + delta = (bottom - stack->bottom); + + iterate_callstack_object(stack,fixup_stack_frame); +} + /* Initialize an object in a newly-loaded image */ void relocate_object(CELL relocating) { @@ -212,9 +223,7 @@ void relocate_object(CELL relocating) fixup_alien((F_ALIEN *)relocating); break; case CALLSTACK_TYPE: - iterate_callstack_object( - (F_CALLSTACK *)relocating, - fixup_stack_frame); + fixup_callstack_object((F_CALLSTACK *)relocating); break; } } diff --git a/vm/stack.c b/vm/stack.c index e50575219c..cf3c1df00a 100644 --- a/vm/stack.c +++ b/vm/stack.c @@ -111,7 +111,7 @@ void iterate_callstack(CELL top, CELL bottom, CELL base, CALLSTACK_ITER iterator while(ITERATING_P) { - F_STACK_FRAME *next = (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta); + F_STACK_FRAME *next = REBASE_FRAME_SUCCESSOR(frame,delta); iterator(frame); frame = next; } @@ -344,7 +344,7 @@ static F_FIXNUM delta; void adjust_stack_frame(F_STACK_FRAME *frame) { - FRAME_SUCCESSOR(frame) = (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta); + FRAME_SUCCESSOR(frame) = REBASE_FRAME_SUCCESSOR(frame,delta); } void adjust_callstack(F_CALLSTACK *stack, CELL bottom) diff --git a/vm/stack.h b/vm/stack.h index d2bec4fef1..62ee1d9ba2 100644 --- a/vm/stack.h +++ b/vm/stack.h @@ -56,6 +56,8 @@ void init_stacks(CELL ds_size, CELL rs_size); #define FIRST_STACK_FRAME(stack) (F_STACK_FRAME *)((stack) + 1) +#define REBASE_FRAME_SUCCESSOR(frame,delta) (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta) + typedef void (*CALLSTACK_ITER)(F_STACK_FRAME *frame); void iterate_callstack(CELL top, CELL bottom, CELL base, CALLSTACK_ITER iterator);