fixed Procedure_Call handlers for proper continuation (not sure if this is a proper fix).
fixed bugs caused by conflicts between an 'in out' parameter and GC. shortened Pop_Frame()/Set_Frame_Result() to Return_Frame()
This commit is contained in:
		@ -27,8 +27,7 @@ Ada.Text_IO.Put_Line ("EXPECTED CONS-CELL FOR CAR");
 | 
				
			|||||||
			raise Evaluation_Error;
 | 
								raise Evaluation_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Get_Car(A)); 
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Get_Car(A));
 | 
					 | 
				
			||||||
	end Apply_Car_Procedure;
 | 
						end Apply_Car_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Cdr_Procedure is
 | 
						procedure Apply_Cdr_Procedure is
 | 
				
			||||||
@ -46,8 +45,7 @@ Ada.Text_IO.Put_Line ("EXPECTED CONS-CELL FOR CDR");
 | 
				
			|||||||
			raise Evaluation_Error;
 | 
								raise Evaluation_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Get_Cdr(A));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Get_Cdr(A));
 | 
					 | 
				
			||||||
	end Apply_Cdr_Procedure;
 | 
						end Apply_Cdr_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Cons_Procedure is
 | 
						procedure Apply_Cons_Procedure is
 | 
				
			||||||
@ -64,8 +62,7 @@ Ada.Text_IO.Put_Line ("WRONG NUMBER OF ARGUMETNS FOR CONS");
 | 
				
			|||||||
		B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
							B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
				
			||||||
		Ptr := Make_Cons (Interp.Self, A, B); -- change car
 | 
							Ptr := Make_Cons (Interp.Self, A, B); -- change car
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Ptr);
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Ptr);
 | 
					 | 
				
			||||||
	end Apply_Cons_Procedure;
 | 
						end Apply_Cons_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Setcar_Procedure is
 | 
						procedure Apply_Setcar_Procedure is
 | 
				
			||||||
@ -86,8 +83,7 @@ Ada.Text_IO.Put_Line ("EXPECTED CONS-CELL FOR Setcar");
 | 
				
			|||||||
		B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
							B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
				
			||||||
		Set_Car (A, B); -- change car
 | 
							Set_Car (A, B); -- change car
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, A);
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, A);
 | 
					 | 
				
			||||||
	end Apply_Setcar_Procedure;
 | 
						end Apply_Setcar_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Setcdr_Procedure is
 | 
						procedure Apply_Setcdr_Procedure is
 | 
				
			||||||
@ -108,8 +104,7 @@ Ada.Text_IO.Put_Line ("EXPECTED CONS-CELL FOR Setcdr");
 | 
				
			|||||||
		B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
							B := Get_Car(Get_Cdr(Ptr)); -- the second argument
 | 
				
			||||||
		Set_Cdr (A, B); -- change cdr
 | 
							Set_Cdr (A, B); -- change cdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, A);
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, A);
 | 
					 | 
				
			||||||
	end Apply_Setcdr_Procedure;
 | 
						end Apply_Setcdr_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- -------------------------------------------------------------
 | 
						-- -------------------------------------------------------------
 | 
				
			||||||
@ -132,8 +127,7 @@ Ada.Text_IO.Put ("NOT INTEGER FOR ADD"); Print (Interp, Car);
 | 
				
			|||||||
			Ptr := Get_Cdr(Ptr);
 | 
								Ptr := Get_Cdr(Ptr);
 | 
				
			||||||
		end loop;
 | 
							end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Integer_To_Pointer(Num));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Integer_To_Pointer(Num));
 | 
					 | 
				
			||||||
	end Apply_Add_Procedure;
 | 
						end Apply_Add_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Subtract_Procedure is
 | 
						procedure Apply_Subtract_Procedure is
 | 
				
			||||||
@ -161,8 +155,7 @@ Ada.Text_IO.Put ("NOT INTEGER FOR ADD"); Print (Interp, Car);
 | 
				
			|||||||
			end loop;
 | 
								end loop;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); --  Done with the current frame
 | 
							Return_Frame (Interp, Integer_To_Pointer(Num));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Integer_To_Pointer(Num));
 | 
					 | 
				
			||||||
	end Apply_Subtract_Procedure;
 | 
						end Apply_Subtract_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Multiply_Procedure is
 | 
						procedure Apply_Multiply_Procedure is
 | 
				
			||||||
@ -182,8 +175,7 @@ Ada.Text_IO.Put ("NOT INTEGER FOR MULTIPLY"); Print (Interp, Car);
 | 
				
			|||||||
			Ptr := Get_Cdr(Ptr);
 | 
								Ptr := Get_Cdr(Ptr);
 | 
				
			||||||
		end loop;
 | 
							end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Integer_To_Pointer(Num));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Integer_To_Pointer(Num));
 | 
					 | 
				
			||||||
	end Apply_Multiply_Procedure;
 | 
						end Apply_Multiply_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Quotient_Procedure is
 | 
						procedure Apply_Quotient_Procedure is
 | 
				
			||||||
@ -203,8 +195,7 @@ Ada.Text_IO.Put ("NOT INTEGER FOR MULTIPLY"); Print (Interp, Car);
 | 
				
			|||||||
			Ptr := Get_Cdr(Ptr);
 | 
								Ptr := Get_Cdr(Ptr);
 | 
				
			||||||
		end loop;
 | 
							end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp); -- Done with the current frame
 | 
							Return_Frame (Interp, Integer_To_Pointer(Num));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Integer_To_Pointer(Num));
 | 
					 | 
				
			||||||
	end Apply_Quotient_Procedure;
 | 
						end Apply_Quotient_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	generic 
 | 
						generic 
 | 
				
			||||||
@ -241,8 +232,7 @@ Ada.Text_IO.Put ("NOT INTEGER FOR MULTIPLY"); Print (Interp, Car);
 | 
				
			|||||||
				Ptr := Get_Cdr(Ptr);
 | 
									Ptr := Get_Cdr(Ptr);
 | 
				
			||||||
			end loop;
 | 
								end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Pop_Frame (Interp); --  Done with the current frame
 | 
								Return_Frame (Interp, Bool);
 | 
				
			||||||
			Put_Frame_Result (Interp, Interp.Stack, Bool);
 | 
					 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
Ada.Text_IO.Put_line ("TOO FEW ARGUMETNS FOR COMPARISON");
 | 
					Ada.Text_IO.Put_line ("TOO FEW ARGUMETNS FOR COMPARISON");
 | 
				
			||||||
			raise Syntax_Error;
 | 
								raise Syntax_Error;
 | 
				
			||||||
@ -359,9 +349,7 @@ Ada.Text_IO.Put_line ("TOO FEW ARGUMETNS FOR COMPARISON");
 | 
				
			|||||||
			end if;
 | 
								end if;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		Set_Frame_Opcode (Interp.Stack, Opcode_Grouped_Call);
 | 
							Switch_Frame (Interp.Stack, Opcode_Grouped_Call, Fbody, Nil_Pointer);
 | 
				
			||||||
		Set_Frame_Operand (Interp.Stack, Fbody);
 | 
					 | 
				
			||||||
		Clear_Frame_Result (Interp.Stack);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Tops (Interp, 4);
 | 
							Pop_Tops (Interp, 4);
 | 
				
			||||||
	end Apply_Closure;
 | 
						end Apply_Closure;
 | 
				
			||||||
@ -404,48 +392,28 @@ Ada.Text_IO.Put_line ("TOO FEW ARGUMETNS FOR COMPARISON");
 | 
				
			|||||||
			raise Syntax_Error;
 | 
								raise Syntax_Error;
 | 
				
			||||||
		end if; 
 | 
							end if; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Push_Top (Interp, C'Unchecked_Access);
 | 
							Push_Top (Interp, C'Unchecked_Access); -- this is not needed. TOOD: remove this
 | 
				
			||||||
		C := Get_Frame_Parent(Interp.Stack);
 | 
							C := Make_Continuation (Interp.Self, Get_Frame_Parent(Interp.Stack));
 | 
				
			||||||
declare
 | 
					declare
 | 
				
			||||||
 | 
					p: object_Pointer := get_frame_parent(interp.stack);
 | 
				
			||||||
w: object_word;
 | 
					w: object_word;
 | 
				
			||||||
for w'address use c'address;
 | 
					for w'address use p'address;
 | 
				
			||||||
 | 
					 | 
				
			||||||
f: object_word;
 | 
					 | 
				
			||||||
for f'address use interp.stack'address;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
r: object_pointer := get_frame_result(c);
 | 
					 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
ada.text_io.put_line ("Frame" & object_word'image(f) & " " & Opcode_Type'Image(Get_Frame_Opcode(Interp.Stack)));
 | 
					ada.text_io.put_line ("making continuatination to " & object_word'image(w) & " opcode " & opcode_type'image(get_frame_opcode(p)));
 | 
				
			||||||
ada.text_io.put ("                      CURRENT RESULT ");
 | 
					print (interp, get_Frame_operand(p));
 | 
				
			||||||
print (interp, r);
 | 
					print (interp, get_Frame_intermediate(p));
 | 
				
			||||||
ada.text_io.put_line ("                      PARENT FRAME " & object_word'image(w));
 | 
					ada.text_io.put_line ("-----------------");
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		C := Make_Continuation (Interp.Self, C);
 | 
					 | 
				
			||||||
		C := Make_Cons (Interp.Self, C, Nil_Pointer);
 | 
					 | 
				
			||||||
		C := Make_Cons (Interp.Self, Get_Car(Args), C);
 | 
					 | 
				
			||||||
declare
 | 
					 | 
				
			||||||
w: object_word;
 | 
					 | 
				
			||||||
for w'address use c'address;
 | 
					 | 
				
			||||||
f: object_word;
 | 
					 | 
				
			||||||
for f'address use interp.stack'address;
 | 
					 | 
				
			||||||
begin
 | 
					 | 
				
			||||||
ada.text_io.put ("                      PUSH CONTINUATION ");
 | 
					 | 
				
			||||||
ada.text_io.put (object_word'image(w) & " ");
 | 
					 | 
				
			||||||
print (interp, c);
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Set_Frame_Opcode (Interp.Stack, Opcode_Apply);
 | 
							Set_Frame_Opcode (Interp.Stack, Opcode_Apply);
 | 
				
			||||||
		Set_Frame_Operand (Interp.Stack, C);
 | 
							Set_Frame_Operand (Interp.Stack, Get_Car(Args)); -- (call/cc xxx), xxx becomes this.
 | 
				
			||||||
 | 
							Set_Frame_Intermediate (Interp.Stack, Nil_Pointer); -- pass the continuation object
 | 
				
			||||||
 | 
							Chain_Frame_Intermediate (Interp, Interp.Stack, C); -- as an actual parameter. (xxx #continuation)
 | 
				
			||||||
		Clear_Frame_Result (Interp.Stack);
 | 
							Clear_Frame_Result (Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ada.text_io.put_line ("                      CLEARED RESULT BEFORE APPLYING");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Pop_Tops (Interp, 1);
 | 
							Pop_Tops (Interp, 1);
 | 
				
			||||||
	end Apply_Callcc_Procedure;
 | 
						end Apply_Callcc_Procedure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Apply_Continuation is
 | 
						procedure Apply_Continuation is
 | 
				
			||||||
		R: Object_Pointer;
 | 
					 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
declare
 | 
					declare
 | 
				
			||||||
w: object_word;
 | 
					w: object_word;
 | 
				
			||||||
@ -465,12 +433,9 @@ Print (Interp, get_Frame_result(interp.stack));
 | 
				
			|||||||
			raise Syntax_Error;
 | 
								raise Syntax_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Get the result of the continuation frame
 | 
					 | 
				
			||||||
--		R := Get_Frame_Result(Interp.Stack);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          -- Restore the frame to the remembered one
 | 
					          -- Restore the frame to the remembered one
 | 
				
			||||||
          Interp.Stack := Get_Continuation_Frame(Func);
 | 
							Interp.Stack := Get_Continuation_Frame(Func);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
declare
 | 
					declare
 | 
				
			||||||
f: object_word;
 | 
					f: object_word;
 | 
				
			||||||
for f'address use interp.stack'address;
 | 
					for f'address use interp.stack'address;
 | 
				
			||||||
@ -480,32 +445,16 @@ ada.text_io.put ("                      CURRENT RESULT " );
 | 
				
			|||||||
print (interp, get_Frame_result(interp.stack));
 | 
					print (interp, get_Frame_result(interp.stack));
 | 
				
			||||||
ada.text_io.put ("                      CURRENT OPERAND " );
 | 
					ada.text_io.put ("                      CURRENT OPERAND " );
 | 
				
			||||||
print (interp, get_Frame_operand(interp.stack));
 | 
					print (interp, get_Frame_operand(interp.stack));
 | 
				
			||||||
 | 
					ada.text_io.put ("                      CURRENT INTERMEDIATE " );
 | 
				
			||||||
 | 
					print (interp, get_Frame_intermediate(interp.stack));
 | 
				
			||||||
ada.text_io.put_line ("                      CURRENT OPCODE " & opcode_type'image(get_Frame_opcode(interp.stack)));
 | 
					ada.text_io.put_line ("                      CURRENT OPCODE " & opcode_type'image(get_Frame_opcode(interp.stack)));
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Set_Frame_Result (Interp.Stack, Get_Car(Args)); 
 | 
				
			||||||
ada.text_io.put ("                      CHAIN NEW RESULT, TAKING THE FIRST ONLY FROM ");
 | 
					 | 
				
			||||||
print (interp, args);
 | 
					 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Get_Car(Args)); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--		if R /= Nil_Pointer then
 | 
					 | 
				
			||||||
--ada.text_io.put ("                      CARRY OVER RESULT ");
 | 
					 | 
				
			||||||
--print (interp, get_car(r));
 | 
					 | 
				
			||||||
--			Chain_Frame_Result (Interp, Interp.Stack, Get_Car(R));
 | 
					 | 
				
			||||||
--		end if;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--Set_Frame_Result (Interp.Stack, R);
 | 
					 | 
				
			||||||
--Chain_Frame_Result (Interp, Interp.Stack, Get_Car(Args)); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ada.text_io.put ("                      FINAL RESULT ");
 | 
					ada.text_io.put ("                      FINAL RESULT ");
 | 
				
			||||||
print (interp, get_Frame_result(interp.stack));
 | 
					print (interp, get_Frame_result(interp.stack));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--		if Get_Frame_Parent(Interp.Stack) /= Nil_Pointer then
 | 
					 | 
				
			||||||
--			Set_Frame_Result (Get_Frame_Parent(Interp.Stack), Get_Continuation_Save(Func));
 | 
					 | 
				
			||||||
--			--Set_Frame_Operand (Get_Frame_Parent(Interp.Stack), Get_Continuation_Save2(Func));
 | 
					 | 
				
			||||||
--		end if;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	end Apply_Continuation;
 | 
						end Apply_Continuation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
@ -514,7 +463,7 @@ begin
 | 
				
			|||||||
	Push_Top (Interp, Args'Unchecked_Access);
 | 
						Push_Top (Interp, Args'Unchecked_Access);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Operand := Get_Frame_Operand(Interp.Stack);
 | 
						Operand := Get_Frame_Operand(Interp.Stack);
 | 
				
			||||||
	pragma Assert (Is_Cons(Operand));
 | 
					--	pragma Assert (Is_Cons(Operand));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare
 | 
					declare
 | 
				
			||||||
w: object_word;
 | 
					w: object_word;
 | 
				
			||||||
@ -526,13 +475,15 @@ print (Interp, Operand);
 | 
				
			|||||||
ada.text_io.put ("                      CURRENT RESULT => ");
 | 
					ada.text_io.put ("                      CURRENT RESULT => ");
 | 
				
			||||||
print (Interp, get_frame_result(interp.stack));
 | 
					print (Interp, get_frame_result(interp.stack));
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
	Func := Get_Car(Operand);
 | 
					--	Func := Get_Car(Operand);
 | 
				
			||||||
 | 
					Func := Get_Frame_Operand(Interp.Stack);
 | 
				
			||||||
	if not Is_Normal_Pointer(Func) then
 | 
						if not Is_Normal_Pointer(Func) then
 | 
				
			||||||
		Ada.Text_IO.Put_Line ("INVALID FUNCTION TYPE");
 | 
							Ada.Text_IO.Put_Line ("INVALID FUNCTION TYPE");
 | 
				
			||||||
		raise Evaluation_Error;
 | 
							raise Evaluation_Error;
 | 
				
			||||||
	end if;
 | 
						end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Args := Get_Cdr(Operand);
 | 
					--	Args := Get_Cdr(Operand);
 | 
				
			||||||
 | 
					Args := Get_Frame_Intermediate(Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case Func.Tag is
 | 
						case Func.Tag is
 | 
				
			||||||
		when Procedure_Object => 
 | 
							when Procedure_Object => 
 | 
				
			||||||
 | 
				
			|||||||
@ -24,8 +24,7 @@ procedure Evaluate is
 | 
				
			|||||||
		Operand := Cdr;  -- Skip "And"
 | 
							Operand := Cdr;  -- Skip "And"
 | 
				
			||||||
		if Operand = Nil_Pointer then
 | 
							if Operand = Nil_Pointer then
 | 
				
			||||||
			-- (and)
 | 
								-- (and)
 | 
				
			||||||
			Pop_Frame (Interp); 
 | 
								Return_Frame (Interp, V);
 | 
				
			||||||
			Put_Frame_Result (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
		elsif not Is_Cons(Operand) or else Get_Last_Cdr(Operand) /= Nil_Pointer then
 | 
							elsif not Is_Cons(Operand) or else Get_Last_Cdr(Operand) /= Nil_Pointer then
 | 
				
			||||||
			-- (and . 10)
 | 
								-- (and . 10)
 | 
				
			||||||
			-- (and 1 2 . 10)
 | 
								-- (and 1 2 . 10)
 | 
				
			||||||
@ -213,13 +212,8 @@ Ada.Text_IO.Put_Line ("NO ALTERNATE");
 | 
				
			|||||||
			raise Syntax_Error;
 | 
								raise Syntax_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		declare
 | 
							-- Create a closure object and return it the the upper frame.
 | 
				
			||||||
			Closure: Object_Pointer;
 | 
							Return_Frame (Interp, Make_Closure(Interp.Self, Operand, Get_Frame_Environment(Interp.Stack)));
 | 
				
			||||||
		begin
 | 
					 | 
				
			||||||
			Closure := Make_Closure(Interp.Self, Operand, Get_Frame_Environment(Interp.Stack));
 | 
					 | 
				
			||||||
			Pop_Frame (Interp);  -- Done
 | 
					 | 
				
			||||||
			Put_Frame_Result (Interp, Interp.Stack, Closure);
 | 
					 | 
				
			||||||
		end;
 | 
					 | 
				
			||||||
	end Evaluate_Lambda_Syntax;
 | 
						end Evaluate_Lambda_Syntax;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Check_Let_Syntax is
 | 
						procedure Check_Let_Syntax is
 | 
				
			||||||
@ -418,8 +412,7 @@ Ada.Text_IO.Put_Line ("NO ALTERNATE");
 | 
				
			|||||||
			Ada.Text_IO.Put_LINE ("WRONG NUMBER OF ARGUMENTS FOR QUOTE");
 | 
								Ada.Text_IO.Put_LINE ("WRONG NUMBER OF ARGUMENTS FOR QUOTE");
 | 
				
			||||||
			raise Syntax_Error;
 | 
								raise Syntax_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
		Pop_Frame (Interp);	 -- Done
 | 
							Return_Frame (Interp, Get_Car(Operand));
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Get_Car(Operand));
 | 
					 | 
				
			||||||
	end Evaluate_Quote_Syntax;
 | 
						end Evaluate_Quote_Syntax;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Evaluate_Set_Syntax is
 | 
						procedure Evaluate_Set_Syntax is
 | 
				
			||||||
@ -448,12 +441,12 @@ Ada.Text_IO.Put_Line ("NO ALTERNATE");
 | 
				
			|||||||
			Cdr := Get_Car(Cdr); -- <expression>
 | 
								Cdr := Get_Car(Cdr); -- <expression>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			-- Arrange to finish setting a variable after <expression> evaluation.
 | 
								-- Arrange to finish setting a variable after <expression> evaluation.
 | 
				
			||||||
			--Switch_Frame (Interp.Stack, Opcode_Set_Finish, Car);
 | 
								--Switch_Frame (Interp.Stack, Opcode_Set_Finish, Car, Nil_Pointer);
 | 
				
			||||||
			-- Arrange to evalaute the value part
 | 
								-- Arrange to evalaute the value part
 | 
				
			||||||
			--Push_Frame (Interp, Opcode_Evaluate_Object, Cdr); 
 | 
								--Push_Frame (Interp, Opcode_Evaluate_Object, Cdr); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			-- These 2 lines derives the same result as the 2 lines commented out above.
 | 
								-- These 2 lines derives the same result as the 2 lines commented out above.
 | 
				
			||||||
			Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Cdr);
 | 
								Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Cdr, Nil_Pointer);
 | 
				
			||||||
			Push_Subframe (Interp, Opcode_Set_Finish, Car); 
 | 
								Push_Subframe (Interp, Opcode_Set_Finish, Car); 
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			Ada.Text_IO.Put_LINE ("INVALID SYMBOL AFTER SET!");
 | 
								Ada.Text_IO.Put_LINE ("INVALID SYMBOL AFTER SET!");
 | 
				
			||||||
@ -518,16 +511,15 @@ end;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
						if Operand = Nil_Pointer then
 | 
											if Operand = Nil_Pointer then
 | 
				
			||||||
							-- (begin)
 | 
												-- (begin)
 | 
				
			||||||
							Pop_Frame (Interp);	
 | 
					 | 
				
			||||||
							-- Return nil to the upper frame for (begin).
 | 
												-- Return nil to the upper frame for (begin).
 | 
				
			||||||
							Put_Frame_Result (Interp, Interp.Stack, Nil_Pointer);
 | 
												Return_Frame (Interp, Nil_Pointer);
 | 
				
			||||||
						else
 | 
											else
 | 
				
			||||||
							if Get_Last_Cdr(Operand) /= Nil_Pointer then
 | 
												if Get_Last_Cdr(Operand) /= Nil_Pointer then
 | 
				
			||||||
								Ada.Text_IO.Put_LINE ("FUCKNING CDR FOR BEGIN");
 | 
													Ada.Text_IO.Put_LINE ("FUCKNING CDR FOR BEGIN");
 | 
				
			||||||
								raise Syntax_Error;
 | 
													raise Syntax_Error;
 | 
				
			||||||
							end if;
 | 
												end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							Switch_Frame (Interp.Stack, Opcode_Grouped_Call, Operand);
 | 
												Switch_Frame (Interp.Stack, Opcode_Grouped_Call, Operand, Nil_Pointer);
 | 
				
			||||||
						end if;
 | 
											end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						--if (Interp.Trait.Trait_Bits and No_Optimization) = 0 then
 | 
											--if (Interp.Trait.Trait_Bits and No_Optimization) = 0 then
 | 
				
			||||||
@ -580,7 +572,7 @@ end;
 | 
				
			|||||||
				end if;
 | 
									end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				-- Switch the current frame to evaluate <operator>
 | 
									-- Switch the current frame to evaluate <operator>
 | 
				
			||||||
				Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Car);
 | 
									Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Car, Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				-- Push a new frame to evaluate arguments.
 | 
									-- Push a new frame to evaluate arguments.
 | 
				
			||||||
				Push_Subframe (Interp, Opcode_Procedure_Call, Cdr);
 | 
									Push_Subframe (Interp, Opcode_Procedure_Call, Cdr);
 | 
				
			||||||
@ -593,7 +585,6 @@ end;
 | 
				
			|||||||
	goto Done;
 | 
						goto Done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<<Literal>>
 | 
					<<Literal>>
 | 
				
			||||||
	Pop_Frame (Interp); -- done
 | 
					 | 
				
			||||||
declare
 | 
					declare
 | 
				
			||||||
w: object_word;
 | 
					w: object_word;
 | 
				
			||||||
for w'address use operand'address;
 | 
					for w'address use operand'address;
 | 
				
			||||||
@ -601,7 +592,7 @@ begin
 | 
				
			|||||||
Ada.Text_IO.Put ("Return => (" & object_word'image(w) & ") =>" );
 | 
					Ada.Text_IO.Put ("Return => (" & object_word'image(w) & ") =>" );
 | 
				
			||||||
Print (Interp, Operand);
 | 
					Print (Interp, Operand);
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
	Put_Frame_Result (Interp, Interp.Stack, Operand);
 | 
						Return_Frame (Interp, Operand);
 | 
				
			||||||
	goto Done;
 | 
						goto Done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<<Done>>
 | 
					<<Done>>
 | 
				
			||||||
 | 
				
			|||||||
@ -43,8 +43,7 @@ procedure Execute (Interp: in out Interpreter_Record) is
 | 
				
			|||||||
			Push_Frame (Interp, Opcode_Evaluate_Object, Get_Car(X));
 | 
								Push_Frame (Interp, Opcode_Evaluate_Object, Get_Car(X));
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			-- Return the result of the last expression evaluated.
 | 
								-- Return the result of the last expression evaluated.
 | 
				
			||||||
			Pop_Frame (Interp);
 | 
								Return_Frame (Interp, Y);
 | 
				
			||||||
			Put_Frame_Result (Interp, Interp.Stack, Y);
 | 
					 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
	end Evaluate_Up_To;
 | 
						end Evaluate_Up_To;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -54,30 +53,27 @@ procedure Execute (Interp: in out Interpreter_Record) is
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	procedure Finish_Define_Symbol is
 | 
						procedure Finish_Define_Symbol is
 | 
				
			||||||
		pragma Inline (Finish_Define_Symbol);
 | 
							pragma Inline (Finish_Define_Symbol);
 | 
				
			||||||
		X: aliased Object_Pointer;
 | 
							X: Object_Pointer;
 | 
				
			||||||
		Y: aliased Object_Pointer;
 | 
							Y: aliased Object_Pointer;
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Push_Top (Interp, X'Unchecked_Access);
 | 
							-- Keep Y managed as Y is referenced beyond the gc point. 
 | 
				
			||||||
		Push_Top (Interp, Y'Unchecked_Access);
 | 
							Push_Top (Interp, Y'Unchecked_Access); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		X := Get_Frame_Operand(Interp.Stack); -- symbol
 | 
							X := Get_Frame_Operand(Interp.Stack); -- symbol
 | 
				
			||||||
		pragma Assert (Is_Symbol(X));
 | 
							pragma Assert (Is_Symbol(X));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Y := Get_Frame_Result(Interp.Stack);  -- value list
 | 
							Y := Get_Frame_Result(Interp.Stack);  -- value list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Put_Environment (Interp, X, Y);
 | 
							Put_Environment (Interp, X, Y);  -- gc point
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp);     -- Done
 | 
							Return_Frame (Interp, Y); -- Y is referenced here.
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Y);
 | 
							Pop_Tops (Interp, 1); -- Unmanage Y
 | 
				
			||||||
 | 
					 | 
				
			||||||
		Pop_Tops (Interp, 2);
 | 
					 | 
				
			||||||
	end Finish_Define_Symbol;
 | 
						end Finish_Define_Symbol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Finish_If_Syntax is
 | 
						procedure Finish_If_Syntax is
 | 
				
			||||||
		pragma Inline (Finish_If_Syntax);
 | 
							pragma Inline (Finish_If_Syntax);
 | 
				
			||||||
		X: aliased Object_Pointer;
 | 
							X: aliased Object_Pointer;
 | 
				
			||||||
		Y: aliased Object_Pointer;
 | 
							Y: aliased Object_Pointer;
 | 
				
			||||||
		Z: aliased Object_Pointer;
 | 
					 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Push_Top (Interp, X'Unchecked_Access);
 | 
							Push_Top (Interp, X'Unchecked_Access);
 | 
				
			||||||
		Push_Top (Interp, Y'Unchecked_Access);
 | 
							Push_Top (Interp, Y'Unchecked_Access);
 | 
				
			||||||
@ -97,9 +93,8 @@ procedure Execute (Interp: in out Interpreter_Record) is
 | 
				
			|||||||
				Set_Frame_Operand (Interp.Stack, Get_Car(X));
 | 
									Set_Frame_Operand (Interp.Stack, Get_Car(X));
 | 
				
			||||||
				Clear_Frame_Result (Interp.Stack);
 | 
									Clear_Frame_Result (Interp.Stack);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				Pop_Frame (Interp);
 | 
					 | 
				
			||||||
				-- Return nil if no <alternate> is specified
 | 
									-- Return nil if no <alternate> is specified
 | 
				
			||||||
				Put_Frame_Result (Interp, Interp.Stack, Nil_Pointer);
 | 
									Return_Frame (Interp, Nil_Pointer);
 | 
				
			||||||
			end if;
 | 
								end if;
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			-- All values except #f are true values. evaluate <consequent>
 | 
								-- All values except #f are true values. evaluate <consequent>
 | 
				
			||||||
@ -117,27 +112,66 @@ procedure Execute (Interp: in out Interpreter_Record) is
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	procedure Do_Procedure_Call is
 | 
						procedure Do_Procedure_Call is
 | 
				
			||||||
		pragma Inline (Do_Procedure_Call);
 | 
							pragma Inline (Do_Procedure_Call);
 | 
				
			||||||
		X: aliased Object_Pointer;
 | 
							R: Object_Pointer;
 | 
				
			||||||
		R: aliased Object_Pointer;
 | 
							X: Object_Pointer;
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Push_Top (Interp, X'Unchecked_Access);
 | 
							-- Note: if you change the assignment order of R and X, 
 | 
				
			||||||
		Push_Top (Interp, R'Unchecked_Access);
 | 
							--       Push_Top() and Pop_Tops() are needed.
 | 
				
			||||||
 | 
							--Push_Top (Interp, X'Unchecked_Access);
 | 
				
			||||||
		X := Get_Frame_Operand(Interp.Stack);
 | 
							--Push_Top (Interp, R'Unchecked_Access);
 | 
				
			||||||
		R := Make_Cons(Interp.Self, Get_Frame_Result(Interp.Stack), Get_Frame_Intermediate(Interp.Stack));
 | 
							R := Make_Cons(Interp.Self, Get_Frame_Result(Interp.Stack), Get_Frame_Intermediate(Interp.Stack));
 | 
				
			||||||
 | 
							X := Get_Frame_Operand(Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if Is_Cons(X) then
 | 
							if Is_Cons(X) then
 | 
				
			||||||
			Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Get_Car(X));
 | 
								Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Get_Car(X), Nil_Pointer);
 | 
				
			||||||
			Push_Subframe_With_Intermediate (Interp, Opcode_Procedure_Call, Get_Cdr(X), R);
 | 
								Push_Subframe_With_Intermediate (Interp, Opcode_Procedure_Call, Get_Cdr(X), R);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			-- no more argument to evaluate. 
 | 
								-- no more argument to evaluate. 
 | 
				
			||||||
			-- apply the evaluated arguments to the evaluated operator.
 | 
								-- apply the evaluated arguments to the evaluated operator.
 | 
				
			||||||
			Switch_Frame (Interp.Stack, Opcode_Apply, Reverse_Cons(R));
 | 
								R := Reverse_Cons(R);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--ada.text_io.put_line ("xxxxxxxxxxxxxxxxxx");
 | 
				
			||||||
 | 
					--print (interp, r);
 | 
				
			||||||
 | 
					--print (interp, get_car(r));
 | 
				
			||||||
 | 
					--print (interp, get_cdr(r));
 | 
				
			||||||
 | 
					--ada.text_io.put_line ("xxxxxxxxxxxxxxxxxx");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								-- This frame can be resumed. Switching the current frame to Opcode_Apply
 | 
				
			||||||
 | 
								-- affects continuation objects that point to the current frame. However,
 | 
				
			||||||
 | 
								-- keeping it unchanged causes this frame to repeat actions that has been 
 | 
				
			||||||
 | 
								-- taken previously when it's resumed. So i change the frame to something 
 | 
				
			||||||
 | 
								-- special designed for continuation only.
 | 
				
			||||||
 | 
								Switch_Frame (Interp.Stack, Opcode_Procedure_Call_Finish, Get_Car(R), Nil_Pointer);
 | 
				
			||||||
 | 
								Pop_Frame (Interp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								-- Replace the current frame popped by a new applying frame.
 | 
				
			||||||
 | 
								Push_Frame_With_Intermediate (Interp, Opcode_Apply, Get_Car(R), Get_Cdr(R));
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Tops (Interp, 2);
 | 
							--Pop_Tops (Interp, 2);
 | 
				
			||||||
	end Do_Procedure_Call;
 | 
						end Do_Procedure_Call;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procedure Do_Procedure_Call_Finish is
 | 
				
			||||||
 | 
							pragma Inline (Do_Procedure_Call_Finish);
 | 
				
			||||||
 | 
							R: Object_Pointer;
 | 
				
			||||||
 | 
							X: Object_Pointer;
 | 
				
			||||||
 | 
						begin
 | 
				
			||||||
 | 
							-- TODO: is this really correct? verify this.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							-- Note: if you change the assignment order of R and X, 
 | 
				
			||||||
 | 
							--       Push_Top() and Pop_Tops() are needed.
 | 
				
			||||||
 | 
							--Push_Top (Interp, X'Unchecked_Access);
 | 
				
			||||||
 | 
							--Push_Top (Interp, R'Unchecked_Access);
 | 
				
			||||||
 | 
							R := Make_Cons(Interp.Self, Get_Frame_Result(Interp.Stack), Nil_Pointer);
 | 
				
			||||||
 | 
							X := Get_Frame_Operand(Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pragma Assert (Is_Continuation(X)); -- this procedure can be called for continuation only.
 | 
				
			||||||
 | 
							Pop_Frame (Interp);
 | 
				
			||||||
 | 
							Push_Frame_With_Intermediate (Interp, Opcode_Apply, X, R);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							--Pop_Tops (Interp, 2);
 | 
				
			||||||
 | 
						end Do_Procedure_Call_Finish;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- ----------------------------------------------------------------
 | 
						-- ----------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Do_Grouped_Call is
 | 
						procedure Do_Grouped_Call is
 | 
				
			||||||
@ -149,7 +183,7 @@ procedure Execute (Interp: in out Interpreter_Record) is
 | 
				
			|||||||
		pragma Assert (Is_Cons(X)); -- The caller must ensure this.
 | 
							pragma Assert (Is_Cons(X)); -- The caller must ensure this.
 | 
				
			||||||
		-- Switch the current frame to evaluate the first 
 | 
							-- Switch the current frame to evaluate the first 
 | 
				
			||||||
		-- expression in the group.
 | 
							-- expression in the group.
 | 
				
			||||||
		Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Get_Car(X));
 | 
							Switch_Frame (Interp.Stack, Opcode_Evaluate_Object, Get_Car(X), Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		X := Get_Cdr(X);
 | 
							X := Get_Cdr(X);
 | 
				
			||||||
		if Is_Cons(X) then
 | 
							if Is_Cons(X) then
 | 
				
			||||||
@ -333,8 +367,7 @@ print (interp, Get_Frame_Result(Interp.Stack));
 | 
				
			|||||||
			raise Evaluation_Error;
 | 
								raise Evaluation_Error;
 | 
				
			||||||
		end if;
 | 
							end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Frame (Interp);     -- Done
 | 
							Return_Frame (Interp, Y);
 | 
				
			||||||
		Put_Frame_Result (Interp, Interp.Stack, Y);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Tops (Interp, 2);
 | 
							Pop_Tops (Interp, 2);
 | 
				
			||||||
	end Do_Set_Finish;
 | 
						end Do_Set_Finish;
 | 
				
			||||||
@ -342,6 +375,8 @@ print (interp, Get_Frame_Result(Interp.Stack));
 | 
				
			|||||||
	procedure Evaluate is separate;
 | 
						procedure Evaluate is separate;
 | 
				
			||||||
	procedure Apply is separate;
 | 
						procedure Apply is separate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- --------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Unfetch_Character is
 | 
						procedure Unfetch_Character is
 | 
				
			||||||
		pragma Inline (Unfetch_Character);
 | 
							pragma Inline (Unfetch_Character);
 | 
				
			||||||
		pragma Assert (not Interp.LC_Unfetched);	
 | 
							pragma Assert (not Interp.LC_Unfetched);	
 | 
				
			||||||
@ -672,33 +707,15 @@ Ada.Text_IO.Put_Line ("ERROR: PREMATURE LIST END");
 | 
				
			|||||||
				Push_Frame (Interp, Opcode_Close_Quote_In_List, Nil_Pointer);
 | 
									Push_Frame (Interp, Opcode_Close_Quote_In_List, Nil_Pointer);
 | 
				
			||||||
				Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
									Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			when Integer_Token =>
 | 
					 | 
				
			||||||
				-- TODO: bignum
 | 
					 | 
				
			||||||
				V := String_To_Integer_Pointer(Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Character_Token =>
 | 
					 | 
				
			||||||
				pragma Assert (Interp.Token.Value.Last = 1);
 | 
					 | 
				
			||||||
				V := Character_To_Pointer(Interp.Token.Value.Ptr.all(1));
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when String_Token =>
 | 
					 | 
				
			||||||
				V := Make_String(Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Identifier_Token =>	
 | 
					 | 
				
			||||||
				V := Make_Symbol(Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when True_Token =>
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, True_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when False_Token =>
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, False_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when others =>
 | 
								when others =>
 | 
				
			||||||
				-- TODO: set various error info
 | 
									V := Token_To_Pointer (Interp.Self, Interp.Token);
 | 
				
			||||||
				raise Syntax_Error;
 | 
									if V = null then
 | 
				
			||||||
 | 
										-- TODO: set various error info
 | 
				
			||||||
 | 
										raise Syntax_Error;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
				
			||||||
 | 
									end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		end case;
 | 
							end case;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	end Read_List;
 | 
						end Read_List;
 | 
				
			||||||
@ -729,39 +746,16 @@ Ada.Text_IO.Put_Line ("ERROR: CDR QUOT LIST END");
 | 
				
			|||||||
				Push_Frame (Interp, Opcode_Close_Quote_In_List, Nil_Pointer);
 | 
									Push_Frame (Interp, Opcode_Close_Quote_In_List, Nil_Pointer);
 | 
				
			||||||
				Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
									Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			when Integer_Token =>
 | 
					 | 
				
			||||||
				-- TODO: bignum
 | 
					 | 
				
			||||||
				V := String_To_Integer_Pointer(Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Character_Token =>
 | 
					 | 
				
			||||||
				pragma Assert (Interp.Token.Value.Last = 1);
 | 
					 | 
				
			||||||
				V := Character_To_Pointer(Interp.Token.Value.Ptr.all(1));
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
			when String_Token =>
 | 
					 | 
				
			||||||
				V := Make_String (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Identifier_Token =>	
 | 
					 | 
				
			||||||
				V := Make_Symbol (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when True_Token =>
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, True_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when False_Token =>
 | 
					 | 
				
			||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
					 | 
				
			||||||
				Chain_Frame_Intermediate (Interp, Interp.Stack, False_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when others =>
 | 
								when others =>
 | 
				
			||||||
				-- TODO: set various error info
 | 
									V := Token_To_Pointer (Interp.Self, Interp.Token);
 | 
				
			||||||
				raise Syntax_Error;
 | 
									if V = null then
 | 
				
			||||||
 | 
										-- TODO: set various error info
 | 
				
			||||||
 | 
										raise Syntax_Error;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										Chain_Frame_Intermediate (Interp, Interp.Stack, V);
 | 
				
			||||||
 | 
										Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
 | 
				
			||||||
 | 
									end if;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		end case;
 | 
							end case;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	end Read_List_Cdr;
 | 
						end Read_List_Cdr;
 | 
				
			||||||
@ -775,7 +769,7 @@ Ada.Text_IO.Put_Line ("ERROR: CDR QUOT LIST END");
 | 
				
			|||||||
		case Interp.Token.Kind is
 | 
							case Interp.Token.Kind is
 | 
				
			||||||
			when Right_Parenthesis_Token =>
 | 
								when Right_Parenthesis_Token =>
 | 
				
			||||||
				V := Get_Frame_Intermediate(Interp.Stack);
 | 
									V := Get_Frame_Intermediate(Interp.Stack);
 | 
				
			||||||
				pragma Assert (V /= Nil_Pointer);
 | 
									pragma Assert (Is_Cons(V));
 | 
				
			||||||
				-- The first item in the chain is actually Cdr of the last cell.
 | 
									-- The first item in the chain is actually Cdr of the last cell.
 | 
				
			||||||
				V := Reverse_Cons(Get_Cdr(V), Get_Car(V)); 
 | 
									V := Reverse_Cons(Get_Cdr(V), Get_Car(V)); 
 | 
				
			||||||
				Pop_Frame (Interp); 
 | 
									Pop_Frame (Interp); 
 | 
				
			||||||
@ -792,8 +786,9 @@ Ada.Text_IO.Put_Line ("Right parenthesis expected");
 | 
				
			|||||||
		V: Object_Pointer;
 | 
							V: Object_Pointer;
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		V := Get_Frame_Intermediate(Interp.Stack);
 | 
							V := Get_Frame_Intermediate(Interp.Stack);
 | 
				
			||||||
		Pop_Frame (Interp);
 | 
							pragma Assert (Is_Cons(V));
 | 
				
			||||||
		Set_Frame_Result (Interp.Stack, Get_Car(V));
 | 
							pragma Assert (Get_Cdr(V) = Nil_Pointer); -- only 1 item as it's used for the top-level list only
 | 
				
			||||||
 | 
							Return_Frame (Interp, Get_Car(V));
 | 
				
			||||||
	end Close_List;
 | 
						end Close_List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Close_Quote_In_List is
 | 
						procedure Close_Quote_In_List is
 | 
				
			||||||
@ -814,8 +809,7 @@ Ada.Text_IO.Put_Line ("Right parenthesis expected");
 | 
				
			|||||||
		V := Get_Frame_Result(Interp.Stack);
 | 
							V := Get_Frame_Result(Interp.Stack);
 | 
				
			||||||
		V := Make_Cons(Interp.Self, V, Nil_Pointer);
 | 
							V := Make_Cons(Interp.Self, V, Nil_Pointer);
 | 
				
			||||||
		V := Make_Cons(Interp.Self, Interp.Symbol.Quote, V);
 | 
							V := Make_Cons(Interp.Self, Interp.Symbol.Quote, V);
 | 
				
			||||||
		Pop_Frame (Interp);
 | 
							Return_Frame (Interp, V);
 | 
				
			||||||
		Set_Frame_Result (Interp.Stack, V);
 | 
					 | 
				
			||||||
	end Close_Quote;
 | 
						end Close_Quote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Read_Object is
 | 
						procedure Read_Object is
 | 
				
			||||||
@ -837,46 +831,24 @@ Ada.Text_IO.Put_Line ("INFO: NO MORE TOKEN ");
 | 
				
			|||||||
				Set_Frame_Opcode (Interp.Stack, Opcode_Close_Quote);
 | 
									Set_Frame_Opcode (Interp.Stack, Opcode_Close_Quote);
 | 
				
			||||||
				Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
									Push_Frame (Interp, Opcode_Read_Object, Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			when Integer_Token =>
 | 
					 | 
				
			||||||
				-- TODO: bignum
 | 
					 | 
				
			||||||
				V := String_To_Integer_Pointer(Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Character_Token =>
 | 
					 | 
				
			||||||
				pragma Assert (Interp.Token.Value.Last = 1);
 | 
					 | 
				
			||||||
				V := Character_To_Pointer(Interp.Token.Value.Ptr.all(1));
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when String_Token =>
 | 
					 | 
				
			||||||
				V := Make_String (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when Identifier_Token =>	
 | 
					 | 
				
			||||||
				V := Make_Symbol (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, V);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when True_Token =>	
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, True_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when False_Token =>	
 | 
					 | 
				
			||||||
				Pop_Frame (Interp); -- Done with the current frame
 | 
					 | 
				
			||||||
				Set_Frame_Result (Interp.Stack, False_Pointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when others =>
 | 
								when others =>
 | 
				
			||||||
				-- TODO: set various error info
 | 
									V := Token_To_Pointer (Interp.Self, Interp.Token);
 | 
				
			||||||
 | 
									if V = null then
 | 
				
			||||||
 | 
										-- TODO: set various error info
 | 
				
			||||||
Ada.Text_IO.Put_Line ("INFO: UNKNOWN TOKEN " & Token_Kind'Image(Interp.Token.Kind));
 | 
					Ada.Text_IO.Put_Line ("INFO: UNKNOWN TOKEN " & Token_Kind'Image(Interp.Token.Kind));
 | 
				
			||||||
				raise Syntax_Error;
 | 
										raise Syntax_Error;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										Return_Frame (Interp, V);
 | 
				
			||||||
 | 
									end if;
 | 
				
			||||||
		end case;
 | 
							end case;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	end Read_Object;
 | 
						end Read_Object;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- --------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						-- TODO: This comment is out-dated. Update it with Intermediate.
 | 
				
			||||||
	-- Stack frames looks like this upon initialization
 | 
						-- Stack frames looks like this upon initialization
 | 
				
			||||||
	-- 
 | 
						-- 
 | 
				
			||||||
	--               | Opcode                 | Operand    | Result
 | 
						--               | Opcode                 | Operand    | Result
 | 
				
			||||||
@ -940,7 +912,7 @@ begin
 | 
				
			|||||||
	pragma Assert (Interp.Stack /= Nil_Pointer);
 | 
						pragma Assert (Interp.Stack /= Nil_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- The caller must ensure there are no temporary object pointers.
 | 
						-- The caller must ensure there are no temporary object pointers.
 | 
				
			||||||
	pragma Assert (Interp.Top.Last < Interp.Top.Data'First);
 | 
						--pragma Assert (Interp.Top.Last < Interp.Top.Data'First);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	loop
 | 
						loop
 | 
				
			||||||
ada.text_io.put_line (Opcode_Type'Image(Get_Frame_Opcode(Interp.Stack)));
 | 
					ada.text_io.put_line (Opcode_Type'Image(Get_Frame_Opcode(Interp.Stack)));
 | 
				
			||||||
@ -982,6 +954,8 @@ ada.text_io.put_line (Opcode_Type'Image(Get_Frame_Opcode(Interp.Stack)));
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			when Opcode_Procedure_Call =>
 | 
								when Opcode_Procedure_Call =>
 | 
				
			||||||
				Do_Procedure_Call;
 | 
									Do_Procedure_Call;
 | 
				
			||||||
 | 
								when Opcode_Procedure_Call_Finish =>
 | 
				
			||||||
 | 
									Do_Procedure_Call_Finish;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			when Opcode_Set_Finish =>
 | 
								when Opcode_Set_Finish =>
 | 
				
			||||||
				Do_Set_Finish; -- Assignment
 | 
									Do_Set_Finish; -- Assignment
 | 
				
			||||||
 | 
				
			|||||||
@ -130,5 +130,4 @@ package body Token is
 | 
				
			|||||||
		Append_Buffer (Interp, Interp.Token.Value, Tmp);
 | 
							Append_Buffer (Interp, Interp.Token.Value, Tmp);
 | 
				
			||||||
	end Append_Character;
 | 
						end Append_Character;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
end Token;
 | 
					end Token;
 | 
				
			||||||
 | 
				
			|||||||
@ -109,6 +109,7 @@ package body H2.Scheme is
 | 
				
			|||||||
		Opcode_Let_Evaluation,
 | 
							Opcode_Let_Evaluation,
 | 
				
			||||||
		Opcode_Let_Finish,
 | 
							Opcode_Let_Finish,
 | 
				
			||||||
		Opcode_Procedure_Call,
 | 
							Opcode_Procedure_Call,
 | 
				
			||||||
 | 
							Opcode_Procedure_Call_Finish,
 | 
				
			||||||
		Opcode_Set_Finish,
 | 
							Opcode_Set_Finish,
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		Opcode_Apply,
 | 
							Opcode_Apply,
 | 
				
			||||||
@ -413,6 +414,35 @@ package body H2.Scheme is
 | 
				
			|||||||
		 return Integer_To_Pointer(Opcode_Type'Pos(Opcode));
 | 
							 return Integer_To_Pointer(Opcode_Type'Pos(Opcode));
 | 
				
			||||||
	end Opcode_To_Pointer;
 | 
						end Opcode_To_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function Token_To_Pointer (Interp: access Interpreter_Record; 
 | 
				
			||||||
 | 
						                           Token:  in     Token_Record) return Object_Pointer is
 | 
				
			||||||
 | 
						begin
 | 
				
			||||||
 | 
							case Token.Kind is
 | 
				
			||||||
 | 
								when Integer_Token =>
 | 
				
			||||||
 | 
									-- TODO: bignum
 | 
				
			||||||
 | 
									return String_To_Integer_Pointer(Token.Value.Ptr.all(1..Token.Value.Last));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								when Character_Token =>
 | 
				
			||||||
 | 
									pragma Assert (Token.Value.Last = 1);
 | 
				
			||||||
 | 
									return Character_To_Pointer(Token.Value.Ptr.all(1));
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								when String_Token =>
 | 
				
			||||||
 | 
									return Make_String (Interp, Token.Value.Ptr.all(1..Token.Value.Last));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								when Identifier_Token =>	
 | 
				
			||||||
 | 
									return Make_Symbol (Interp, Token.Value.Ptr.all(1..Token.Value.Last));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								when True_Token =>
 | 
				
			||||||
 | 
									return True_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								when False_Token =>
 | 
				
			||||||
 | 
									return False_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								when others =>
 | 
				
			||||||
 | 
									return null;
 | 
				
			||||||
 | 
							end case;
 | 
				
			||||||
 | 
						end Token_To_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-----------------------------------------------------------------------------
 | 
						-----------------------------------------------------------------------------
 | 
				
			||||||
	-- MEMORY MANAGEMENT
 | 
						-- MEMORY MANAGEMENT
 | 
				
			||||||
	-----------------------------------------------------------------------------
 | 
						-----------------------------------------------------------------------------
 | 
				
			||||||
@ -724,6 +754,7 @@ ada.text_io.put_line ("HEAP SOURCE IS NIL");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ada.Text_IO.Put_LINE ("GC RUNNING");
 | 
				
			||||||
--declare
 | 
					--declare
 | 
				
			||||||
--Avail: Heap_Size;
 | 
					--Avail: Heap_Size;
 | 
				
			||||||
--begin
 | 
					--begin
 | 
				
			||||||
@ -1143,21 +1174,20 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
				
			|||||||
	-----------------------------------------------------------------------------
 | 
						-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function Make_Frame (Interp:  access Interpreter_Record;
 | 
						function Make_Frame (Interp:  access Interpreter_Record;
 | 
				
			||||||
	                     Stack:   in     Object_Pointer; -- current stack pointer
 | 
						                     Parent:   in     Object_Pointer; -- current stack pointer
 | 
				
			||||||
	                     Opcode:  in     Object_Pointer;
 | 
						                     Opcode:  in     Object_Pointer;
 | 
				
			||||||
	                     Operand: in     Object_Pointer;
 | 
						                     Operand: in     Object_Pointer;
 | 
				
			||||||
	                     Envir:   in     Object_Pointer;
 | 
						                     Envir:   in     Object_Pointer;
 | 
				
			||||||
	                     Interm:  in     Object_Pointer) return Object_Pointer is
 | 
						                     Interm:  in     Object_Pointer) return Object_Pointer is
 | 
				
			||||||
		Frame: Object_Pointer;
 | 
							Frame: Object_Pointer;
 | 
				
			||||||
		Aliased_Stack: aliased Object_Pointer := Stack;
 | 
							Aliased_Parent: aliased Object_Pointer := Parent;
 | 
				
			||||||
		Aliased_Opcode: aliased Object_Pointer := Opcode;
 | 
							Aliased_Opcode: aliased Object_Pointer := Opcode;
 | 
				
			||||||
		Aliased_Operand: aliased Object_Pointer := Operand;
 | 
							Aliased_Operand: aliased Object_Pointer := Operand;
 | 
				
			||||||
		Aliased_Envir: aliased Object_Pointer := Envir;
 | 
							Aliased_Envir: aliased Object_Pointer := Envir;
 | 
				
			||||||
		Aliased_Interm: aliased Object_Pointer := Interm;
 | 
							Aliased_Interm: aliased Object_Pointer := Interm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
 | 
							Push_Top (Interp.all, Aliased_Parent'Unchecked_Access);
 | 
				
			||||||
		Push_Top (Interp.all, Aliased_Stack'Unchecked_Access);
 | 
					 | 
				
			||||||
		Push_Top (Interp.all, Aliased_Opcode'Unchecked_Access);
 | 
							Push_Top (Interp.all, Aliased_Opcode'Unchecked_Access);
 | 
				
			||||||
		Push_Top (Interp.all, Aliased_Operand'Unchecked_Access);
 | 
							Push_Top (Interp.all, Aliased_Operand'Unchecked_Access);
 | 
				
			||||||
		Push_Top (Interp.all, Aliased_Envir'Unchecked_Access);
 | 
							Push_Top (Interp.all, Aliased_Envir'Unchecked_Access);
 | 
				
			||||||
@ -1167,12 +1197,11 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
				
			|||||||
--       Since it's used for stack, it can be made special.
 | 
					--       Since it's used for stack, it can be made special.
 | 
				
			||||||
		Frame := Allocate_Pointer_Object (Interp, Frame_Object_Size, Nil_Pointer);
 | 
							Frame := Allocate_Pointer_Object (Interp, Frame_Object_Size, Nil_Pointer);
 | 
				
			||||||
		Frame.Tag := Frame_Object;
 | 
							Frame.Tag := Frame_Object;
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Parent_Index) := Aliased_Stack;
 | 
							Frame.Pointer_Slot(Frame_Parent_Index) := Aliased_Parent;
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Opcode_Index) := Aliased_Opcode;
 | 
							Frame.Pointer_Slot(Frame_Opcode_Index) := Aliased_Opcode;
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Operand_Index) := Aliased_Operand;
 | 
							Frame.Pointer_Slot(Frame_Operand_Index) := Aliased_Operand;
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Environment_Index) := Aliased_Envir;
 | 
							Frame.Pointer_Slot(Frame_Environment_Index) := Aliased_Envir;
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Intermediate_Index) := Aliased_Interm;
 | 
							Frame.Pointer_Slot(Frame_Intermediate_Index) := Aliased_Interm;
 | 
				
			||||||
--Print_Object_Pointer ("Make_Frame Result - ", Result);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Pop_Tops (Interp.all, 5);
 | 
							Pop_Tops (Interp.all, 5);
 | 
				
			||||||
		return Frame;
 | 
							return Frame;
 | 
				
			||||||
@ -1244,15 +1273,6 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
				
			|||||||
		Frame.Pointer_Slot(Frame_Result_Index) := Value;
 | 
							Frame.Pointer_Slot(Frame_Result_Index) := Value;
 | 
				
			||||||
	end Set_Frame_Result;
 | 
						end Set_Frame_Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Put_Frame_Result (Interp: in out Interpreter_Record;
 | 
					 | 
				
			||||||
	                              Frame:  in     Object_Pointer; -- TODO: remove this parameter
 | 
					 | 
				
			||||||
	                              Value:  in     Object_Pointer) is
 | 
					 | 
				
			||||||
		pragma Inline (Put_Frame_Result);
 | 
					 | 
				
			||||||
		pragma Assert (Is_Frame(Frame));
 | 
					 | 
				
			||||||
	begin
 | 
					 | 
				
			||||||
		Interp.Stack.Pointer_Slot(Frame_Result_Index) := Value;
 | 
					 | 
				
			||||||
	end Put_Frame_Result;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	procedure Clear_Frame_Result (Frame: in Object_Pointer) is
 | 
						procedure Clear_Frame_Result (Frame: in Object_Pointer) is
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Frame.Pointer_Slot(Frame_Result_Index) := Nil_Pointer;
 | 
							Frame.Pointer_Slot(Frame_Result_Index) := Nil_Pointer;
 | 
				
			||||||
@ -1310,14 +1330,23 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
				
			|||||||
		return Frame.Pointer_Slot(Frame_Parent_Index);
 | 
							return Frame.Pointer_Slot(Frame_Parent_Index);
 | 
				
			||||||
	end Get_Frame_Parent;
 | 
						end Get_Frame_Parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procedure Set_Frame_Parent (Frame: in Object_Pointer;
 | 
				
			||||||
 | 
						                            Value: in Object_Pointer) is
 | 
				
			||||||
 | 
							pragma Inline (Set_Frame_Parent);
 | 
				
			||||||
 | 
							pragma Assert (Is_Frame(Frame));
 | 
				
			||||||
 | 
						begin
 | 
				
			||||||
 | 
							Frame.Pointer_Slot(Frame_Parent_Index) := Value;
 | 
				
			||||||
 | 
						end Set_Frame_Parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Switch_Frame (Frame:   in Object_Pointer;
 | 
						procedure Switch_Frame (Frame:   in Object_Pointer;
 | 
				
			||||||
	                        Opcode:  in Opcode_Type;
 | 
						                        Opcode:  in Opcode_Type;
 | 
				
			||||||
	                        Operand: in Object_Pointer) is
 | 
						                        Operand: in Object_Pointer;
 | 
				
			||||||
 | 
						                        Interm:  in Object_Pointer) is
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Set_Frame_Opcode (Frame, Opcode);	
 | 
							Set_Frame_Opcode (Frame, Opcode);	
 | 
				
			||||||
		Set_Frame_Operand (Frame, Operand);	
 | 
							Set_Frame_Operand (Frame, Operand);	
 | 
				
			||||||
 | 
							Set_Frame_Intermediate (Frame, Interm);
 | 
				
			||||||
		Set_Frame_Result (Frame, Nil_Pointer);
 | 
							Set_Frame_Result (Frame, Nil_Pointer);
 | 
				
			||||||
		--Set_Frame_Intermediate (Frame, Nil_Pointer);
 | 
					 | 
				
			||||||
	end Switch_Frame;
 | 
						end Switch_Frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-----------------------------------------------------------------------------
 | 
						-----------------------------------------------------------------------------
 | 
				
			||||||
@ -2023,9 +2052,11 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
				
			|||||||
	begin
 | 
						begin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if DEBUG_GC then
 | 
					if DEBUG_GC then
 | 
				
			||||||
ADA.TEXT_IO.PUT_LINE ("XXXXXXXXXXXXXXXXXXXXXXXXX NO PROINTING XXXXXXXXXXXXXXXXXXXXXXXxxx");
 | 
					Print_Object (Source); -- use a recursive version 
 | 
				
			||||||
 | 
					Ada.Text_IO.New_Line;
 | 
				
			||||||
return;
 | 
					return;
 | 
				
			||||||
end if;
 | 
					end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- TODO: Let Make_Frame use a dedicated stack space that's apart from the heap.
 | 
							-- TODO: Let Make_Frame use a dedicated stack space that's apart from the heap.
 | 
				
			||||||
		--       This way, the stack frame doesn't have to be managed by GC.
 | 
							--       This way, the stack frame doesn't have to be managed by GC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2038,69 +2069,68 @@ end if;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		loop
 | 
							loop
 | 
				
			||||||
			case Opcode is
 | 
								case Opcode is
 | 
				
			||||||
			when 1 =>
 | 
									when 1 =>
 | 
				
			||||||
				if Is_Cons(Operand) then
 | 
										if Is_Cons(Operand) then
 | 
				
			||||||
					-- push cdr
 | 
											-- push cdr
 | 
				
			||||||
					Stack := Make_Frame (Interp.Self, Stack, Integer_To_Pointer(2), Get_Cdr(Operand), Nil_Pointer, Nil_Pointer); -- push cdr
 | 
											Stack := Make_Frame (Interp.Self, Stack, Integer_To_Pointer(2), Get_Cdr(Operand), Nil_Pointer, Nil_Pointer); -- push cdr
 | 
				
			||||||
					Ada.Text_IO.Put ("(");
 | 
											Ada.Text_IO.Put ("(");
 | 
				
			||||||
					Operand := Get_Car(Operand);
 | 
											Operand := Get_Car(Operand);
 | 
				
			||||||
					Opcode := 1;
 | 
											Opcode := 1;
 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					Print_Atom (Operand);
 | 
					 | 
				
			||||||
					if Stack = Nil_Pointer then 
 | 
					 | 
				
			||||||
						Opcode := 0; -- stack empty. arrange to exit
 | 
					 | 
				
			||||||
						Operand := True_Pointer; -- return value
 | 
					 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
						Opcode := Pointer_To_Integer(Stack.Pointer_Slot(Frame_Opcode_Index));
 | 
					 | 
				
			||||||
						Operand := Stack.Pointer_Slot(Frame_Operand_Index);
 | 
					 | 
				
			||||||
						Stack := Stack.Pointer_Slot(Frame_Parent_Index); -- pop
 | 
					 | 
				
			||||||
					end if;
 | 
					 | 
				
			||||||
				end if;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			when 2 =>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if Is_Cons(Operand) then
 | 
					 | 
				
			||||||
					-- push cdr
 | 
					 | 
				
			||||||
					Stack := Make_Frame (Interp.Self, Stack, Integer_To_Pointer(2), Get_Cdr(Operand), Nil_Pointer, Nil_Pointer); -- push
 | 
					 | 
				
			||||||
					Ada.Text_IO.Put (" ");
 | 
					 | 
				
			||||||
					Operand := Get_Car(Operand); -- car
 | 
					 | 
				
			||||||
					Opcode := 1;
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					if Operand /= Nil_Pointer then
 | 
					 | 
				
			||||||
						-- cdr of the last cons cell is not null.
 | 
					 | 
				
			||||||
						Ada.Text_IO.Put (" . ");
 | 
					 | 
				
			||||||
						Print_Atom (Operand);
 | 
											Print_Atom (Operand);
 | 
				
			||||||
 | 
											if Stack = Nil_Pointer then 
 | 
				
			||||||
 | 
												Opcode := 0; -- stack empty. arrange to exit
 | 
				
			||||||
 | 
												Operand := True_Pointer; -- return value
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												Opcode := Pointer_To_Integer(Stack.Pointer_Slot(Frame_Opcode_Index));
 | 
				
			||||||
 | 
												Operand := Stack.Pointer_Slot(Frame_Operand_Index);
 | 
				
			||||||
 | 
												Stack := Stack.Pointer_Slot(Frame_Parent_Index); -- pop
 | 
				
			||||||
 | 
											end if;
 | 
				
			||||||
					end if;
 | 
										end if;
 | 
				
			||||||
					Ada.Text_IO.Put (")");
 | 
						
 | 
				
			||||||
 | 
									when 2 =>
 | 
				
			||||||
					if Stack = Nil_Pointer then
 | 
						
 | 
				
			||||||
						Opcode := 0; -- stack empty. arrange to exit
 | 
										if Is_Cons(Operand) then
 | 
				
			||||||
 | 
											-- push cdr
 | 
				
			||||||
 | 
											Stack := Make_Frame (Interp.Self, Stack, Integer_To_Pointer(2), Get_Cdr(Operand), Nil_Pointer, Nil_Pointer); -- push
 | 
				
			||||||
 | 
											Ada.Text_IO.Put (" ");
 | 
				
			||||||
 | 
											Operand := Get_Car(Operand); -- car
 | 
				
			||||||
 | 
											Opcode := 1;
 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
						Opcode := Pointer_To_Integer(Stack.Pointer_Slot(Frame_Opcode_Index));
 | 
											if Operand /= Nil_Pointer then
 | 
				
			||||||
						Operand := Stack.Pointer_Slot(Frame_Operand_Index);
 | 
												-- cdr of the last cons cell is not null.
 | 
				
			||||||
						Stack := Stack.Pointer_Slot(Frame_Parent_Index); -- pop 
 | 
												Ada.Text_IO.Put (" . ");
 | 
				
			||||||
 | 
												Print_Atom (Operand);
 | 
				
			||||||
 | 
											end if;
 | 
				
			||||||
 | 
											Ada.Text_IO.Put (")");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
											if Stack = Nil_Pointer then
 | 
				
			||||||
 | 
												Opcode := 0; -- stack empty. arrange to exit
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												Opcode := Pointer_To_Integer(Stack.Pointer_Slot(Frame_Opcode_Index));
 | 
				
			||||||
 | 
												Operand := Stack.Pointer_Slot(Frame_Operand_Index);
 | 
				
			||||||
 | 
												Stack := Stack.Pointer_Slot(Frame_Parent_Index); -- pop 
 | 
				
			||||||
 | 
											end if;
 | 
				
			||||||
					end if;
 | 
										end if;
 | 
				
			||||||
				end if;
 | 
						
 | 
				
			||||||
 | 
									when others =>
 | 
				
			||||||
			when others =>
 | 
										exit;
 | 
				
			||||||
				exit;
 | 
					 | 
				
			||||||
			end case;
 | 
								end case;
 | 
				
			||||||
		end loop;
 | 
							end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		--Print_Object (Source);
 | 
					 | 
				
			||||||
		Ada.Text_IO.New_Line;
 | 
							Ada.Text_IO.New_Line;
 | 
				
			||||||
	end Print;
 | 
						end Print;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Insert_Frame (Interp:  in out Interpreter_Record;
 | 
						function Insert_Frame (Interp:  access Interpreter_Record;
 | 
				
			||||||
	                        Parent:  in out Object_Pointer;
 | 
						                       Parent:  in     Object_Pointer;
 | 
				
			||||||
	                        Opcode:  in     Opcode_Type; 
 | 
						                       Opcode:  in     Opcode_Type; 
 | 
				
			||||||
	                        Operand: in     Object_Pointer;
 | 
						                       Operand: in     Object_Pointer;
 | 
				
			||||||
	                        Envir:   in     Object_Pointer;
 | 
						                       Envir:   in     Object_Pointer;
 | 
				
			||||||
	                        Interm:  in     Object_Pointer) is
 | 
						                       Interm:  in     Object_Pointer) return Object_Pointer is
 | 
				
			||||||
		pragma Inline (Insert_Frame);
 | 
							pragma Inline (Insert_Frame);
 | 
				
			||||||
		pragma Assert (Parent = Nil_Pointer or else Is_Frame(Parent));
 | 
							pragma Assert (Parent = Nil_Pointer or else Is_Frame(Parent));
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		Parent := Make_Frame(Interp.Self, Parent, Opcode_To_Pointer(Opcode), Operand, Envir, Interm);
 | 
							return Make_Frame(Interp, Parent, Opcode_To_Pointer(Opcode), Operand, Envir, Interm);
 | 
				
			||||||
	end Insert_Frame;
 | 
						end Insert_Frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Push_Frame (Interp:  in out Interpreter_Record;
 | 
						procedure Push_Frame (Interp:  in out Interpreter_Record;
 | 
				
			||||||
@ -2108,9 +2138,7 @@ end if;
 | 
				
			|||||||
	                      Operand: in     Object_Pointer) is
 | 
						                      Operand: in     Object_Pointer) is
 | 
				
			||||||
		pragma Inline (Push_Frame);
 | 
							pragma Inline (Push_Frame);
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		--Interp.Stack := Make_Frame(Interp.Self, Interp.Stack, Opcode_To_Pointer(Opcode),
 | 
							Interp.Stack :=Insert_Frame(Interp.Self, Interp.Stack, Opcode, Operand, Get_Frame_Environment(Interp.Stack), Nil_Pointer);
 | 
				
			||||||
		--                           Operand, Get_Frame_Environment(Interp.Stack));
 | 
					 | 
				
			||||||
		Insert_Frame (Interp, Interp.Stack, Opcode, Operand, Get_Frame_Environment(Interp.Stack), Nil_Pointer);
 | 
					 | 
				
			||||||
	end Push_Frame;
 | 
						end Push_Frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Push_Frame_With_Environment (Interp:  in out Interpreter_Record;
 | 
						procedure Push_Frame_With_Environment (Interp:  in out Interpreter_Record;
 | 
				
			||||||
@ -2119,19 +2147,26 @@ end if;
 | 
				
			|||||||
	                                       Envir:   in     Object_Pointer) is
 | 
						                                       Envir:   in     Object_Pointer) is
 | 
				
			||||||
		pragma Inline (Push_Frame_With_Environment);
 | 
							pragma Inline (Push_Frame_With_Environment);
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		--Interp.Stack := Make_Frame(Interp.Self, Interp.Stack, Opcode_To_Pointer(Opcode),
 | 
							Interp.Stack := Insert_Frame(Interp.Self, Interp.Stack, Opcode, Operand, Envir, Nil_Pointer);
 | 
				
			||||||
		--                           Operand, Envir);
 | 
					 | 
				
			||||||
		Insert_Frame (Interp, Interp.Stack, Opcode, Operand, Envir, Nil_Pointer);
 | 
					 | 
				
			||||||
	end Push_Frame_With_Environment;
 | 
						end Push_Frame_With_Environment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procedure Push_Frame_With_Intermediate (Interp:  in out Interpreter_Record;
 | 
				
			||||||
 | 
						                                        Opcode:  in     Opcode_Type; 
 | 
				
			||||||
 | 
						                                        Operand: in     Object_Pointer;
 | 
				
			||||||
 | 
						                                        Interm:  in     Object_Pointer) is
 | 
				
			||||||
 | 
							pragma Inline (Push_Frame_With_Intermediate);
 | 
				
			||||||
 | 
						begin
 | 
				
			||||||
 | 
							-- Place a new frame below the existing top frame.
 | 
				
			||||||
 | 
							Interp.Stack := Insert_Frame (Interp.Self, Interp.Stack, Opcode, Operand, Get_Frame_Environment(Interp.Stack), Interm);
 | 
				
			||||||
 | 
						end Push_Frame_With_Intermediate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Push_Subframe (Interp:  in out Interpreter_Record;
 | 
						procedure Push_Subframe (Interp:  in out Interpreter_Record;
 | 
				
			||||||
	                         Opcode:  in     Opcode_Type; 
 | 
						                         Opcode:  in     Opcode_Type; 
 | 
				
			||||||
	                         Operand: in     Object_Pointer) is
 | 
						                         Operand: in     Object_Pointer) is
 | 
				
			||||||
		pragma Inline (Push_Subframe);
 | 
							pragma Inline (Push_Subframe);
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		-- Place a new frame below the existing top frame.
 | 
							-- Place a new frame below the existing top frame.
 | 
				
			||||||
		Insert_Frame (Interp, Interp.Stack.Pointer_Slot(Frame_Parent_Index),
 | 
							Set_Frame_Parent (Interp.Stack, Insert_Frame(Interp.Self, Get_Frame_Parent(Interp.Stack), Opcode, Operand, Get_Frame_Environment(Interp.Stack), Nil_Pointer));
 | 
				
			||||||
		              Opcode, Operand, Get_Frame_Environment(Interp.Stack), Nil_Pointer);
 | 
					 | 
				
			||||||
	end Push_Subframe;
 | 
						end Push_Subframe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Push_Subframe_With_Environment (Interp:  in out Interpreter_Record;
 | 
						procedure Push_Subframe_With_Environment (Interp:  in out Interpreter_Record;
 | 
				
			||||||
@ -2141,8 +2176,7 @@ end if;
 | 
				
			|||||||
		pragma Inline (Push_Subframe_With_Environment);
 | 
							pragma Inline (Push_Subframe_With_Environment);
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		-- Place a new frame below the existing top frame.
 | 
							-- Place a new frame below the existing top frame.
 | 
				
			||||||
		Insert_Frame (Interp, Interp.Stack.Pointer_Slot(Frame_Parent_Index),
 | 
							Set_Frame_Parent (Interp.Stack, Insert_Frame(Interp.Self, Get_Frame_Parent(Interp.Stack), Opcode, Operand, Envir, Nil_Pointer));
 | 
				
			||||||
		              Opcode, Operand, Envir, Nil_Pointer);
 | 
					 | 
				
			||||||
	end Push_Subframe_With_Environment;
 | 
						end Push_Subframe_With_Environment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Push_Subframe_With_Intermediate (Interp:  in out Interpreter_Record;
 | 
						procedure Push_Subframe_With_Intermediate (Interp:  in out Interpreter_Record;
 | 
				
			||||||
@ -2152,8 +2186,7 @@ end if;
 | 
				
			|||||||
		pragma Inline (Push_Subframe_With_Intermediate);
 | 
							pragma Inline (Push_Subframe_With_Intermediate);
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		-- Place a new frame below the existing top frame.
 | 
							-- Place a new frame below the existing top frame.
 | 
				
			||||||
		Insert_Frame (Interp, Interp.Stack.Pointer_Slot(Frame_Parent_Index),
 | 
							Set_Frame_Parent (Interp.Stack, Insert_Frame(Interp.Self, Get_Frame_Parent(Interp.Stack), Opcode, Operand, Get_Frame_Environment(Interp.Stack), Interm));
 | 
				
			||||||
		              Opcode, Operand, Get_Frame_Environment(Interp.Stack), Interm);
 | 
					 | 
				
			||||||
	end Push_Subframe_With_Intermediate;
 | 
						end Push_Subframe_With_Intermediate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Pop_Frame (Interp: in out Interpreter_Record) is
 | 
						procedure Pop_Frame (Interp: in out Interpreter_Record) is
 | 
				
			||||||
@ -2164,6 +2197,16 @@ end if;
 | 
				
			|||||||
		Interp.Stack := Interp.Stack.Pointer_Slot(Frame_Parent_Index); -- pop 
 | 
							Interp.Stack := Interp.Stack.Pointer_Slot(Frame_Parent_Index); -- pop 
 | 
				
			||||||
	end Pop_Frame;
 | 
						end Pop_Frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procedure Return_Frame (Interp: in out Interpreter_Record;
 | 
				
			||||||
 | 
						                        Value:  in     Object_Pointer) is
 | 
				
			||||||
 | 
							pragma Inline (Return_Frame);
 | 
				
			||||||
 | 
						begin
 | 
				
			||||||
 | 
							-- Remove the current frame and return a value 
 | 
				
			||||||
 | 
							-- to a new active(top) frame.
 | 
				
			||||||
 | 
							Pop_Frame (Interp);
 | 
				
			||||||
 | 
							Set_Frame_Result (Interp.Stack, Value);
 | 
				
			||||||
 | 
						end Return_Frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Execute (Interp: in out Interpreter_Record) is separate;
 | 
						procedure Execute (Interp: in out Interpreter_Record) is separate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	procedure Evaluate (Interp: in out Interpreter_Record;
 | 
						procedure Evaluate (Interp: in out Interpreter_Record;
 | 
				
			||||||
@ -2193,10 +2236,11 @@ end if;
 | 
				
			|||||||
	procedure Run_Loop (Interp: in out Interpreter_Record;
 | 
						procedure Run_Loop (Interp: in out Interpreter_Record;
 | 
				
			||||||
	                    Result: out    Object_Pointer) is
 | 
						                    Result: out    Object_Pointer) is
 | 
				
			||||||
		-- standard read-eval-print loop
 | 
							-- standard read-eval-print loop
 | 
				
			||||||
 | 
							Aliased_Result: aliased Object_Pointer;
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
		pragma Assert (Interp.Base_Input.Stream /= null);
 | 
							pragma Assert (Interp.Base_Input.Stream /= null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--DEBUG_GC := Standard.True;
 | 
					DEBUG_GC := Standard.True;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Result := Nil_Pointer;
 | 
							Result := Nil_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2206,6 +2250,7 @@ end if;
 | 
				
			|||||||
		Interp.Stack := Interp.Root_Frame;
 | 
							Interp.Stack := Interp.Root_Frame;
 | 
				
			||||||
		Clear_Frame_Result (Interp.Stack);
 | 
							Clear_Frame_Result (Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Push_Top (Interp, Aliased_Result'Unchecked_Access);
 | 
				
			||||||
		loop
 | 
							loop
 | 
				
			||||||
			pragma Assert (Interp.Stack = Interp.Root_Frame);
 | 
								pragma Assert (Interp.Stack = Interp.Root_Frame);
 | 
				
			||||||
			pragma Assert (Get_Frame_Result(Interp.Stack) = Nil_Pointer);
 | 
								pragma Assert (Get_Frame_Result(Interp.Stack) = Nil_Pointer);
 | 
				
			||||||
@ -2218,19 +2263,27 @@ end if;
 | 
				
			|||||||
			pragma Assert (Interp.Stack = Interp.Root_Frame);
 | 
								pragma Assert (Interp.Stack = Interp.Root_Frame);
 | 
				
			||||||
			pragma Assert (Get_Frame_Opcode(Interp.Stack) = Opcode_Exit);
 | 
								pragma Assert (Get_Frame_Opcode(Interp.Stack) = Opcode_Exit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			-- TODO: this result must be kept at some where that GC dowsn't sweep.
 | 
								Aliased_Result := Get_Frame_Result(Interp.Stack); 
 | 
				
			||||||
			Result := Get_Frame_Result(Interp.Stack); 
 | 
					 | 
				
			||||||
			Clear_Frame_Result (Interp.Stack);
 | 
								Clear_Frame_Result (Interp.Stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Ada.Text_IO.Put ("RESULT>>>>>");
 | 
					Ada.Text_IO.Put ("RESULT: ");
 | 
				
			||||||
Print (Interp, Result);
 | 
					Print (Interp, Aliased_Result);
 | 
				
			||||||
Ada.Text_IO.Put_Line (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LOOP ITERATION XXXXXX CHECKPOINT"); 
 | 
					Ada.Text_IO.Put_Line (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LOOP ITERATION XXXXXX CHECKPOINT"); 
 | 
				
			||||||
		end loop;
 | 
							end loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							-- Jump into the exception handler not to repeat the same code here.
 | 
				
			||||||
 | 
							-- In fact, this part must not be reached since the loop above can't
 | 
				
			||||||
 | 
							-- be broken.
 | 
				
			||||||
 | 
							raise Stream_End_Error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	exception
 | 
						exception
 | 
				
			||||||
		when Stream_End_Error =>
 | 
							when Stream_End_Error =>
 | 
				
			||||||
			-- this is not a real error. this indicates the end of input stream.
 | 
								-- this is not a real error. this indicates the end of input stream.
 | 
				
			||||||
			Ada.Text_IO.Put_LINE ("=== BYE ===");
 | 
								Ada.Text_IO.Put_LINE ("=== BYE ===");
 | 
				
			||||||
 | 
								Pop_Tops (Interp, 1);
 | 
				
			||||||
 | 
								if Aliased_Result /= null then
 | 
				
			||||||
 | 
									Result := Aliased_Result;
 | 
				
			||||||
 | 
								end if;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		when X: others =>
 | 
							when X: others =>
 | 
				
			||||||
			Ada.TEXT_IO.PUT_LINE ("ERROR ERROR ERROR -> " & Ada.Exceptions.Exception_Name(X));
 | 
								Ada.TEXT_IO.PUT_LINE ("ERROR ERROR ERROR -> " & Ada.Exceptions.Exception_Name(X));
 | 
				
			||||||
 | 
				
			|||||||
@ -431,6 +431,15 @@ package H2.Scheme is
 | 
				
			|||||||
	procedure Run_Loop (Interp: in out Interpreter_Record;
 | 
						procedure Run_Loop (Interp: in out Interpreter_Record;
 | 
				
			||||||
	                    Result: out    Object_Pointer);
 | 
						                    Result: out    Object_Pointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procedure Collect_Garbage (Interp: in out Interpreter_Record);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function Make_String (Interp: access  Interpreter_Record;
 | 
				
			||||||
 | 
					                           Source: in      Object_Character_Array) return Object_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function Make_Symbol (Interp: access  Interpreter_Record;
 | 
				
			||||||
 | 
					                           Source: in      Object_Character_Array) return Object_Pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- -----------------------------------------------------------------------------
 | 
						-- -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -534,6 +543,7 @@ private
 | 
				
			|||||||
		procedure Append_Character (Interp: in out Interpreter_Record;
 | 
							procedure Append_Character (Interp: in out Interpreter_Record;
 | 
				
			||||||
		                            Value:  in     Object_Character);
 | 
							                            Value:  in     Object_Character);
 | 
				
			||||||
		pragma Inline (Append_Character);
 | 
							pragma Inline (Append_Character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	end Token;
 | 
						end Token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user