diff options
author | ronny | 2001-10-05 07:34:56 +0000 |
---|---|---|
committer | ronny | 2001-10-05 07:34:56 +0000 |
commit | c27f421f367a4bc2135e89eba1267af10d339024 (patch) | |
tree | ba1696088a5db21107fb8dfd432569b4667f1cf4 /backend | |
parent | fail explicit cases (diff) |
bind special idents (such as abort, undef from StdMisc) to the correct identifiers
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@828 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'backend')
-rw-r--r-- | backend/Clean System Files/backend_library | 2 | ||||
-rw-r--r-- | backend/backend.dcl | 16 | ||||
-rw-r--r-- | backend/backend.icl | 24 | ||||
-rw-r--r-- | backend/backendconvert.icl | 46 |
4 files changed, 84 insertions, 4 deletions
diff --git a/backend/Clean System Files/backend_library b/backend/Clean System Files/backend_library index 342803b..780b1b4 100644 --- a/backend/Clean System Files/backend_library +++ b/backend/Clean System Files/backend_library @@ -4,6 +4,8 @@ BEInit BEFree BEArg BEDeclareModules +BEBindSpecialModule +BEBindSpecialFunction BESpecialArrayFunctionSymbol BEDictionarySelectFunSymbol BEDictionaryUpdateFunSymbol diff --git a/backend/backend.dcl b/backend/backend.dcl index b144aa5..932338d 100644 --- a/backend/backend.dcl +++ b/backend/backend.dcl @@ -37,6 +37,7 @@ from StdString import String; :: BEArrayFunKind :== Int; :: BESelectorKind :== Int; :: BEUpdateKind :== Int; +:: BESpecialIdentIndex :== Int; BEGetVersion :: (!Int,!Int,!Int); // void BEGetVersion (int* current,int* oldestDefinition,int* oldestImplementation); BEInit :: !Int !UWorld -> (!BackEnd,!UWorld); @@ -47,6 +48,10 @@ BEArg :: !String !BackEnd -> BackEnd; // void BEArg (CleanString arg); BEDeclareModules :: !Int !BackEnd -> BackEnd; // void BEDeclareModules (int nModules); +BEBindSpecialModule :: !BESpecialIdentIndex !Int !BackEnd -> BackEnd; +// void BEBindSpecialModule (BESpecialIdentIndex index,int moduleIndex); +BEBindSpecialFunction :: !BESpecialIdentIndex !Int !Int !BackEnd -> BackEnd; +// void BEBindSpecialFunction (BESpecialIdentIndex index,int functionIndex,int moduleIndex); BESpecialArrayFunctionSymbol :: !BEArrayFunKind !Int !Int !BackEnd -> (!BESymbolP,!BackEnd); // BESymbolP BESpecialArrayFunctionSymbol (BEArrayFunKind arrayFunKind,int functionIndex,int moduleIndex); BEDictionarySelectFunSymbol :: !BackEnd -> (!BESymbolP,!BackEnd); @@ -279,9 +284,9 @@ BEDeclareDynamicTypeSymbol :: !Int !Int !BackEnd -> BackEnd; // void BEDeclareDynamicTypeSymbol (int typeIndex,int moduleIndex); BEDynamicTempTypeSymbol :: !BackEnd -> (!BESymbolP,!BackEnd); // BESymbolP BEDynamicTempTypeSymbol (); -kBEVersionCurrent:==0x02000214; +kBEVersionCurrent:==0x02000215; kBEVersionOldestDefinition:==0x02000213; -kBEVersionOldestImplementation:==0x02000214; +kBEVersionOldestImplementation:==0x02000215; kBEDebug:==1; kPredefinedModuleIndex:==1; BENoAnnot:==0; @@ -354,6 +359,13 @@ BESelector_N:==5; BEUpdateDummy:==0; BEUpdate:==1; BEUpdate_U:==2; +BESpecialIdentStdMisc:==0; +BESpecialIdentAbort:==1; +BESpecialIdentUndef:==2; +BESpecialIdentStdBool:==3; +BESpecialIdentAnd:==4; +BESpecialIdentOr:==5; +BESpecialIdentCount:==6; BELhsNodeId:==0; BERhsNodeId:==1; BEIsNotACaf:==0; diff --git a/backend/backend.icl b/backend/backend.icl index ac2c4b2..05ac802 100644 --- a/backend/backend.icl +++ b/backend/backend.icl @@ -37,6 +37,7 @@ from StdString import String; :: BEArrayFunKind :== Int; :: BESelectorKind :== Int; :: BEUpdateKind :== Int; +:: BESpecialIdentIndex :== Int; BEGetVersion :: (!Int,!Int,!Int); BEGetVersion = code { @@ -68,6 +69,18 @@ BEDeclareModules a0 a1 = code { }; // void BEDeclareModules (int nModules); +BEBindSpecialModule :: !BESpecialIdentIndex !Int !BackEnd -> BackEnd; +BEBindSpecialModule a0 a1 a2 = code { + ccall BEBindSpecialModule "II:V:I" +}; +// void BEBindSpecialModule (BESpecialIdentIndex index,int moduleIndex); + +BEBindSpecialFunction :: !BESpecialIdentIndex !Int !Int !BackEnd -> BackEnd; +BEBindSpecialFunction a0 a1 a2 a3 = code { + ccall BEBindSpecialFunction "III:V:I" +}; +// void BEBindSpecialFunction (BESpecialIdentIndex index,int functionIndex,int moduleIndex); + BESpecialArrayFunctionSymbol :: !BEArrayFunKind !Int !Int !BackEnd -> (!BESymbolP,!BackEnd); BESpecialArrayFunctionSymbol a0 a1 a2 a3 = code { ccall BESpecialArrayFunctionSymbol "III:I:I" @@ -763,9 +776,9 @@ BEDynamicTempTypeSymbol a0 = code { ccall BEDynamicTempTypeSymbol ":I:I" }; // BESymbolP BEDynamicTempTypeSymbol (); -kBEVersionCurrent:==0x02000214; +kBEVersionCurrent:==0x02000215; kBEVersionOldestDefinition:==0x02000213; -kBEVersionOldestImplementation:==0x02000214; +kBEVersionOldestImplementation:==0x02000215; kBEDebug:==1; kPredefinedModuleIndex:==1; BENoAnnot:==0; @@ -838,6 +851,13 @@ BESelector_N:==5; BEUpdateDummy:==0; BEUpdate:==1; BEUpdate_U:==2; +BESpecialIdentStdMisc:==0; +BESpecialIdentAbort:==1; +BESpecialIdentUndef:==2; +BESpecialIdentStdBool:==3; +BESpecialIdentAnd:==4; +BESpecialIdentOr:==5; +BESpecialIdentCount:==6; BELhsNodeId:==0; BERhsNodeId:==1; BEIsNotACaf:==0; diff --git a/backend/backendconvert.icl b/backend/backendconvert.icl index bea9282..1a5dbdf 100644 --- a/backend/backendconvert.icl +++ b/backend/backendconvert.icl @@ -363,6 +363,10 @@ beNoUniVarEquations :== beFunction0 BENoUniVarEquations beUniVarEquationsList :== beFunction2 BEUniVarEquationsList +beBindSpecialModule specialIdentIndex moduleIndex + :== beApFunction0 (BEBindSpecialModule specialIdentIndex moduleIndex) +beBindSpecialFunction specialIdentIndex functionIndex moduleIndex + :== beApFunction0 (BEBindSpecialFunction specialIdentIndex functionIndex moduleIndex) // temporary hack beDynamicTempTypeSymbol @@ -483,6 +487,7 @@ backEndConvertModulesH predefs {fe_icl = with dcl_common = currentDcl.dcl_common + # backEnd = bindSpecialIdents predefs icl_used_module_numbers backEnd #! backEnd = removeExpandedTypesFromDclModules fe_dcls icl_used_module_numbers backEnd = (backEnd -*-> "backend done") where @@ -1076,6 +1081,47 @@ predefineSymbols {dcl_common} predefs // ... sanity check = appBackEnd (BEPredefineConstructorSymbol arity predefs.[index].pds_def cPredefinedModuleIndex symbolKind) + +bindSpecialIdents :: PredefinedSymbols NumberSet -> BackEnder +bindSpecialIdents predefs usedModules + = foldState (bindSpecialModule predefs usedModules) specialModules + where + bindSpecialModule :: PredefinedSymbols NumberSet (Int, BESpecialIdentIndex, [(Int, BESpecialIdentIndex)]) -> BackEnder + bindSpecialModule predefs usedModules (predefIndex, specialIdentIndex, specialFunctions) + | moduleIndex == NoIndex || not (inNumberSet moduleIndex usedModules) + = identity + // otherwise + = beBindSpecialModule specialIdentIndex moduleIndex + o` foldState (bindSpecialFunction predefs) specialFunctions + where + predef + = predefs.[predefIndex] + moduleIndex + = predef.pds_def + + bindSpecialFunction :: PredefinedSymbols (Int, BESpecialIdentIndex) -> BackEnder + bindSpecialFunction predefs (predefIndex, specialIdentIndex) + | predef.pds_def == NoIndex + = identity + // otherwise + = beBindSpecialFunction specialIdentIndex predef.pds_def predef.pds_module + where + predef + = predefs.[predefIndex] + + specialModules + = [ (PD_StdMisc, BESpecialIdentStdMisc, + [ (PD_abort, BESpecialIdentAbort) + , (PD_undef, BESpecialIdentUndef) + ] + ) + , (PD_StdBool, BESpecialIdentStdBool, + [ (PD_AndOp, BESpecialIdentAnd) + , (PD_OrOp, BESpecialIdentOr) + ] + ) + ] + adjustStrictListFunctions :: [Int] [Int] {#PredefinedSymbol} {#DclModule} NumberSet Int *BackEndState -> *BackEndState; adjustStrictListFunctions list_first_instance_indices tail_strict_list_first_instance_indices predefs dcls used_module_numbers main_dcl_module_n backEnd | std_strict_list_module_index==NoIndex || not (inNumberSet std_strict_list_module_index used_module_numbers) |