fixed Set_Environment
This commit is contained in:
		@ -1164,16 +1164,72 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
			
		||||
		return null; -- not found. 
 | 
			
		||||
	end Find_In_Environment_List;
 | 
			
		||||
 | 
			
		||||
	function Get_Environment (Interp: access Interpreter_Record;
 | 
			
		||||
	                          Key:    in     Object_Pointer) return Object_Pointer is
 | 
			
		||||
		Envir: Object_Pointer;
 | 
			
		||||
		Arr: Object_Pointer;
 | 
			
		||||
	begin
 | 
			
		||||
		pragma Assert (Is_Symbol(Key));
 | 
			
		||||
 | 
			
		||||
		Envir := Interp.Environment;	
 | 
			
		||||
		while Envir /= Nil_Pointer loop
 | 
			
		||||
			pragma Assert (Is_Cons(Envir));
 | 
			
		||||
 | 
			
		||||
			Arr := Find_In_Environment_List(Interp, Get_Car(Envir), Key);
 | 
			
		||||
			if Arr /= null then
 | 
			
		||||
				return Arr.Pointer_Slot(2);
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Move on to the parent environment
 | 
			
		||||
			Envir := Get_Cdr(Envir);
 | 
			
		||||
		end loop;
 | 
			
		||||
		return null; -- not found
 | 
			
		||||
	end Get_Environment;
 | 
			
		||||
 | 
			
		||||
	function Set_Environment (Interp: access Interpreter_Record;
 | 
			
		||||
	                          Key:    in     Object_Pointer;
 | 
			
		||||
	                          Value:  in     Object_Pointer) return Object_Pointer is
 | 
			
		||||
		Envir: Object_Pointer;
 | 
			
		||||
		Arr: Object_Pointer;
 | 
			
		||||
	begin
 | 
			
		||||
		-- Search the whole environment chain unlike Put_Environment().
 | 
			
		||||
		-- It is mainly for set!.
 | 
			
		||||
		pragma Assert (Is_Symbol(Key));
 | 
			
		||||
 | 
			
		||||
		Envir := Interp.Environment;	
 | 
			
		||||
		while Envir /= Nil_Pointer loop
 | 
			
		||||
			pragma Assert (Is_Cons(Envir));
 | 
			
		||||
 | 
			
		||||
			Arr := Find_In_Environment_List(Interp, Get_Car(Envir), Key);
 | 
			
		||||
			if Arr /= null then
 | 
			
		||||
				-- Overwrite an existing pair
 | 
			
		||||
				Arr.Pointer_Slot(2) := Value;
 | 
			
		||||
				return Value;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Move on to the parent environment
 | 
			
		||||
			Envir := Get_Cdr(Envir);
 | 
			
		||||
		end loop;
 | 
			
		||||
		return null; -- not found. not set
 | 
			
		||||
	end Set_Environment;
 | 
			
		||||
 | 
			
		||||
	procedure Put_Environment (Interp: in out Interpreter_Record;
 | 
			
		||||
	                           Key:    in     Object_Pointer;
 | 
			
		||||
	                           Value:  in     Object_Pointer) is
 | 
			
		||||
		Arr: Object_Pointer;
 | 
			
		||||
	begin
 | 
			
		||||
		-- Search the current environment only. It doesn't search the 
 | 
			
		||||
		-- environment. If no key is found, add a new pair
 | 
			
		||||
		-- This is mainly for define.
 | 
			
		||||
		pragma Assert (Is_Symbol(Key));
 | 
			
		||||
 | 
			
		||||
		Arr := Find_In_Environment_List(Interp.Self, Get_Car(Interp.Environment), Key);
 | 
			
		||||
		if Arr = null then
 | 
			
		||||
			-- Add a new key/value pair
 | 
			
		||||
		if Arr /= null then
 | 
			
		||||
			-- Found. Update the existing one
 | 
			
		||||
			Arr.Pointer_Slot(2) := Value;
 | 
			
		||||
		else
 | 
			
		||||
			-- Add a new key/value pair in the current environment
 | 
			
		||||
			-- if no existing pair has been found.
 | 
			
		||||
			declare 
 | 
			
		||||
				Aliased_Key: aliased Object_Pointer := Key;
 | 
			
		||||
				Aliased_Value: aliased Object_Pointer := Value;
 | 
			
		||||
@ -1191,48 +1247,9 @@ Ada.Text_IO.Put_Line ("Make_String...");
 | 
			
		||||
	
 | 
			
		||||
				Pop_Tops (Interp, 2);
 | 
			
		||||
			end;
 | 
			
		||||
		else
 | 
			
		||||
			-- overwrite an existing pair
 | 
			
		||||
			Arr.Pointer_Slot(2) := Value;
 | 
			
		||||
		end if;
 | 
			
		||||
	end Put_Environment;
 | 
			
		||||
 | 
			
		||||
	function Set_Environment (Interp: access Interpreter_Record;
 | 
			
		||||
	                          Key:    in     Object_Pointer;
 | 
			
		||||
	                          Value:  in     Object_Pointer) return Object_Pointer is
 | 
			
		||||
		Arr: Object_Pointer;
 | 
			
		||||
	begin
 | 
			
		||||
		pragma Assert (Is_Symbol(Key));
 | 
			
		||||
 | 
			
		||||
		Arr := Find_In_Environment_List(Interp, Get_Car(Interp.Environment), Key);
 | 
			
		||||
		if Arr = null then
 | 
			
		||||
			return null;
 | 
			
		||||
		else
 | 
			
		||||
			-- overwrite an existing pair
 | 
			
		||||
			Arr.Pointer_Slot(2) := Value;
 | 
			
		||||
			return Value;
 | 
			
		||||
		end if;
 | 
			
		||||
	end Set_Environment;
 | 
			
		||||
 | 
			
		||||
	function Get_Environment (Interp: access Interpreter_Record;
 | 
			
		||||
	                          Key:    in     Object_Pointer) return Object_Pointer is
 | 
			
		||||
		Envir: Object_Pointer;
 | 
			
		||||
		Arr: Object_Pointer;
 | 
			
		||||
	begin
 | 
			
		||||
		Envir := Interp.Environment;	
 | 
			
		||||
		while Envir /= Nil_Pointer loop
 | 
			
		||||
			pragma Assert (Is_Cons(Envir));
 | 
			
		||||
			Arr := Find_In_Environment_List(Interp, Get_Car(Envir), Key);
 | 
			
		||||
			if Arr /= null then
 | 
			
		||||
				return Arr.Pointer_Slot(2);
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Move on to the parent environment
 | 
			
		||||
			Envir := Get_Cdr(Envir);
 | 
			
		||||
		end loop;
 | 
			
		||||
		return null; -- not found
 | 
			
		||||
	end Get_Environment;
 | 
			
		||||
 | 
			
		||||
	procedure Push_Environment (Interp: in out Interpreter_Record) is
 | 
			
		||||
		pragma Inline (Push_Environment);
 | 
			
		||||
		pragma Assert (Is_Cons(Interp.Environment));
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user