Reset CURRENT_SIZE to Size::Word before parsing a data directive

Previously, the following program:

	push.16 0
	data.16 0

... crashed fox32asm:

	thread 'main' panicked at 'internal error: entered unreachable code', src/main.rs:620:22
	stack backtrace:
	   0: rust_begin_unwind
		     at /usr/src/rustc-1.63.0/library/std/src/panicking.rs:584:5
	   1: core::panicking::panic_fmt
		     at /usr/src/rustc-1.63.0/library/core/src/panicking.rs:142:14
	   2: core::panicking::panic
		     at /usr/src/rustc-1.63.0/library/core/src/panicking.rs:48:5
	   3: fox32asm::parse_data
	   4: fox32asm::build_ast_from_expression
	   5: fox32asm::main
	note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

The issue in line 620 is that parse_data expects a constant in the form
of AstNode::Immediate32, but finds an AstNode::Immediate16, because
CURRENT_SIZE was previously set to Half. Set CURRENT_SIZE to Word when
starting to parse a new data directive, in order to fix this issue.

Fixes #4
This commit is contained in:
jn 2023-02-01 21:03:46 +01:00
parent abd160e6e5
commit e59e0ef83d

View File

@ -604,6 +604,7 @@ fn parse_label(pair: pest::iterators::Pair<Rule>, next_pair: Option<pest::iterat
fn parse_data(pair: pest::iterators::Pair<Rule>) -> AstNode { fn parse_data(pair: pest::iterators::Pair<Rule>) -> AstNode {
//println!("{:#?}", pair); //println!("{:#?}", pair);
*CURRENT_SIZE.lock().unwrap() = Size::Word;
match pair.as_rule() { match pair.as_rule() {
Rule::data_byte => { Rule::data_byte => {
match parse_operand(pair.into_inner().next().unwrap(), false) { match parse_operand(pair.into_inner().next().unwrap(), false) {