Browse Source

Support for generic namespaces.
MODULE x IN Y --> module is compiled with filename Y-X (all sections are also prefixed as Y-X) and can be imported as
IMPORT X IN Y
This works for any namespace name (identifier) now.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7388 8c9fc860-2736-0410-a75d-ab315db34111

felixf 7 years ago
parent
commit
b4617815d2

+ 4 - 1
source/Builds.Tool

@@ -2,7 +2,7 @@ WIN32G -- 32-bit windows a2 using generic object files
 =================================
 =================================
 
 
 	## Compile all files ##
 	## Compile all files ##
-		Release.Build WinAosNewObjectFile ~
+		Release.Build -b WinAosNewObjectFile ~
 	
 	
 	## Link A2.exe (bootconsole for graphical OS) ##
 	## Link A2.exe (bootconsole for graphical OS) ##
 		StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H  Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands Files WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~		
 		StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H  Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands Files WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~		
@@ -14,6 +14,9 @@ WIN32G -- 32-bit windows a2 using generic object files
 LINUX32G -- 32 bit linux a2 using generic object files
 LINUX32G -- 32 bit linux a2 using generic object files
 ================================
 ================================
 
 
+
+	Release.Build -b Linux32G ~
+	
 	## X11 bootconsole ##
 	## X11 bootconsole ##
 		StaticLinker.Link -p=Linux32G Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog  Streams Commands Pipes StdIO TrapWriters Reflection Traps Files UnixFiles Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker   GenericLoader  BootConsole ~
 		StaticLinker.Link -p=Linux32G Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog  Streams Commands Pipes StdIO TrapWriters Reflection Traps Files UnixFiles Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker   GenericLoader  BootConsole ~
 	
 	

+ 2 - 9
source/FoxCompiler.Mod

@@ -104,15 +104,8 @@ TYPE
 		VAR message,name: ARRAY 256 OF CHAR;
 		VAR message,name: ARRAY 256 OF CHAR;
 		BEGIN
 		BEGIN
 			message := "";
 			message := "";
-			IF (module # NIL) & (module.context # SyntaxTree.invalidIdentifier) THEN
-				Basic.GetString(module.context,message);
-				Strings.Append (message, ".");
-			ELSE
-				message := "";
-			END;
-			IF (module # NIL) & (module.name # SyntaxTree.invalidIdentifier) THEN
-				Basic.GetString(module.name,name);
-				Strings.Append (message, name);
+			IF module # NIL THEN
+				Global.GetModuleName(module, message); 
 			END;
 			END;
 			Strings.Append (message, msg);
 			Strings.Append (message, msg);
 			IF error THEN
 			IF error THEN

+ 33 - 30
source/FoxGlobal.Mod

@@ -188,7 +188,7 @@ CONST
 VAR
 VAR
 	(* names *)
 	(* names *)
 	SelfParameterName-,ReturnParameterName-,SystemName-,systemName-,PointerReturnName-, ResultName-,
 	SelfParameterName-,ReturnParameterName-,SystemName-,systemName-,PointerReturnName-, ResultName-,
-	A2Name-,OberonName-,ArrayBaseName-, ComplexNumbersName-, RecordBodyName-,ModuleBodyName-,
+	A2Name-,ArrayBaseName-, ComplexNumbersName-, RecordBodyName-,ModuleBodyName-,
 	NameWinAPI-,NameC-,NameMovable-,NameUntraced-,NameDelegate-,NameInterrupt-, NamePcOffset-, NameNoPAF-,NameEntry-, NameExit-, NameFixed-,NameFictive-, NameAligned-,NameStackAligned-,
 	NameWinAPI-,NameC-,NameMovable-,NameUntraced-,NameDelegate-,NameInterrupt-, NamePcOffset-, NameNoPAF-,NameEntry-, NameExit-, NameFixed-,NameFictive-, NameAligned-,NameStackAligned-,
 	NameExclusive-,NameActive-,NamePriority-,NameSafe-,NameRealtime-, NameDynamic-, NameFingerprint-, NameDataMemorySize-, NameCodeMemorySize-
 	NameExclusive-,NameActive-,NamePriority-,NameSafe-,NameRealtime-, NameDynamic-, NameFingerprint-, NameDataMemorySize-, NameCodeMemorySize-
 	, NameChannelWidth-, NameChannelDepth-, NameChannelModule-, NameVector-, NameFloatingPoint-, NameNoMul-,NameNonBlockingIO-, NameTRM-, NameTRMS-, NameEngine-, NameFinal-, NameAbstract-,
 	, NameChannelWidth-, NameChannelDepth-, NameChannelModule-, NameVector-, NameFloatingPoint-, NameNoMul-,NameNonBlockingIO-, NameTRM-, NameTRMS-, NameEngine-, NameFinal-, NameAbstract-,
@@ -1174,18 +1174,37 @@ TYPE
 		NewCustomBuiltin0(nameL, scope[Scanner.Lowercase], subType, procedureType)
 		NewCustomBuiltin0(nameL, scope[Scanner.Lowercase], subType, procedureType)
 	END NewCustomBuiltin;
 	END NewCustomBuiltin;
 
 
-	PROCEDURE ModuleFileName*(moduleName,context: SyntaxTree.Identifier; VAR fileName: ARRAY OF CHAR);
-	VAR prefix,name: Scanner.IdentifierString;
+	PROCEDURE GetModuleSectionName*(name, context: SyntaxTree.Identifier; VAR n: ARRAY OF CHAR);
+	VAR s: SyntaxTree.IdentifierString; 
 	BEGIN
 	BEGIN
-		Basic.GetString(moduleName,name);
-		IF (context = SyntaxTree.invalidIdentifier) OR (context = A2Name) THEN
-			COPY(name,fileName);
+		IF context # SyntaxTree.invalidIdentifier THEN
+			Basic.GetString(context,n);
+			IF n = "A2" THEN 
+				Basic.GetString(name,n);
+				RETURN;
+			END;
+			Basic.GetString(name,s);
+			Strings.Append(n,"-");Strings.Append(n,s);
 		ELSE
 		ELSE
-			ASSERT(context=OberonName);
-			Basic.GetString(context,prefix);
-			Basic.Concat(fileName,prefix,".",name);
+			Basic.GetString(name,n);
 		END;
 		END;
+	END GetModuleSectionName;
+
+	PROCEDURE ModuleFileName*(name, context: SyntaxTree.Identifier; VAR n: ARRAY OF CHAR);
+	BEGIN
+		GetModuleSectionName(name, context, n);
 	END ModuleFileName;
 	END ModuleFileName;
+	
+	PROCEDURE ModuleSectionIdentifier*(name, context: SyntaxTree.Identifier): SyntaxTree.Identifier;
+	VAR s,n: SyntaxTree.IdentifierString; 
+	BEGIN
+		IF context # SyntaxTree.invalidIdentifier THEN
+			GetModuleSectionName(name, context, n);
+			RETURN SyntaxTree.NewIdentifier(n);
+		ELSE
+			RETURN name
+		END;
+	END ModuleSectionIdentifier;
 
 
 	PROCEDURE ContextFromName*(CONST fileName: ARRAY OF CHAR; VAR module,context: SyntaxTree.Identifier);
 	PROCEDURE ContextFromName*(CONST fileName: ARRAY OF CHAR; VAR module,context: SyntaxTree.Identifier);
 	VAR moduleName, contextName: Scanner.IdentifierString; i,j: LONGINT;
 	VAR moduleName, contextName: Scanner.IdentifierString; i,j: LONGINT;
@@ -1214,26 +1233,14 @@ TYPE
 	PROCEDURE GetModuleName*(module: SyntaxTree.Module; VAR name: ARRAY OF CHAR);
 	PROCEDURE GetModuleName*(module: SyntaxTree.Module; VAR name: ARRAY OF CHAR);
 	VAR n: SyntaxTree.IdentifierString;
 	VAR n: SyntaxTree.IdentifierString;
 	BEGIN
 	BEGIN
-		name := "";
-		IF module.context # SyntaxTree.invalidIdentifier THEN
-			Basic.GetString(module.context,n);
-			IF n# "A2" THEN Strings.Append(name,n);Strings.Append(name,".") END;
-		END;
-		module.GetName(n);
-		Strings.Append(name,n);
+		GetModuleSectionName(module.name, module.context, name);
 	END GetModuleName;
 	END GetModuleName;
 
 
 	PROCEDURE GetModuleSegmentedName*(module: SyntaxTree.Module; VAR name: Basic.SegmentedName);
 	PROCEDURE GetModuleSegmentedName*(module: SyntaxTree.Module; VAR name: Basic.SegmentedName);
+	VAR moduleName: SyntaxTree.IdentifierString;
 	BEGIN
 	BEGIN
-		Basic.InitSegmentedName(name);
-		IF (module.context # SyntaxTree.invalidIdentifier) & (module.context # A2Name) THEN
-			name[0] := module.context;
-			name[1] := module.name;
-			name[2] := -1;
-		ELSE
-			name[0] :=module.name;
-			name[1] := -1;
-		END;
+		name[0] := ModuleSectionIdentifier(module.name, module.context);
+		name[1] := -1;
 	END GetModuleSegmentedName;
 	END GetModuleSegmentedName;
 
 
 	PROCEDURE FindSymbol*(CONST name: Basic.SegmentedName; scope: SyntaxTree.Scope): SyntaxTree.Symbol;
 	PROCEDURE FindSymbol*(CONST name: Basic.SegmentedName; scope: SyntaxTree.Scope): SyntaxTree.Symbol;
@@ -1341,10 +1348,7 @@ TYPE
 			IF scope = NIL THEN (* do nothing, locally declared temporary symbol *)
 			IF scope = NIL THEN (* do nothing, locally declared temporary symbol *)
 			ELSIF scope = inScope THEN (* do not traverse further *)
 			ELSIF scope = inScope THEN (* do not traverse further *)
 			ELSIF scope IS SyntaxTree.ModuleScope THEN
 			ELSIF scope IS SyntaxTree.ModuleScope THEN
-				IF scope(SyntaxTree.ModuleScope).ownerModule.context # A2Name THEN
-					Basic.SuffixSegmentedName(pooledName, scope(SyntaxTree.ModuleScope).ownerModule.context);
-				END;
-				Basic.SuffixSegmentedName(pooledName,scope.ownerModule.name);
+				Basic.SuffixSegmentedName(pooledName,ModuleSectionIdentifier(scope.ownerModule.name, scope.ownerModule.context));
 			ELSIF scope IS SyntaxTree.RecordScope THEN
 			ELSIF scope IS SyntaxTree.RecordScope THEN
 				Scope(scope.outerScope);
 				Scope(scope.outerScope);
 				td := scope(SyntaxTree.RecordScope).ownerRecord.typeDeclaration;
 				td := scope(SyntaxTree.RecordScope).ownerRecord.typeDeclaration;
@@ -1686,7 +1690,6 @@ TYPE
 		PointerReturnName := SyntaxTree.NewIdentifier("@PtrReturnType");
 		PointerReturnName := SyntaxTree.NewIdentifier("@PtrReturnType");
 		ResultName := SyntaxTree.NewIdentifier("RESULT");
 		ResultName := SyntaxTree.NewIdentifier("RESULT");
 		A2Name := SyntaxTree.NewIdentifier("A2");
 		A2Name := SyntaxTree.NewIdentifier("A2");
-		OberonName := SyntaxTree.NewIdentifier("Oberon");
 		ArrayBaseName := SyntaxTree.NewIdentifier("FoxArrayBase");
 		ArrayBaseName := SyntaxTree.NewIdentifier("FoxArrayBase");
 		ComplexNumbersName := SyntaxTree.NewIdentifier("ComplexNumbers");
 		ComplexNumbersName := SyntaxTree.NewIdentifier("ComplexNumbers");
 		RecordBodyName := SyntaxTree.NewIdentifier("@Body");
 		RecordBodyName := SyntaxTree.NewIdentifier("@Body");

+ 2 - 2
source/Generic.Unix.Traps.Mod

@@ -80,7 +80,7 @@ VAR
 			S.GET( tag - AddrSize, td );
 			S.GET( tag - AddrSize, td );
 			IF td.mod # NIL THEN
 			IF td.mod # NIL THEN
 				COPY( td.mod.name, name );  Append( name,  "." );  Append( name, td.name );
 				COPY( td.mod.name, name );  Append( name,  "." );  Append( name, td.name );
-				IF name = "Oberon.System.OberonRunner" THEN  UnlockOberon  END
+				IF name = "Oberon-System.OberonRunner" THEN  UnlockOberon  END
 			END
 			END
 		END;
 		END;
 		
 		
@@ -218,7 +218,7 @@ VAR
 
 
 
 
 	PROCEDURE UnlockOberon;
 	PROCEDURE UnlockOberon;
-	CONST OberonKernel = "Oberon.Kernel";
+	CONST OberonKernel = "Oberon-Kernel";
 	VAR c: PROCEDURE;
 	VAR c: PROCEDURE;
 	BEGIN
 	BEGIN
 		IF Modules.ModuleByName( OberonKernel ) # NIL THEN
 		IF Modules.ModuleByName( OberonKernel ) # NIL THEN

+ 1 - 8
source/GenericLoader.Mod

@@ -421,12 +421,6 @@ TYPE
 
 
 			StringPool.GetString(identifier.name[0], name);
 			StringPool.GetString(identifier.name[0], name);
 			isModule := identifier.name[1] = InternalModuleName;
 			isModule := identifier.name[1] = InternalModuleName;
-			IF (identifier.name[0] = OberonName) & (identifier.name[2] >= 0)  THEN (* in Oberon name space *)
-				StringPool.GetString(identifier.name[1], s);
-				Strings.Append(name, ".");
-				Strings.Append(name, s);
-				isModule := identifier.name[2] = InternalModuleName;
-			END;
 
 
 			(*
 			(*
 				IF ~isModule & (identifier.fingerprint = 0) THEN
 				IF ~isModule & (identifier.fingerprint = 0) THEN
@@ -473,7 +467,7 @@ TYPE
 VAR
 VAR
 	moduleList: ModuleList;
 	moduleList: ModuleList;
 	testTypeDescs: Modules.Bytes;
 	testTypeDescs: Modules.Bytes;
-	InternalModuleName, OberonName: StringPool.Index;
+	InternalModuleName: StringPool.Index;
 
 
 	PROCEDURE InitData(VAR data: Data);
 	PROCEDURE InitData(VAR data: Data);
 	BEGIN
 	BEGIN
@@ -617,7 +611,6 @@ VAR
 	BEGIN
 	BEGIN
 		NEW(testTypeDescs,1);
 		NEW(testTypeDescs,1);
 		Modules.InstallTermHandler(Remove);
 		Modules.InstallTermHandler(Remove);
-		StringPool.GetIndex("Oberon",OberonName);
 		StringPool.GetIndex("@Module",InternalModuleName);
 		StringPool.GetIndex("@Module",InternalModuleName);
 		NEW(moduleList);
 		NEW(moduleList);
 		Install;
 		Install;

+ 1 - 1
source/KernelLogger.Mod

@@ -99,7 +99,7 @@ VAR
 	kernelLog- : Texts.Text;
 	kernelLog- : Texts.Text;
 
 
 PROCEDURE Start*;
 PROCEDURE Start*;
-CONST OberonKernel = "Oberon.Kernel"; OberonSystem = "Oberon.System";
+CONST OberonKernel = "Oberon-Kernel"; OberonSystem = "Oberon-System";
 VAR kernelLockOberon, kernelUnlockOberon, systemStopLog : PROCEDURE;
 VAR kernelLockOberon, kernelUnlockOberon, systemStopLog : PROCEDURE;
 BEGIN {EXCLUSIVE}
 BEGIN {EXCLUSIVE}
 	IF logger # NIL THEN KernelLog.Enter; KernelLog.String("Logger already running! "); KernelLog.Exit; RETURN END;
 	IF logger # NIL THEN KernelLog.Enter; KernelLog.String("Logger already running! "); KernelLog.Exit; RETURN END;

+ 1 - 1
source/ModuleParser.Mod

@@ -1464,7 +1464,7 @@ VAR
 				IF ~FileExists(filename) THEN
 				IF ~FileExists(filename) THEN
 					filename := GenerateFilename("Unix.", context, moduleName, ".Mod");
 					filename := GenerateFilename("Unix.", context, moduleName, ".Mod");
 					IF ~FileExists(filename) THEN
 					IF ~FileExists(filename) THEN
-						filename := GenerateFilename("Oberon.", context, moduleName, ".Mod");
+						filename := GenerateFilename("Oberon-", context, moduleName, ".Mod");
 						IF ~FileExists(filename) THEN
 						IF ~FileExists(filename) THEN
 							filename := GenerateFilename("", context, moduleName, ".Mod");
 							filename := GenerateFilename("", context, moduleName, ".Mod");
 						END;
 						END;

+ 2 - 2
source/Oberon.Mod

@@ -10,7 +10,7 @@ IMPORT Modules, Commands, Strings, OberonDisplay, Displays, Plugins ;
 		IF res # Commands.Ok THEN
 		IF res # Commands.Ok THEN
 			context.error.String (msg); context.error.Ln; RETURN;
 			context.error.String (msg); context.error.Ln; RETURN;
 		END;
 		END;
-		Strings.Concat ("Oberon.", module, module);
+		Strings.Concat ("Oberon-", module, module);
 		GETPROCEDURE (module, command, procedure);
 		GETPROCEDURE (module, command, procedure);
 		IF procedure = NIL THEN
 		IF procedure = NIL THEN
 			context.error.String ("Oberon command '"); context.error.String (string);
 			context.error.String ("Oberon command '"); context.error.String (string);
@@ -29,7 +29,7 @@ IMPORT Modules, Commands, Strings, OberonDisplay, Displays, Plugins ;
 				context.error.String( "Oberon is already running, only one instance is allowed" ); context.error.Ln
 				context.error.String( "Oberon is already running, only one instance is allowed" ); context.error.Ln
 			ELSE
 			ELSE
 				OberonDisplay.Install( context );
 				OberonDisplay.Install( context );
-				GETPROCEDURE( "Oberon.System", "Init", proc );
+				GETPROCEDURE( "Oberon-System", "Init", proc );
 				IF proc = NIL  THEN  context.error.String( "Oberon command 'System.Init' not found" ); context.error.Ln  END
 				IF proc = NIL  THEN  context.error.String( "Oberon command 'System.Init' not found" ); context.error.Ln  END
 			END;
 			END;
 		END;
 		END;

BIN
source/Oberon.Modules.Mod


BIN
source/Oberon.System.Mod


+ 1 - 1
source/SystemTools.Mod

@@ -15,7 +15,7 @@ CONST
 
 
 	Trace = {};
 	Trace = {};
 
 
-	OberonKernel = "Oberon.Kernel";
+	OberonKernel = "Oberon-Kernel";
 
 
 TYPE
 TYPE
 
 

+ 1 - 1
source/Visualizer.Mod

@@ -1083,7 +1083,7 @@ TYPE
 						KernelLog.String("found!");
 						KernelLog.String("found!");
 					ELSE
 					ELSE
 						KernelLog.String("not found!, Trying Oberon."); KernelLog.String(entry.name); KernelLog.String(" ... ");
 						KernelLog.String("not found!, Trying Oberon."); KernelLog.String(entry.name); KernelLog.String(" ... ");
-						filename := "Oberon."; Strings.Append(filename, entry.name); Strings.Append(filename, ".Mod");
+						filename := "Oberon-"; Strings.Append(filename, entry.name); Strings.Append(filename, ".Mod");
 						file := Files.Old(filename);
 						file := Files.Old(filename);
 						IF (file # NIL) THEN
 						IF (file # NIL) THEN
 							KernelLog.String("found!");
 							KernelLog.String("found!");

+ 1 - 1
source/Win32.Oberon.Mod

@@ -10,7 +10,7 @@ IMPORT Modules, Commands, Strings ;
 		IF res # Commands.Ok THEN
 		IF res # Commands.Ok THEN
 			context.error.String (msg); context.error.Ln; RETURN;
 			context.error.String (msg); context.error.Ln; RETURN;
 		END;
 		END;
-		Strings.Concat ("Oberon.", module, module);
+		Strings.Concat ("Oberon-", module, module);
 		GETPROCEDURE (module, command, procedure);
 		GETPROCEDURE (module, command, procedure);
 		IF procedure = NIL THEN
 		IF procedure = NIL THEN
 			context.error.String ("Oberon command '"); context.error.String (string);
 			context.error.String ("Oberon command '"); context.error.String (string);