Words which didn't compile cannot be run at all
							parent
							
								
									05f3f9dcb9
								
							
						
					
					
						commit
						f38d2f91f6
					
				| 
						 | 
				
			
			@ -62,18 +62,25 @@ SYMBOLS: +optimized+ +unoptimized+ ;
 | 
			
		|||
        } 1||
 | 
			
		||||
    ] [ error-type +compiler-warning+ eq? ] bi* and ;
 | 
			
		||||
 | 
			
		||||
: (fail) ( word -- * )
 | 
			
		||||
: (fail) ( word compiled -- * )
 | 
			
		||||
    swap
 | 
			
		||||
    [ compiled-unxref ]
 | 
			
		||||
    [ f swap compiled get set-at ]
 | 
			
		||||
    [ compiled get set-at ]
 | 
			
		||||
    [ +unoptimized+ save-compiled-status ]
 | 
			
		||||
    tri
 | 
			
		||||
    return ;
 | 
			
		||||
 | 
			
		||||
: not-compiled-def ( word error -- def )
 | 
			
		||||
    '[ _ _ not-compiled ] [ ] like ;
 | 
			
		||||
 | 
			
		||||
: fail ( word error -- * )
 | 
			
		||||
    [ 2dup ignore-error? [ drop f ] when swap compiler-error ] [ drop (fail) ] 2bi ;
 | 
			
		||||
    2dup ignore-error?
 | 
			
		||||
    [ drop f over def>> ]
 | 
			
		||||
    [ 2dup not-compiled-def ] if
 | 
			
		||||
    [ swap compiler-error ] [ (fail) ] bi-curry* bi ;
 | 
			
		||||
 | 
			
		||||
: frontend ( word -- nodes )
 | 
			
		||||
    dup contains-breakpoints? [ (fail) ] [
 | 
			
		||||
    dup contains-breakpoints? [ dup def>> (fail) ] [
 | 
			
		||||
        [ build-tree-from-word ] [ fail ] recover optimize-tree
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +131,7 @@ t compile-dependencies? set-global
 | 
			
		|||
    [ (compile) yield-hook get call( -- ) ] slurp-deque ;
 | 
			
		||||
 | 
			
		||||
: decompile ( word -- )
 | 
			
		||||
    f 2array 1array modify-code-heap ;
 | 
			
		||||
    dup def>> 2array 1array modify-code-heap ;
 | 
			
		||||
 | 
			
		||||
: compile-call ( quot -- )
 | 
			
		||||
    [ dup infer define-temp ] with-compilation-unit execute ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,3 +52,5 @@ T{ error-type
 | 
			
		|||
: compiler-error ( error word -- )
 | 
			
		||||
    compiler-errors get-global pick
 | 
			
		||||
    [ [ [ <compiler-error> ] keep ] dip set-at ] [ delete-at drop ] if ;
 | 
			
		||||
 | 
			
		||||
ERROR: not-compiled word error ;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,8 +45,8 @@ IN: compiler.tree.builder
 | 
			
		|||
    infer-quot-here ;
 | 
			
		||||
 | 
			
		||||
: check-effect ( word effect -- )
 | 
			
		||||
    over required-stack-effect 2dup effect<=
 | 
			
		||||
    [ 3drop ] [ effect-error ] if ;
 | 
			
		||||
    swap required-stack-effect 2dup effect<=
 | 
			
		||||
    [ 2drop ] [ effect-error ] if ;
 | 
			
		||||
 | 
			
		||||
: finish-word ( word -- )
 | 
			
		||||
    current-effect check-effect ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,9 +52,9 @@ TUPLE: missing-effect word ;
 | 
			
		|||
: missing-effect ( word -- * )
 | 
			
		||||
    pretty-word \ missing-effect inference-error ;
 | 
			
		||||
 | 
			
		||||
TUPLE: effect-error word inferred declared ;
 | 
			
		||||
TUPLE: effect-error inferred declared ;
 | 
			
		||||
 | 
			
		||||
: effect-error ( word inferred declared -- * )
 | 
			
		||||
: effect-error ( inferred declared -- * )
 | 
			
		||||
    \ effect-error inference-error ;
 | 
			
		||||
 | 
			
		||||
TUPLE: recursive-quotation-error quot ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,10 +40,7 @@ M: missing-effect summary
 | 
			
		|||
    ] "" make ;
 | 
			
		||||
 | 
			
		||||
M: effect-error summary
 | 
			
		||||
    [
 | 
			
		||||
        "Stack effect declaration of the word " %
 | 
			
		||||
        word>> name>> % " is wrong" %
 | 
			
		||||
    ] "" make ;
 | 
			
		||||
    drop "Stack effect declaration is wrong" ;
 | 
			
		||||
 | 
			
		||||
M: recursive-quotation-error error.
 | 
			
		||||
    "The quotation " write
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,4 +39,10 @@ M: source-file-error error.
 | 
			
		|||
 | 
			
		||||
: :warnings ( -- ) +compiler-warning+ compiler-errors. ;
 | 
			
		||||
 | 
			
		||||
: :linkage ( -- ) +linkage-error+ compiler-errors. ;
 | 
			
		||||
: :linkage ( -- ) +linkage-error+ compiler-errors. ;
 | 
			
		||||
 | 
			
		||||
M: not-compiled summary
 | 
			
		||||
    word>> name>> "The word " " cannot be executed because it failed to compile" surround ;
 | 
			
		||||
 | 
			
		||||
M: not-compiled error.
 | 
			
		||||
    [ summary print nl ] [ error>> error. ] bi ;
 | 
			
		||||
| 
						 | 
				
			
			@ -60,8 +60,8 @@ HELP: modify-code-heap ( alist -- )
 | 
			
		|||
{ $values { "alist" "an alist" } }
 | 
			
		||||
{ $description "Stores compiled code definitions in the code heap. The alist maps words to the following:"
 | 
			
		||||
{ $list
 | 
			
		||||
    { { $link f } " - in this case, the word is compiled with the non-optimizing compiler part of the VM." }
 | 
			
		||||
    { { $snippet "{ code labels rel words literals }" } " - in this case, a code heap block is allocated with the given data." }
 | 
			
		||||
    { "a quotation - in this case, the quotation is compiled with the non-optimizing compiler and the word will call the quotation when executed." }
 | 
			
		||||
    { { $snippet "{ code labels rel words literals }" } " - in this case, a code heap block is allocated with the given data and the word will call the code block when executed." }
 | 
			
		||||
} }
 | 
			
		||||
{ $notes "This word is called at the end of " { $link with-compilation-unit } "." } ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ IN: compiler.units.tests
 | 
			
		|||
 | 
			
		||||
! Non-optimizing compiler bugs
 | 
			
		||||
[ 1 1 ] [
 | 
			
		||||
    "A" "B" <word> [ [ 1 ] dip ] >>def dup f 2array 1array modify-code-heap
 | 
			
		||||
    "A" "B" <word> [ [ 1 ] dip ] 2array 1array modify-code-heap
 | 
			
		||||
    1 swap execute
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ SYMBOL: compiler-impl
 | 
			
		|||
HOOK: recompile compiler-impl ( words -- alist )
 | 
			
		||||
 | 
			
		||||
! Non-optimizing compiler
 | 
			
		||||
M: f recompile [ f ] { } map>assoc ;
 | 
			
		||||
M: f recompile [ dup def>> ] { } map>assoc ;
 | 
			
		||||
 | 
			
		||||
! Trivial compiler. We don't want to touch the code heap
 | 
			
		||||
! during stage1 bootstrap, it would just waste time.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,14 +21,16 @@ void set_word_code(F_WORD *word, F_CODE_BLOCK *compiled)
 | 
			
		|||
	word->optimizedp = T;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Allocates memory */
 | 
			
		||||
void default_word_code(F_WORD *word, bool relocate)
 | 
			
		||||
/* Compile a word definition with the non-optimizing compiler. Allocates memory */
 | 
			
		||||
void jit_compile_word(F_WORD *word, CELL def, bool relocate)
 | 
			
		||||
{
 | 
			
		||||
	REGISTER_ROOT(def);
 | 
			
		||||
	REGISTER_UNTAGGED(word);
 | 
			
		||||
	jit_compile(word->def,relocate);
 | 
			
		||||
	jit_compile(def,relocate);
 | 
			
		||||
	UNREGISTER_UNTAGGED(word);
 | 
			
		||||
	UNREGISTER_ROOT(def);
 | 
			
		||||
 | 
			
		||||
	word->code = untag_quotation(word->def)->code;
 | 
			
		||||
	word->code = untag_quotation(def)->code;
 | 
			
		||||
	word->optimizedp = F;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,15 +85,15 @@ void primitive_modify_code_heap(void)
 | 
			
		|||
 | 
			
		||||
		CELL data = array_nth(pair,1);
 | 
			
		||||
 | 
			
		||||
		if(data == F)
 | 
			
		||||
		if(type_of(data) == QUOTATION_TYPE)
 | 
			
		||||
		{
 | 
			
		||||
			REGISTER_UNTAGGED(alist);
 | 
			
		||||
			REGISTER_UNTAGGED(word);
 | 
			
		||||
			default_word_code(word,false);
 | 
			
		||||
			jit_compile_word(word,data,false);
 | 
			
		||||
			UNREGISTER_UNTAGGED(word);
 | 
			
		||||
			UNREGISTER_UNTAGGED(alist);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		else if(type_of(data) == ARRAY_TYPE)
 | 
			
		||||
		{
 | 
			
		||||
			F_ARRAY *compiled_code = untag_array(data);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -115,6 +117,8 @@ void primitive_modify_code_heap(void)
 | 
			
		|||
 | 
			
		||||
			set_word_code(word,compiled);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			critical_error("Expected a quotation or an array",data);
 | 
			
		||||
 | 
			
		||||
		REGISTER_UNTAGGED(alist);
 | 
			
		||||
		update_word_xt(word);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ void init_code_heap(CELL size);
 | 
			
		|||
 | 
			
		||||
bool in_code_heap_p(CELL ptr);
 | 
			
		||||
 | 
			
		||||
void default_word_code(F_WORD *word, bool relocate);
 | 
			
		||||
void jit_compile_word(F_WORD *word, CELL def, bool relocate);
 | 
			
		||||
 | 
			
		||||
void set_word_code(F_WORD *word, F_CODE_BLOCK *compiled);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -532,8 +532,7 @@ void compile_all_words(void)
 | 
			
		|||
	{
 | 
			
		||||
		F_WORD *word = untag_word(array_nth(untag_array(words),i));
 | 
			
		||||
		REGISTER_UNTAGGED(word);
 | 
			
		||||
		if(word->optimizedp == F)
 | 
			
		||||
			default_word_code(word,false);
 | 
			
		||||
		jit_compile_word(word,word->def,false);
 | 
			
		||||
		UNREGISTER_UNTAGGED(word);
 | 
			
		||||
		update_word_xt(word);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ F_WORD *allot_word(CELL vocab, CELL name)
 | 
			
		|||
	word->code = NULL;
 | 
			
		||||
 | 
			
		||||
	REGISTER_UNTAGGED(word);
 | 
			
		||||
	default_word_code(word,true);
 | 
			
		||||
	jit_compile_word(word,word->def,true);
 | 
			
		||||
	UNREGISTER_UNTAGGED(word);
 | 
			
		||||
 | 
			
		||||
	REGISTER_UNTAGGED(word);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue