Sketch out call-info, realized it and function-analysis needs pectx and also err threaded through it, since it can fail (which must be recoverable) and needs env and pectx for partial_eval inside

This commit is contained in:
2023-02-02 01:18:17 -05:00
parent bea48eb18b
commit 3807381ceb

View File

@@ -275,7 +275,7 @@
(.marked_env (lambda (x) (slice x 2 -1))) (.marked_env (lambda (x) (slice x 2 -1)))
(.marked_env_has_vals (lambda (x) (idx x 2))) (.marked_env_has_vals (lambda (x) (idx x 2)))
(.marked_env_needed_for_progress (lambda (x) (idx x 3))) (.marked_env_needed_for_progress (lambda (x) (idx x 3)))
(.marked_env_idx (lambda (x) (idx x 4))) (.marked_env_id (lambda (x) (idx x 4)))
(.marked_env_upper (lambda (x) (idx (idx x 5) -1))) (.marked_env_upper (lambda (x) (idx (idx x 5) -1)))
(.env_marked (lambda (x) (idx x 5))) (.env_marked (lambda (x) (idx x 5)))
(marked_env_real? (lambda (x) (= nil (idx (.marked_env_needed_for_progress x) 0)))) (marked_env_real? (lambda (x) (= nil (idx (.marked_env_needed_for_progress x) 0))))
@@ -495,7 +495,7 @@
(array (true_str "<n " (needed_for_progress x) " (comb " wrap_level " " env_id " " se_s " " de? " " params " " body_s ")>") done_envs))) (array (true_str "<n " (needed_for_progress x) " (comb " wrap_level " " env_id " " se_s " " de? " " params " " body_s ")>") done_envs)))
((prim_comb? x) (array (true_str "<wl=" (.prim_comb_wrap_level x) " " (.prim_comb_sym x) ">") done_envs)) ((prim_comb? x) (array (true_str "<wl=" (.prim_comb_wrap_level x) " " (.prim_comb_sym x) ">") done_envs))
((marked_env? x) (dlet ((e (.env_marked x)) ((marked_env? x) (dlet ((e (.env_marked x))
(index (.marked_env_idx x)) (index (.marked_env_id x))
(u (idx e -1)) (u (idx e -1))
(already (in_array index done_envs)) (already (in_array index done_envs))
(opening (true_str "{" (mif (marked_env_real? x) "real" "fake") (mif (.marked_env_has_vals x) " real vals" " fake vals") " ENV idx: " (true_str index) ", ")) (opening (true_str "{" (mif (marked_env_real? x) "real" "fake") (mif (.marked_env_has_vals x) " real vals" " fake vals") " ENV idx: " (true_str index) ", "))
@@ -597,7 +597,7 @@
;(memo (put memo hash total)) ;(memo (put memo hash total))
) (array memo total))) ) (array memo total)))
((marked_env? x) (if (and (not (marked_env_real? x)) (= s_env_id (.marked_env_idx x))) (array memo true) ((marked_env? x) (if (and (not (marked_env_real? x)) (= s_env_id (.marked_env_id x))) (array memo true)
(dlet ( (dlet (
(values (slice (.env_marked x) 0 -2)) (values (slice (.env_marked x) 0 -2))
(upper (idx (.env_marked x) -1)) (upper (idx (.env_marked x) -1))
@@ -675,7 +675,7 @@
)) ))
(drop_redundent_veval (rec-lambda drop_redundent_veval (partial_eval_helper x de env_stack pectx indent) (dlet ( (drop_redundent_veval (rec-lambda drop_redundent_veval (partial_eval_helper x de env_stack pectx indent) (dlet (
(env_id (.marked_env_idx de)) (env_id (.marked_env_id de))
(r (if (r (if
(and (marked_array? x) (and (marked_array? x)
(not (.marked_array_is_val x))) (not (.marked_array_is_val x)))
@@ -683,7 +683,7 @@
(= 'veval (.prim_comb_sym (idx (.marked_array_values x) 0))) (= 'veval (.prim_comb_sym (idx (.marked_array_values x) 0)))
(= 3 (len (.marked_array_values x))) (= 3 (len (.marked_array_values x)))
(not (marked_env_real? (idx (.marked_array_values x) 2))) (not (marked_env_real? (idx (.marked_array_values x) 2)))
(= env_id (.marked_env_idx (idx (.marked_array_values x) 2)))) (drop_redundent_veval partial_eval_helper (idx (.marked_array_values x) 1) de env_stack pectx (+ 1 indent)) (= env_id (.marked_env_id (idx (.marked_array_values x) 2)))) (drop_redundent_veval partial_eval_helper (idx (.marked_array_values x) 1) de env_stack pectx (+ 1 indent))
; wait, can it do this? will this mess with eval? ; wait, can it do this? will this mess with eval?
; basically making sure that this comb's params are still good to eval ; basically making sure that this comb's params are still good to eval
@@ -722,10 +722,10 @@
) )
(if (or force hashes_now (= for_progress true) (intset_intersection_nonempty for_progress (idx env_stack 0))) (if (or force hashes_now (= for_progress true) (intset_intersection_nonempty for_progress (idx env_stack 0)))
(cond ((val? x) (array pectx nil x)) (cond ((val? x) (array pectx nil x))
((marked_env? x) (dlet ((dbi (.marked_env_idx x))) ((marked_env? x) (dlet ((dbi (.marked_env_id x)))
; compiler calls with empty env stack ; compiler calls with empty env stack
(mif dbi (dlet ( (new_env ((rec-lambda rec (i len_env_stack) (cond ((= i len_env_stack) nil) (mif dbi (dlet ( (new_env ((rec-lambda rec (i len_env_stack) (cond ((= i len_env_stack) nil)
((= dbi (.marked_env_idx (idx (idx env_stack 1) i))) (idx (idx env_stack 1) i)) ((= dbi (.marked_env_id (idx (idx env_stack 1) i))) (idx (idx env_stack 1) i))
(true (rec (+ i 1) len_env_stack)))) (true (rec (+ i 1) len_env_stack))))
0 (len (idx env_stack 1)))) 0 (len (idx env_stack 1))))
(_ (println (str_strip "replacing " x) (str_strip " with (if nonnil) " new_env))) (_ (println (str_strip "replacing " x) (str_strip " with (if nonnil) " new_env)))
@@ -768,7 +768,7 @@
; (array pectx err comb))) ; (array pectx err comb)))
(_ (println (indent_str indent) "Going to do an array call!")) (_ (println (indent_str indent) "Going to do an array call!"))
(indent (+ 1 indent)) (indent (+ 1 indent))
(_ (print_strip (indent_str indent) "total (in env " (.marked_env_idx env) ") is (proceeding err " err ") " x)) (_ (print_strip (indent_str indent) "total (in env " (.marked_env_id env) ") is (proceeding err " err ") " x))
(map_rp_eval (lambda (pectx ps) (foldl (dlambda ((c er ds) p) (dlet ((_ (print_strip (indent_str indent) "rp_evaling " p)) ((c e d) (partial_eval_helper p false env env_stack c (+ 1 indent) false)) (_ (print_strip (indent_str indent) "result of rp_eval was err " e " and value " d))) (array c (mif er er e) (concat ds (array d))))) (map_rp_eval (lambda (pectx ps) (foldl (dlambda ((c er ds) p) (dlet ((_ (print_strip (indent_str indent) "rp_evaling " p)) ((c e d) (partial_eval_helper p false env env_stack c (+ 1 indent) false)) (_ (print_strip (indent_str indent) "result of rp_eval was err " e " and value " d))) (array c (mif er er e) (concat ds (array d)))))
(array pectx nil (array)) (array pectx nil (array))
ps))) ps)))
@@ -837,10 +837,10 @@
(pectx (array env_counter memo)) (pectx (array env_counter memo))
) (array pectx func_err func_result false)))) ) (array pectx func_err func_result false))))
(_ (print_strip (indent_str indent) "evaled result of function call (in env " (.marked_env_idx env) ", with inner " env_id ") and err " func_err " is " func_result)) (_ (print_strip (indent_str indent) "evaled result of function call (in env " (.marked_env_id env) ", with inner " env_id ") and err " func_err " is " func_result))
(must_stop_maybe_id (and (= nil func_err) (must_stop_maybe_id (and (= nil func_err)
(or rec_stop (if (not (combiner_return_ok func_result env_id)) (or rec_stop (if (not (combiner_return_ok func_result env_id))
(if (!= nil de?) (.marked_env_idx env) true) (if (!= nil de?) (.marked_env_id env) true)
false)))) false))))
) (if (!= nil func_err) (array pectx func_err nil) ) (if (!= nil func_err) (array pectx func_err nil)
(if must_stop_maybe_id (if must_stop_maybe_id
@@ -880,7 +880,7 @@
((!= nil err) (begin (print (indent_str indent) "got err " err) (array pectx err nil))) ((!= nil err) (begin (print (indent_str indent) "got err " err) (array pectx err nil)))
; If our env was implicit, then our unval'd code can be inlined directly in our caller ; If our env was implicit, then our unval'd code can be inlined directly in our caller
(implicit_env (drop_redundent_veval partial_eval_helper ebody de env_stack pectx indent)) (implicit_env (drop_redundent_veval partial_eval_helper ebody de env_stack pectx indent))
((combiner_return_ok ebody (.marked_env_idx eval_env)) (drop_redundent_veval partial_eval_helper ebody de env_stack pectx indent)) ((combiner_return_ok ebody (.marked_env_id eval_env)) (drop_redundent_veval partial_eval_helper ebody de env_stack pectx indent))
(true (drop_redundent_veval partial_eval_helper (marked_array false true nil (array (marked_prim_comb recurse 'veval -1 true) ebody eval_env) nil) de env_stack pectx indent)) (true (drop_redundent_veval partial_eval_helper (marked_array false true nil (array (marked_prim_comb recurse 'veval -1 true) ebody eval_env) nil) de env_stack pectx indent))
)))) ))))
@@ -976,7 +976,7 @@
(this (marked_array false true nil (concat (array (marked_prim_comb (recurse false) 'cond 0 true) (this (marked_array false true nil (concat (array (marked_prim_comb (recurse false) 'cond 0 true)
pred) pred)
sliced_params) nil)) sliced_params) nil))
(hash (combine_hash (combine_hash 101 (.hash this)) (+ 103 (.marked_env_idx de)))) (hash (combine_hash (combine_hash 101 (.hash this)) (+ 103 (.marked_env_id de))))
((env_counter memo) pectx) ((env_counter memo) pectx)
(already_in (!= false (get-value-or-false memo hash))) (already_in (!= false (get-value-or-false memo hash)))
(_ (if already_in (print_strip "ALREADY IN " this) (_ (if already_in (print_strip "ALREADY IN " this)
@@ -4609,8 +4609,10 @@
(let_like_inline_closure (lambda (func_value containing_env_idx) (and (comb? func_value) (let_like_inline_closure (lambda (func_value containing_env_idx) (and (comb? func_value)
(not (.comb_varadic func_value)) (not (.comb_varadic func_value))
(= containing_env_idx (.marked_env_idx (.comb_env func_value))) (= containing_env_idx (.marked_env_id (.comb_env func_value)))
(= nil (.comb_des func_value))))) (= nil (.comb_des func_value)))))
(is_prim_function_call (lambda (c s) (and (marked_array? c) (not (.marked_array_is_val c)) (<= 2 (len (.marked_array_values c)))
(prim_comb? (idx (.marked_array_values c) 0)) (= s (.prim_comb_sym (idx (.marked_array_values c) 0))))))
; Ok, we're pulling out the call stuff out of compile ; Ok, we're pulling out the call stuff out of compile
; Wrapped vs unwrapped ; Wrapped vs unwrapped
@@ -4626,35 +4628,73 @@
; call-info will be a fairly simple pre-order traversal (looking at caller before params) ; call-info will be a fairly simple pre-order traversal (looking at caller before params)
; infer-type has to walk though cond in pairs, special handle the (and ) case, and adjust parameters for veval ; infer-type has to walk though cond in pairs, special handle the (and ) case, and adjust parameters for veval
; perceus is weird, as it has to look at the head to determine how to order/combine the children, as well as an extra sub-data for the call itself (though I guess this is just part of the node data) ; perceus is weird, as it has to look at the head to determine how to order/combine the children, as well as an extra sub-data for the call itself (though I guess this is just part of the node data)
(call-info (rec-lambda call-info (c env_id) (cond
((val? c) nil)
((and (marked_symbol? c) (.marked_symbol_is_val c)) nil)
((marked_symbol? c) nil)
((marked_env? c) nil) ; So it actually needs to recurse into env (no, I don't think so, maybe only fake)
((prim_comb? c) nil)
((and (marked_array? c) (.marked_array_is_val c)) nil) ; and array values
((comb? c) (dlet ( ; Starting with only dynamic call unval
((wrap_level env_id de? se variadic params body) (.comb c)) ; TODO: tce-data
(_ (mif (> wrap_level 1) (error "wrap level TOO DARN HIGH")))
(call-info (rec-lambda call-info (c env pectx) (cond
((val? c) (array nil nil pectx))
((and (marked_symbol? c) (.marked_symbol_is_val c)) (array nil nil pectx))
((marked_symbol? c) (array nil nil pectx))
((marked_env? c) (array nil nil pectx))
((prim_comb? c) (array nil nil pectx))
((and (marked_array? c) (.marked_array_is_val c)) (array nil nil pectx))
((comb? c) (array nil nil pectx))
((and (marked_array? c) (let_like_inline_closure (idx (.marked_array_values c) 0) (.marked_env_id env))) (dlet (
(func_param_values (.marked_array_values c))
(func (idx func_param_values 0))
; TODO: pull errors out of here
;(param_data (map (lambda (x) (call-info x env)) (slice func_param_values 1 -1)))
; TODO: pull errors out of here
; mk tmp env
;(body_data (call-info (.comb_body func tmp_env)))
) (array nil nil pectx))) ;(array nil (cons body_data param_data))))
((is_prim_function_call c 'veval) (dlet (
(func_param_values (.marked_array_values c))
(num_params (- (len func_param_values) 1))
(params (slice func_param_values 1 -1))
; These can't be fatal either
;(_ (if (!= 2 num_params) (error "call to veval has != 2 params!")))
;(_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param")))
; TODO: pull errors out of here
;(sub_data (array nil (call-info (idx params 0) (idx params 1)) nil))
) (array nil nil pectx))) ;(array nil sub_data)))
) nil))
((and (marked_array? c) ;(>= 2 (len (.marked_array_values c)))
(let_like_inline_closure (idx (.marked_array_values c) 0) env_id)) nil)
; REMEMBER - new env_id inside
; but same tce-data
; and same y-comb memo
(true (dlet ( (true (dlet (
; obv need to handle possible dynamic calls with an additional unval side, but also be careful of infinite recursion (as we had happen on compile before) ; obv need to handle possible dynamic calls with an additional unval side, but also be careful of infinite recursion (as we had happen on compile before)
; due to the interaction of partial eval and unval (previously in compile) here ; due to the interaction of partial eval and unval (previously in compile) here
; might need to check for (is_prim_function_call c 'vcond) for recursion?
; the basic check is is this dynamic or not, and if so (and thus we don't know the wrap level)
; we need to
; if not dynamic, just recurse as normal
; assert wrap-level == 0 or == -1
((tce_idx tce_full_params) (mif tce_data tce_data (array nil nil))) (func_param_values (.marked_array_values c))
(tce_able (and unwrapped (= tce_idx (extract_func_idx func_val)))) (func (idx func_param_values 0))
) nil)) ; ; TODO: pull errors out of here
; (sub_data (map (lambda (x) (call-info x env)) func_param_values))
; NOTICE TRANSPARENT VEVAL ; ; TODO: pull errors out of here
; also vcond, of course ; (our_data (cond ((and (comb? func) ( = (.comb_wrap_level func) 0)) nil)
; ((and (comb? func) (!= (.comb_wrap_level func) 1)) (error "bad wrap level call-info")) ; this is a tad tricky - I wanted to just have error here, but
; ; *concievably this is the result of wrongly evaluted code based on this
; ; very method of prediction. Instead, we need to error here,
; ; and have that count as erroing out of the compile.
; ; How best should we do that, I wonder?
; ((prim_comb? func) nil)
; (true (dlet (
; ((ok x) (try_unval x (lambda (_) nil)))
; (err (if (not ok) "couldn't unval in compile" err))
; ((pectx e pex) (mif err (array pectx err nil))
; ; x only_head env env_stack pectx indent force
; (partial_eval_helper x false env (array nil nil) pectx 1 false))))
; ) nil)
; ))
;) (array our_data sub_data))
) (array nil nil pectx))) ;(array nil sub_data)))
))) )))
; type is a bit generic, both the runtime types + length of arrays ; type is a bit generic, both the runtime types + length of arrays
@@ -4682,8 +4722,6 @@
(get-list-or (lambda (d k o) (dlet ((x (get-list d k))) (get-list-or (lambda (d k o) (dlet ((x (get-list d k)))
(mif x (idx x 1) (mif x (idx x 1)
o)))) o))))
(is_prim_function_call (lambda (c s) (and (marked_array? c) (not (.marked_array_is_val c)) (<= 2 (len (.marked_array_values c)))
(prim_comb? (idx (.marked_array_values c) 0)) (= s (.prim_comb_sym (idx (.marked_array_values c) 0))))))
(is_markable (lambda (x) (or (and (marked_symbol? x) (not (.marked_symbol_is_val x))) (is_markable (lambda (x) (or (and (marked_symbol? x) (not (.marked_symbol_is_val x)))
(and (marked_array? x) (not (.marked_array_is_val x))) (and (marked_array? x) (not (.marked_array_is_val x)))
))) )))
@@ -4836,7 +4874,7 @@
(_ (if (!= 2 num_params) (error "call to veval has != 2 params!"))) (_ (if (!= 2 num_params) (error "call to veval has != 2 params!")))
(_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param"))) (_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param")))
(new_env_id (.marked_env_idx (idx params 1))) (new_env_id (.marked_env_id (idx params 1)))
(sub_data (array (infer_types func env_id implies guarentees) (sub_data (array (infer_types func env_id implies guarentees)
(infer_types (idx params 0) new_env_id empty_dict-list empty_dict-list) (infer_types (idx params 0) new_env_id empty_dict-list empty_dict-list)
@@ -4944,7 +4982,7 @@
(_ (if (!= 2 num_params) (error "call to veval has != 2 params!"))) (_ (if (!= 2 num_params) (error "call to veval has != 2 params!")))
(_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param"))) (_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param")))
(new_env_id (.marked_env_idx (idx params 1))) (new_env_id (.marked_env_id (idx params 1)))
(body_data (pseudo_perceus (idx params 0) new_env_id knot_memo empty_use_map)) (body_data (pseudo_perceus (idx params 0) new_env_id knot_memo empty_use_map))
((used_map_pre_env env_sub_data) (pseudo_perceus (idx params 1) env_id knot_memo used_map_after)) ((used_map_pre_env env_sub_data) (pseudo_perceus (idx params 1) env_id knot_memo used_map_after))
@@ -5078,7 +5116,7 @@
(_ (if (!= 2 num_params) (error "call to veval has != 2 params!"))) (_ (if (!= 2 num_params) (error "call to veval has != 2 params!")))
(_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param"))) (_ (if (not (marked_env? (idx params 1))) (error "call to veval has not marked_env second param")))
(new_env_id (.marked_env_idx (idx params 1))) (new_env_id (.marked_env_id (idx params 1)))
((body_borrowed body_sub_data) (borrow? (idx params 0) b new_env_id (pseudo_perceus_just_sub_idx used_map_sub_data 1))) ((body_borrowed body_sub_data) (borrow? (idx params 0) b new_env_id (pseudo_perceus_just_sub_idx used_map_sub_data 1)))
((env_borrowed env_sub_data) (borrow? (idx params 1) true env_id (pseudo_perceus_just_sub_idx used_map_sub_data 2))) ((env_borrowed env_sub_data) (borrow? (idx params 1) true env_id (pseudo_perceus_just_sub_idx used_map_sub_data 2)))
) (array body_borrowed (array borrow_nil (array body_borrowed body_sub_data) (array env_borrowed env_sub_data))))) ) (array body_borrowed (array borrow_nil (array body_borrowed body_sub_data) (array env_borrowed env_sub_data)))))
@@ -5125,12 +5163,16 @@
;(_ (true_print "done borrow!")) ;(_ (true_print "done borrow!"))
) r))) ) r)))
(function-analysis (lambda (c memo) (dlet ( (function-analysis (lambda (c memo pectx) (dlet (
((wrap_level env_id de? se variadic params body) (.comb c)) ((wrap_level env_id de? se variadic params body) (.comb c))
(full_params (concat params (mif de? (array de?) (array)))) (full_params (concat params (mif de? (array de?) (array))))
(call_info (call-info c env_id)) (inner_env (make_tmp_inner_env params de? se env_id))
((call_info call_err pectx) (call-info body inner_env pectx))
(analysis_err call_err)
(inner_type_data (infer_types body env_id empty_dict-list empty_dict-list)) (inner_type_data (infer_types body env_id empty_dict-list empty_dict-list))
((used_map_before used_map_sub_data) (pseudo_perceus body env_id memo (push_used_map empty_use_map full_params))) ((used_map_before used_map_sub_data) (pseudo_perceus body env_id memo (push_used_map empty_use_map full_params)))
((borrowed borrow_sub_data) (borrow? body false env_id used_map_sub_data)) ((borrowed borrow_sub_data) (borrow? body false env_id used_map_sub_data))
@@ -5138,7 +5180,7 @@
(inner_analysis_data (array inner_type_data used_map_sub_data call_info)) (inner_analysis_data (array inner_type_data used_map_sub_data call_info))
) inner_analysis_data))) ) (array inner_analysis_data analysis_err pectx))))
(cached_analysis_idx (lambda (c env_id cache i) (dlet ( (cached_analysis_idx (lambda (c env_id cache i) (dlet (
;(_ (true_print "doing infer-types-idx for " (true_str_strip c))) ;(_ (true_print "doing infer-types-idx for " (true_str_strip c)))
@@ -5227,7 +5269,7 @@
(func_value (idx func_param_values 0)) (func_value (idx func_param_values 0))
(_ (true_print "about to get cached_infer_types_idx for call before checking for 'idx")) (_ (true_print "about to get cached_infer_types_idx for call before checking for 'idx"))
;(_ (true_print " cache is " type_data)) ;(_ (true_print " cache is " type_data))
(parameter_subs (map (lambda (i) (cached_analysis_idx c (.marked_env_idx env) analysis_data i)) (range 1 (len func_param_values)))) (parameter_subs (map (lambda (i) (cached_analysis_idx c (.marked_env_id env) analysis_data i)) (range 1 (len func_param_values))))
(parameter_types (map just_type parameter_subs)) (parameter_types (map just_type parameter_subs))
; used_data HERE ; used_data HERE
@@ -5460,7 +5502,7 @@
; User inline ; User inline
((and (not dont_closure_inline) (let_like_inline_closure func_value (.marked_env_idx env))) (dlet ( ((and (not dont_closure_inline) (let_like_inline_closure func_value (.marked_env_id env))) (dlet (
; To inline, we add all of the parameters + inline_level + 1 to the current functions additional symbols ; To inline, we add all of the parameters + inline_level + 1 to the current functions additional symbols
; as well as a new se + inline_level + 1 symbol ; as well as a new se + inline_level + 1 symbol
; fill them with the result of evaling the parameters now ; fill them with the result of evaling the parameters now
@@ -5668,7 +5710,7 @@
(generate_env_access (dlambda ((datasi funcs memo env pectx inline_locals) env_id reason) ((rec-lambda recurse (code this_env) (generate_env_access (dlambda ((datasi funcs memo env pectx inline_locals) env_id reason) ((rec-lambda recurse (code this_env)
(cond (cond
((= env_id (.marked_env_idx this_env)) (array nil (generate_dup code) nil (array datasi funcs memo env pectx inline_locals))) ((= env_id (.marked_env_id this_env)) (array nil (generate_dup code) nil (array datasi funcs memo env pectx inline_locals)))
((= nil (.marked_env_upper this_env)) (array nil nil (str "bad env, upper is nil and we haven't found " env_id ", (this is *possiblely* because we're not recreating val/notval chains?) maxing out at " (str_strip this_env) ", having started at " (str_strip env) ", we're generating because " reason) (array datasi funcs memo env pectx))) ((= nil (.marked_env_upper this_env)) (array nil nil (str "bad env, upper is nil and we haven't found " env_id ", (this is *possiblely* because we're not recreating val/notval chains?) maxing out at " (str_strip this_env) ", having started at " (str_strip env) ", we're generating because " reason) (array datasi funcs memo env pectx)))
(true (recurse (i64.load 16 (extract_ptr_code code)) (.marked_env_upper this_env))) (true (recurse (i64.load 16 (extract_ptr_code code)) (.marked_env_upper this_env)))
) )
@@ -5676,7 +5718,7 @@
) (if (not (marked_env_real? c)) (begin (print_strip "env wasn't real: " (marked_env_real? c) ", so generating access (env was) " c) ) (if (not (marked_env_real? c)) (begin (print_strip "env wasn't real: " (marked_env_real? c) ", so generating access (env was) " c)
(if need_value (array nil nil (str "marked env not real, though we need_value: " (str_strip c)) ctx) (if need_value (array nil nil (str "marked env not real, though we need_value: " (str_strip c)) ctx)
(generate_env_access ctx (.marked_env_idx c) "it wasn't real: " (str_strip c)))) (generate_env_access ctx (.marked_env_id c) "it wasn't real: " (str_strip c))))
(dlet ( (dlet (
;(_ (true_print "gonna compile kvs vvs")) ;(_ (true_print "gonna compile kvs vvs"))
@@ -5693,11 +5735,11 @@
((uv ucode err ctx) (mif (idx e -1) (compile-inner ctx (idx e -1) need_value inside_veval outer_s_env_access_code s_env_access_code inline_level nil analysis_nil) ((uv ucode err ctx) (mif (idx e -1) (compile-inner ctx (idx e -1) need_value inside_veval outer_s_env_access_code s_env_access_code inline_level nil analysis_nil)
(array nil_val nil nil ctx))) (array nil_val nil nil ctx)))
) (mif (or (= false kvs) (= nil uv) (!= nil err)) ) (mif (or (= false kvs) (= nil uv) (!= nil err))
(begin (print_strip "kvs " kvs " vvs " vvs " uv " uv " or err " err " based off of " c) (begin (true_print "kvs " kvs " vvs " vvs " uv " uv " or err " err " based off of " (true_str_strip c))
(error "I DON'T LIKE IT - IMPOSSIBLE?") (error "I DON'T LIKE IT - IMPOSSIBLE?")
(if need_value (if need_value
(array nil nil (str "had to generate env access (course " need_value ") for " (str_strip c) "vvs is " vvs " err was " err) ctx) (array nil nil (str "had to generate env access (course " need_value ") for " (str_strip c) "vvs is " vvs " err was " err) ctx)
(generate_env_access ctx (.marked_env_idx c) (str " vvs " vvs " uv " uv " or err " err " based off of " (str_strip c))))) (generate_env_access ctx (.marked_env_id c) (str " vvs " vvs " uv " uv " or err " err " based off of " (str_strip c)))))
(dlet ( (dlet (
((datasi funcs memo env pectx inline_locals) ctx) ((datasi funcs memo env pectx inline_locals) ctx)
;(_ (true_print "about to kvs_array")) ;(_ (true_print "about to kvs_array"))
@@ -5836,11 +5878,14 @@
; Put our eventual func_value in the memo before we actually compile for recursion etc ; Put our eventual func_value in the memo before we actually compile for recursion etc
(memo (put (put memo new_hash func_value) old_hash func_value)) (memo (put (put memo new_hash func_value) old_hash func_value))
(inner_analysis_data (function-analysis c memo)) ((inner_analysis_data analysis_err pectx) (function-analysis c memo pectx))
(ctx (array datasi funcs memo env pectx outer_inline_locals))
; EARLY QUIT IF Analysis Error
) (mif analysis_err (array nil nil analysis_err ctx) (dlet (
(new_inline_locals (array)) (new_inline_locals (array))
(ctx (array datasi funcs memo env pectx new_inline_locals)) (ctx (array datasi funcs memo env pectx new_inline_locals))
(new_tce_data (array our_func_idx full_params)) (new_tce_data (array our_func_idx full_params))
(inner_env (make_tmp_inner_env params de? se env_id)) (inner_env (make_tmp_inner_env params de? se env_id))
@@ -5926,13 +5971,15 @@
(funcs (concat old_funcs wrapper_func our_func (drop funcs (+ 2 (len old_funcs))))) (funcs (concat old_funcs wrapper_func our_func (drop funcs (+ 2 (len old_funcs)))))
) (array func_value nil err (array datasi funcs memo env pectx outer_inline_locals))) ) (array func_value nil err (array datasi funcs memo env pectx outer_inline_locals)))
)) ))))
(_ (print_strip "returning " func_value " for " c)) (_ (print_strip "returning " func_value " for " c))
(_ (if (not (int? func_value)) (error "BADBADBADfunc"))) (_ (if (and (not func_err) (not (int? func_value))) (error "BADBADBADfunc")))
(full_result (mif env_val
(array (combine_env_comb_val env_val func_value) nil (mif func_err (str func_err ", from compiling comb body") (mif env_err (str env_err ", from compiling comb env") nil)) ctx) (full_result (cond
(array nil (combine_env_code_comb_val_code env_code (mod_fval_to_wrap func_value)) (mif func_err (str func_err ", from compiling comb body (env as code)") (mif env_err (str env_err ", from compiling comb env (as code)") nil)) ctx))) ((!= nil func_err) (array nil nil (str func_err ", from compiling comb body") ctx))
;(_ (mif env_val (true_print "total function " (idx full_result 0) " based on " env_val " and " func_value))) ((!= nil env_err) (array nil nil (str env_err ", from compiling env") ctx))
((!= nil env_val) (array (combine_env_comb_val env_val func_value) nil nil ctx))
(true (array nil (combine_env_code_comb_val_code env_code (mod_fval_to_wrap func_value)) nil ctx))))
) full_result ) full_result
)))) ))))