aboutsummaryrefslogtreecommitdiff
path: root/frontend/checkFunctionBodies.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/checkFunctionBodies.icl')
-rw-r--r--frontend/checkFunctionBodies.icl30
1 files changed, 26 insertions, 4 deletions
diff --git a/frontend/checkFunctionBodies.icl b/frontend/checkFunctionBodies.icl
index fc8bff4..030921e 100644
--- a/frontend/checkFunctionBodies.icl
+++ b/frontend/checkFunctionBodies.icl
@@ -3,6 +3,7 @@ implementation module checkFunctionBodies
import syntax, typesupport, parse, checksupport, utilities, checktypes, transform, predef //, RWSDebug
import explicitimports, comparedefimp
from check import checkFunctions,checkDclMacros
+import compilerSwitches
cIsInExpressionList :== True
cIsNotInExpressionList :== False
@@ -1182,25 +1183,46 @@ checkExpression free_vars (PE_Generic id=:{id_name,id_info} kind) e_input e_stat
check_generic_expr free_vars entry id kind e_input e_state e_info cs=:{cs_error}
= (EE, free_vars, e_state, e_info, { cs & cs_error = checkError id "not a generic" cs_error })
- check_it free_vars mod_index gen_index id kind e_input e_state=:{es_expr_heap} e_info cs
+ check_it free_vars mod_index gen_index id kind e_input e_state=:{es_expr_heap} e_info cs
+
+ # (generic_info_expr, es_expr_heap, cs) = build_generic_info es_expr_heap cs
+ #! (app_args, es_expr_heap, cs) = SwitchGenericInfo
+ ([generic_info_expr], es_expr_heap, cs)
+ ([], es_expr_heap, cs)
#! symb_kind = SK_Generic { glob_object = gen_index, glob_module = mod_index} kind
#! symbol = { symb_name = id, symb_kind = symb_kind }
#! (new_info_ptr, es_expr_heap) = newPtr EI_Empty es_expr_heap
- #! app = { app_symb = symbol, app_args = [], app_info_ptr = new_info_ptr }
+ #! app = { app_symb = symbol, app_args = app_args, app_info_ptr = new_info_ptr }
#! e_state = { e_state & es_expr_heap = es_expr_heap }
#! cs = { cs & cs_x.x_needed_modules = cs_x.x_needed_modules bitor cNeedStdGeneric }
= (App app, free_vars, e_state, e_info, cs)
+ where
+ // adds NoGenericInfo argument to each generic call
+ build_generic_info es_expr_heap cs=:{cs_predef_symbols}
+ #! pds_ident = predefined_idents.[PD_NoGenericInfo]
+ #! ({pds_module, pds_def}, cs_predef_symbols) = cs_predef_symbols ! [PD_NoGenericInfo]
+ #! (new_info_ptr, es_expr_heap) = newPtr EI_Empty es_expr_heap
+ #! app =
+ { app_symb =
+ { symb_name = pds_ident
+ , symb_kind = SK_Constructor {glob_module=pds_module, glob_object=pds_def}
+ }
+ , app_args = []
+ , app_info_ptr = new_info_ptr
+ }
+ = (App app, es_expr_heap, {cs & cs_predef_symbols = cs_predef_symbols})
add_kind :: !Index !TypeKind !u:{#GenericDef} !*ExpressionState
-> (!u:{#GenericDef}, !*ExpressionState)
add_kind generic_index kind generic_defs e_state=:{es_generic_heap}
- /*
+/*
#! ({gen_info_ptr}, generic_defs) = generic_defs ! [generic_index]
#! (gen_info, es_generic_heap) = readPtr gen_info_ptr es_generic_heap
#! gen_kinds = eqMerge [(kind,NoIndex)] gen_info.gen_kinds
#! es_generic_heap = writePtr gen_info_ptr {gen_info&gen_kinds=gen_kinds} es_generic_heap
- */
+*/
= (generic_defs, {e_state & es_generic_heap = es_generic_heap})
+
checkExpression free_vars expr e_input e_state e_info cs
= abort "checkExpression (checkFunctionBodies.icl, line 868)" // <<- expr