Commit 0640c7d1 by Arnaud Charlet

[multiple changes]

2016-07-07  Vadim Godunko  <godunko@adacore.com>

	* adainit.h, adainit.c (__gnat_is_read_accessible_file): New
	subprogram.
	(__gnat_is_write_accessible_file): New subprogram.
	* s-os_lib.ads, s-os_lib.adb (Is_Read_Accessible_File): New subprogram.
	(Is_Write_Accessible_File): New subprogram.

2016-07-07  Justin Squirek  <squirek@adacore.com>

	* sem_ch12.adb (Install_Body): Minor refactoring in the order
	of local functions.
	(In_Same_Scope): Change loop condition to be more expressive.

From-SVN: r238116
parent 8c519039
2016-07-07 Vadim Godunko <godunko@adacore.com>
* adainit.h, adainit.c (__gnat_is_read_accessible_file): New
subprogram.
(__gnat_is_write_accessible_file): New subprogram.
* s-os_lib.ads, s-os_lib.adb (Is_Read_Accessible_File): New subprogram.
(Is_Write_Accessible_File): New subprogram.
2016-07-07 Justin Squirek <squirek@adacore.com>
* sem_ch12.adb (Install_Body): Minor refactoring in the order
of local functions.
(In_Same_Scope): Change loop condition to be more expressive.
2016-07-07 Gary Dismukes <dismukes@adacore.com> 2016-07-07 Gary Dismukes <dismukes@adacore.com>
* sem_ch3.adb, sem_prag.adb, sem_prag.ads, prj-ext.adb, freeze.adb, * sem_ch3.adb, sem_prag.adb, sem_prag.ads, prj-ext.adb, freeze.adb,
......
...@@ -1912,6 +1912,20 @@ __gnat_is_readable_file_attr (char* name, struct file_attributes* attr) ...@@ -1912,6 +1912,20 @@ __gnat_is_readable_file_attr (char* name, struct file_attributes* attr)
} }
int int
__gnat_is_read_accessible_file (char *name)
{
#if defined (_WIN32)
TCHAR wname [GNAT_MAX_PATH_LEN + 2];
S2WSC (wname, name, GNAT_MAX_PATH_LEN + 2);
return !_access (wname, 4);
#else
return !access (name, R_OK);
#endif
}
int
__gnat_is_readable_file (char *name) __gnat_is_readable_file (char *name)
{ {
struct file_attributes attr; struct file_attributes attr;
...@@ -1962,6 +1976,20 @@ __gnat_is_writable_file (char *name) ...@@ -1962,6 +1976,20 @@ __gnat_is_writable_file (char *name)
} }
int int
__gnat_is_write_accessible_file (char *name)
{
#if defined (_WIN32)
TCHAR wname [GNAT_MAX_PATH_LEN + 2];
S2WSC (wname, name, GNAT_MAX_PATH_LEN + 2);
return !_access (wname, 2);
#else
return !access (name, W_OK);
#endif
}
int
__gnat_is_executable_file_attr (char* name, struct file_attributes* attr) __gnat_is_executable_file_attr (char* name, struct file_attributes* attr)
{ {
if (attr->executable == ATTR_UNSET) if (attr->executable == ATTR_UNSET)
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* * * *
* C Header File * * C Header File *
* * * *
* Copyright (C) 1992-2015, Free Software Foundation, Inc. * * Copyright (C) 1992-2016, Free Software Foundation, Inc. *
* * * *
* GNAT is free software; you can redistribute it and/or modify it under * * GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- * * terms of the GNU General Public License as published by the Free Soft- *
...@@ -207,6 +207,8 @@ extern int __gnat_is_directory (char *); ...@@ -207,6 +207,8 @@ extern int __gnat_is_directory (char *);
extern int __gnat_is_writable_file (char *); extern int __gnat_is_writable_file (char *);
extern int __gnat_is_readable_file (char *name); extern int __gnat_is_readable_file (char *name);
extern int __gnat_is_executable_file (char *name); extern int __gnat_is_executable_file (char *name);
extern int __gnat_is_write_accessible_file (char *name);
extern int __gnat_is_read_accessible_file (char *name);
extern void __gnat_reset_attributes (struct file_attributes *); extern void __gnat_reset_attributes (struct file_attributes *);
extern int __gnat_error_attributes (struct file_attributes *); extern int __gnat_error_attributes (struct file_attributes *);
......
...@@ -1495,6 +1495,21 @@ package body System.OS_Lib is ...@@ -1495,6 +1495,21 @@ package body System.OS_Lib is
return Is_Directory (F_Name'Address); return Is_Directory (F_Name'Address);
end Is_Directory; end Is_Directory;
-----------------------------
-- Is_Read_Accessible_File --
-----------------------------
function Is_Read_Accessible_File (Name : String) return Boolean is
function Is_Read_Accessible_File (Name : Address) return Integer;
pragma Import
(C, Is_Read_Accessible_File, "__gnat_is_read_accessible_file");
F_Name : String (1 .. Name'Length + 1);
begin
F_Name (1 .. Name'Length) := Name;
F_Name (F_Name'Last) := ASCII.NUL;
return Is_Read_Accessible_File (F_Name'Address) /= 0;
end Is_Read_Accessible_File;
---------------------- ----------------------
-- Is_Readable_File -- -- Is_Readable_File --
---------------------- ----------------------
...@@ -1571,6 +1586,21 @@ package body System.OS_Lib is ...@@ -1571,6 +1586,21 @@ package body System.OS_Lib is
return Is_Symbolic_Link (F_Name'Address); return Is_Symbolic_Link (F_Name'Address);
end Is_Symbolic_Link; end Is_Symbolic_Link;
------------------------------
-- Is_Write_Accessible_File --
------------------------------
function Is_Write_Accessible_File (Name : String) return Boolean is
function Is_Write_Accessible_File (Name : Address) return Integer;
pragma Import
(C, Is_Write_Accessible_File, "__gnat_is_write_accessible_file");
F_Name : String (1 .. Name'Length + 1);
begin
F_Name (1 .. Name'Length) := Name;
F_Name (F_Name'Last) := ASCII.NUL;
return Is_Write_Accessible_File (F_Name'Address) /= 0;
end Is_Write_Accessible_File;
---------------------- ----------------------
-- Is_Writable_File -- -- Is_Writable_File --
---------------------- ----------------------
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1995-2015, Free Software Foundation, Inc. -- -- Copyright (C) 1995-2016, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -457,6 +457,14 @@ package System.OS_Lib is ...@@ -457,6 +457,14 @@ package System.OS_Lib is
-- not actually be writable due to some other process having exclusive -- not actually be writable due to some other process having exclusive
-- access. -- access.
function Is_Read_Accessible_File (Name : String) return Boolean;
-- Determines if the given string, Name, is the name of an existing file
-- that is readable. Returns True if so, False otherwise.
function Is_Write_Accessible_File (Name : String) return Boolean;
-- Determines if the given string, Name, is the name of an existing file
-- that is writable. Returns True if so, False otherwise.
function Locate_Exec_On_Path (Exec_Name : String) return String_Access; function Locate_Exec_On_Path (Exec_Name : String) return String_Access;
-- Try to locate an executable whose name is given by Exec_Name in the -- Try to locate an executable whose name is given by Exec_Name in the
-- directories listed in the environment Path. If the Exec_Name does not -- directories listed in the environment Path. If the Exec_Name does not
......
...@@ -713,7 +713,10 @@ package body Sem_Ch12 is ...@@ -713,7 +713,10 @@ package body Sem_Ch12 is
-- body. Early instantiations can also appear if generic, instance and -- body. Early instantiations can also appear if generic, instance and
-- body are all in the declarative part of a subprogram or entry. Entities -- body are all in the declarative part of a subprogram or entry. Entities
-- of packages that are early instantiations are delayed, and their freeze -- of packages that are early instantiations are delayed, and their freeze
-- node appears after the generic body. -- node appears after the generic body. This rather complex machinery is
-- needed when nested instantiations are present, because the source does
-- not carry any indication of where the corresponding instance bodies must
-- be installed and frozen.
procedure Install_Formal_Packages (Par : Entity_Id); procedure Install_Formal_Packages (Par : Entity_Id);
-- Install the visible part of any formal of the parent that is a formal -- Install the visible part of any formal of the parent that is a formal
...@@ -8927,23 +8930,13 @@ package body Sem_Ch12 is ...@@ -8927,23 +8930,13 @@ package body Sem_Ch12 is
Gen_Body : Node_Id; Gen_Body : Node_Id;
Gen_Decl : Node_Id) Gen_Decl : Node_Id)
is is
Act_Id : constant Entity_Id := Corresponding_Spec (Act_Body);
Act_Unit : constant Node_Id := Unit (Cunit (Get_Source_Unit (N)));
Gen_Id : constant Entity_Id := Corresponding_Spec (Gen_Body);
Par : constant Entity_Id := Scope (Gen_Id);
Gen_Unit : constant Node_Id :=
Unit (Cunit (Get_Source_Unit (Gen_Decl)));
Orig_Body : Node_Id := Gen_Body;
F_Node : Node_Id;
Body_Unit : Node_Id;
Must_Delay : Boolean;
function In_Same_Scope (Generic_Id, Actual_Id : Node_Id) return Boolean; function In_Same_Scope (Gen_Id, Act_Id : Node_Id) return Boolean;
-- Check if the generic definition's scope tree and the instantiation's -- Check if the generic definition and the instantiation come from
-- scope tree share a dependency. -- a common scope, in which case the instance must be frozen after
-- the generic body.
function True_Sloc (N : Node_Id) return Source_Ptr; function True_Sloc (N, Act_Unit : Node_Id) return Source_Ptr;
-- If the instance is nested inside a generic unit, the Sloc of the -- If the instance is nested inside a generic unit, the Sloc of the
-- instance indicates the place of the original definition, not the -- instance indicates the place of the original definition, not the
-- point of the current enclosing instance. Pending a better usage of -- point of the current enclosing instance. Pending a better usage of
...@@ -8955,20 +8948,22 @@ package body Sem_Ch12 is ...@@ -8955,20 +8948,22 @@ package body Sem_Ch12 is
-- In_Same_Scope -- -- In_Same_Scope --
------------------- -------------------
function In_Same_Scope (Generic_Id, Actual_Id : Node_Id) return Boolean function In_Same_Scope (Gen_Id, Act_Id : Node_Id) return Boolean is
is Act_Scop : Entity_Id := Scope (Act_Id);
Act_Scop : Entity_Id := Scope (Actual_Id); Gen_Scop : Entity_Id := Scope (Gen_Id);
Gen_Scop : Entity_Id := Scope (Generic_Id);
begin begin
while Scope_Depth_Value (Act_Scop) > 0 while Act_Scop /= Standard_Standard
and then Scope_Depth_Value (Gen_Scop) > 0 and then Gen_Scop /= Standard_Standard
loop loop
if Act_Scop = Gen_Scop then if Act_Scop = Gen_Scop then
return True; return True;
end if; end if;
Act_Scop := Scope (Act_Scop); Act_Scop := Scope (Act_Scop);
Gen_Scop := Scope (Gen_Scop); Gen_Scop := Scope (Gen_Scop);
end loop; end loop;
return False; return False;
end In_Same_Scope; end In_Same_Scope;
...@@ -8976,7 +8971,7 @@ package body Sem_Ch12 is ...@@ -8976,7 +8971,7 @@ package body Sem_Ch12 is
-- True_Sloc -- -- True_Sloc --
--------------- ---------------
function True_Sloc (N : Node_Id) return Source_Ptr is function True_Sloc (N, Act_Unit : Node_Id) return Source_Ptr is
Res : Source_Ptr; Res : Source_Ptr;
N1 : Node_Id; N1 : Node_Id;
...@@ -8994,6 +8989,18 @@ package body Sem_Ch12 is ...@@ -8994,6 +8989,18 @@ package body Sem_Ch12 is
return Res; return Res;
end True_Sloc; end True_Sloc;
Act_Id : constant Entity_Id := Corresponding_Spec (Act_Body);
Act_Unit : constant Node_Id := Unit (Cunit (Get_Source_Unit (N)));
Gen_Id : constant Entity_Id := Corresponding_Spec (Gen_Body);
Par : constant Entity_Id := Scope (Gen_Id);
Gen_Unit : constant Node_Id :=
Unit (Cunit (Get_Source_Unit (Gen_Decl)));
Orig_Body : Node_Id := Gen_Body;
F_Node : Node_Id;
Body_Unit : Node_Id;
Must_Delay : Boolean;
-- Start of processing for Install_Body -- Start of processing for Install_Body
begin begin
...@@ -9058,7 +9065,8 @@ package body Sem_Ch12 is ...@@ -9058,7 +9065,8 @@ package body Sem_Ch12 is
and then (Nkind_In (Gen_Unit, N_Package_Declaration, and then (Nkind_In (Gen_Unit, N_Package_Declaration,
N_Generic_Package_Declaration) N_Generic_Package_Declaration)
or else (Gen_Unit = Body_Unit or else (Gen_Unit = Body_Unit
and then True_Sloc (N) < Sloc (Orig_Body))) and then True_Sloc (N, Act_Unit)
< Sloc (Orig_Body)))
and then Is_In_Main_Unit (Original_Node (Gen_Unit)) and then Is_In_Main_Unit (Original_Node (Gen_Unit))
and then (In_Same_Scope (Gen_Id, Act_Id))); and then (In_Same_Scope (Gen_Id, Act_Id)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment