finished initial implementation of 'do'
This commit is contained in:
		| @ -206,7 +206,8 @@ procedure Execute (Interp: in out Interpreter_Record) is | ||||
| 	begin | ||||
| 		X := Get_Frame_Operand(Interp.Stack); | ||||
| 		if Is_True_Class(Get_Frame_Result(Interp.Stack)) then | ||||
| 			-- <test> is true | ||||
| 			-- <test> is true. arrange to break out of 'do'. | ||||
| 			 | ||||
| 			X := Get_Cdr(Get_Car(Get_Cdr(X))); | ||||
| 			if X = Nil_Pointer then | ||||
| 				-- no expression after <test> | ||||
| @ -216,29 +217,73 @@ procedure Execute (Interp: in out Interpreter_Record) is | ||||
| 				Reload_Frame (Interp, Opcode_Grouped_Call, X); | ||||
| 			end if; | ||||
| 		else | ||||
| 			-- <test> is false | ||||
| 			-- <test> is false.  | ||||
| 			Push_Top (Interp, X'Unchecked_Access); | ||||
| 			Reload_Frame (Interp, Opcode_Do_Step, X); | ||||
| 			X := Get_Cdr(Get_Cdr(X)); | ||||
| 			if X /= Nil_Pointer then | ||||
| 				Push_Frame (Interp, Opcode_Grouped_Call, X); | ||||
| 			end if; | ||||
|  | ||||
| 			Pop_Tops (Interp, 1); | ||||
| 		end if; | ||||
| 	end Do_Do_Break; | ||||
| 	 | ||||
| 	procedure Do_Do_Step is | ||||
| 		X: aliased Object_Pointer; | ||||
| 		Y: aliased Object_Pointer; | ||||
| 	begin | ||||
| 		-- arrange to evaluate <step> and update binding <variable>. | ||||
| 		print (interp, Get_Car(Get_Frame_Operand(Interp.Stack))); | ||||
| 		Pop_Frame (Interp); | ||||
| 		Push_Top (Interp, X'Unchecked_Access); | ||||
| 		X := Get_Frame_Operand(Interp.Stack); | ||||
|  | ||||
| 		Reload_Frame (Interp, Opcode_Do_Test, X); | ||||
|  | ||||
| 		X := Get_Car(X); | ||||
| 		while Is_Cons(X) loop | ||||
| 			Y := Get_Cdr(Get_Cdr(Get_Car(X))); | ||||
| 			if Is_Cons(Y) then | ||||
| 				Push_Top (Interp, Y'Unchecked_Access); | ||||
| 				Push_Frame (Interp, Opcode_Do_Update, X); | ||||
| 				Push_Frame (Interp, Opcode_Evaluate_Object, Get_Car(Y)); -- first <step> | ||||
| 				Pop_Tops (Interp, 1); | ||||
| 				exit; | ||||
| 			else | ||||
| 				-- no <step> | ||||
| 				X := Get_Cdr(X); | ||||
| 			end if; | ||||
| 		end loop; | ||||
| 		 | ||||
| 		Pop_Tops (Interp, 1); | ||||
| 	end Do_Do_Step; | ||||
|  | ||||
| 	procedure Do_Do_Update is | ||||
| 		X: aliased Object_Pointer; | ||||
| 		Y: aliased Object_Pointer; | ||||
| 	begin | ||||
| 		Push_Top (Interp, X'Unchecked_Access); | ||||
| 		X := Get_Frame_Operand(Interp.StacK); | ||||
| 		Set_Parent_Environment (Interp, Get_Car(Get_Car(X)), Get_Frame_Result(Interp.Stack)); | ||||
| 		 | ||||
| 		loop | ||||
| 			X := Get_Cdr(X); | ||||
| 			if Is_Cons(X) then | ||||
| 				Y := Get_Cdr(Get_Cdr(Get_Car(X))); | ||||
| 				if Is_Cons(Y) then | ||||
| 					-- if <step> is specified | ||||
| 					Push_Top (Interp, Y'Unchecked_Access); | ||||
| 					Reload_Frame (Interp, Opcode_Do_Update, X); | ||||
| 					Push_Frame (Interp, Opcode_Evaluate_Object, Get_Car(Y)); -- <step> | ||||
| 					Pop_Tops (Interp, 1); | ||||
| 					exit; | ||||
| 				end if; | ||||
| 			else  | ||||
| 				-- no more <bindings> | ||||
| 				Pop_Frame (Interp); | ||||
| 		null; | ||||
| 				exit; | ||||
| 			end if; | ||||
| 		end loop; | ||||
| 		 | ||||
| 		Pop_Tops (Interp, 1); | ||||
| 	end Do_Do_Update; | ||||
| 	-- ---------------------------------------------------------------- | ||||
| 	 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user