2
0
Эх сурвалжийг харах

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 жил өмнө
parent
commit
b4617815d2

+ 4 - 1
source/Builds.Tool

@@ -2,7 +2,7 @@ WIN32G -- 32-bit windows a2 using generic object files
 =================================
 
 	## Compile all files ##
-		Release.Build WinAosNewObjectFile ~
+		Release.Build -b WinAosNewObjectFile ~
 	
 	## 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 ~		
@@ -14,6 +14,9 @@ WIN32G -- 32-bit windows a2 using generic object files
 LINUX32G -- 32 bit linux a2 using generic object files
 ================================
 
+
+	Release.Build -b Linux32G ~
+	
 	## 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 ~
 	

+ 2 - 9
source/FoxCompiler.Mod

@@ -104,15 +104,8 @@ TYPE
 		VAR message,name: ARRAY 256 OF CHAR;
 		BEGIN
 			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;
 			Strings.Append (message, msg);
 			IF error THEN

+ 33 - 30
source/FoxGlobal.Mod

@@ -188,7 +188,7 @@ CONST
 VAR
 	(* names *)
 	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-,
 	NameExclusive-,NameActive-,NamePriority-,NameSafe-,NameRealtime-, NameDynamic-, NameFingerprint-, NameDataMemorySize-, NameCodeMemorySize-
 	, NameChannelWidth-, NameChannelDepth-, NameChannelModule-, NameVector-, NameFloatingPoint-, NameNoMul-,NameNonBlockingIO-, NameTRM-, NameTRMS-, NameEngine-, NameFinal-, NameAbstract-,
@@ -1174,18 +1174,37 @@ TYPE
 		NewCustomBuiltin0(nameL, scope[Scanner.Lowercase], subType, procedureType)
 	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
-		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
-			ASSERT(context=OberonName);
-			Basic.GetString(context,prefix);
-			Basic.Concat(fileName,prefix,".",name);
+			Basic.GetString(name,n);
 		END;
+	END GetModuleSectionName;
+
+	PROCEDURE ModuleFileName*(name, context: SyntaxTree.Identifier; VAR n: ARRAY OF CHAR);
+	BEGIN
+		GetModuleSectionName(name, context, n);
 	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);
 	VAR moduleName, contextName: Scanner.IdentifierString; i,j: LONGINT;
@@ -1214,26 +1233,14 @@ TYPE
 	PROCEDURE GetModuleName*(module: SyntaxTree.Module; VAR name: ARRAY OF CHAR);
 	VAR n: SyntaxTree.IdentifierString;
 	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;
 
 	PROCEDURE GetModuleSegmentedName*(module: SyntaxTree.Module; VAR name: Basic.SegmentedName);
+	VAR moduleName: SyntaxTree.IdentifierString;
 	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;
 
 	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 *)
 			ELSIF scope = inScope THEN (* do not traverse further *)
 			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
 				Scope(scope.outerScope);
 				td := scope(SyntaxTree.RecordScope).ownerRecord.typeDeclaration;
@@ -1686,7 +1690,6 @@ TYPE
 		PointerReturnName := SyntaxTree.NewIdentifier("@PtrReturnType");
 		ResultName := SyntaxTree.NewIdentifier("RESULT");
 		A2Name := SyntaxTree.NewIdentifier("A2");
-		OberonName := SyntaxTree.NewIdentifier("Oberon");
 		ArrayBaseName := SyntaxTree.NewIdentifier("FoxArrayBase");
 		ComplexNumbersName := SyntaxTree.NewIdentifier("ComplexNumbers");
 		RecordBodyName := SyntaxTree.NewIdentifier("@Body");

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

@@ -80,7 +80,7 @@ VAR
 			S.GET( tag - AddrSize, td );
 			IF td.mod # NIL THEN
 				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;
 		
@@ -218,7 +218,7 @@ VAR
 
 
 	PROCEDURE UnlockOberon;
-	CONST OberonKernel = "Oberon.Kernel";
+	CONST OberonKernel = "Oberon-Kernel";
 	VAR c: PROCEDURE;
 	BEGIN
 		IF Modules.ModuleByName( OberonKernel ) # NIL THEN

+ 1 - 8
source/GenericLoader.Mod

@@ -421,12 +421,6 @@ TYPE
 
 			StringPool.GetString(identifier.name[0], name);
 			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
@@ -473,7 +467,7 @@ TYPE
 VAR
 	moduleList: ModuleList;
 	testTypeDescs: Modules.Bytes;
-	InternalModuleName, OberonName: StringPool.Index;
+	InternalModuleName: StringPool.Index;
 
 	PROCEDURE InitData(VAR data: Data);
 	BEGIN
@@ -617,7 +611,6 @@ VAR
 	BEGIN
 		NEW(testTypeDescs,1);
 		Modules.InstallTermHandler(Remove);
-		StringPool.GetIndex("Oberon",OberonName);
 		StringPool.GetIndex("@Module",InternalModuleName);
 		NEW(moduleList);
 		Install;

+ 1 - 1
source/KernelLogger.Mod

@@ -99,7 +99,7 @@ VAR
 	kernelLog- : Texts.Text;
 
 PROCEDURE Start*;
-CONST OberonKernel = "Oberon.Kernel"; OberonSystem = "Oberon.System";
+CONST OberonKernel = "Oberon-Kernel"; OberonSystem = "Oberon-System";
 VAR kernelLockOberon, kernelUnlockOberon, systemStopLog : PROCEDURE;
 BEGIN {EXCLUSIVE}
 	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
 					filename := GenerateFilename("Unix.", context, moduleName, ".Mod");
 					IF ~FileExists(filename) THEN
-						filename := GenerateFilename("Oberon.", context, moduleName, ".Mod");
+						filename := GenerateFilename("Oberon-", context, moduleName, ".Mod");
 						IF ~FileExists(filename) THEN
 							filename := GenerateFilename("", context, moduleName, ".Mod");
 						END;

+ 2 - 2
source/Oberon.Mod

@@ -10,7 +10,7 @@ IMPORT Modules, Commands, Strings, OberonDisplay, Displays, Plugins ;
 		IF res # Commands.Ok THEN
 			context.error.String (msg); context.error.Ln; RETURN;
 		END;
-		Strings.Concat ("Oberon.", module, module);
+		Strings.Concat ("Oberon-", module, module);
 		GETPROCEDURE (module, command, procedure);
 		IF procedure = NIL THEN
 			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
 			ELSE
 				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
 			END;
 		END;

BIN
source/Oberon.Modules.Mod


BIN
source/Oberon.System.Mod


+ 1 - 1
source/SystemTools.Mod

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

+ 1 - 1
source/Visualizer.Mod

@@ -1083,7 +1083,7 @@ TYPE
 						KernelLog.String("found!");
 					ELSE
 						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);
 						IF (file # NIL) THEN
 							KernelLog.String("found!");

+ 1 - 1
source/Win32.Oberon.Mod

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