1
0
mirror of https://github.com/ksherlock/x65.git synced 2024-12-29 10:30:32 +00:00

Adding error handling for flushing local labels

- Errors were ignored in a couple of places
This commit is contained in:
Carl-Henrik Skårstedt 2016-03-11 17:08:44 -08:00
parent 273bdcc92d
commit d9d386a260

23
x65.cpp
View File

@ -2677,7 +2677,9 @@ StatusCode Asm::EnterScope()
StatusCode Asm::ExitScope() StatusCode Asm::ExitScope()
{ {
CheckLateEval(strref(), CurrSection().GetPC()); CheckLateEval(strref(), CurrSection().GetPC());
FlushLocalLabels(scope_depth); StatusCode error = FlushLocalLabels(scope_depth);
if (error >= FIRST_ERROR)
return error;
FlushLabelPools(scope_depth); FlushLabelPools(scope_depth);
--scope_depth; --scope_depth;
if (scope_depth<0) if (scope_depth<0)
@ -2695,7 +2697,7 @@ StatusCode Asm::ExitScope()
StatusCode Asm::PushContext(strref src_name, strref src_file, strref code_seg, int rept) StatusCode Asm::PushContext(strref src_name, strref src_file, strref code_seg, int rept)
{ {
if (conditional_depth>=MAX_CONDITIONAL_DEPTH) if (conditional_depth>=(MAX_CONDITIONAL_DEPTH-1))
return ERROR_CONDITION_TOO_NESTED; return ERROR_CONDITION_TOO_NESTED;
conditional_depth++; conditional_depth++;
conditional_nesting[conditional_depth] = 0; conditional_nesting[conditional_depth] = 0;
@ -6150,8 +6152,11 @@ void Asm::Assemble(strref source, strref filename, bool obj_target)
if (contextStack.curr().complete()) if (contextStack.curr().complete())
error = PopContext(); error = PopContext();
else { else {
FlushLocalLabels(scope_depth); error = FlushLocalLabels(scope_depth);
if (error >= FIRST_ERROR)
break;
contextStack.curr().restart(); contextStack.curr().restart();
error = STATUS_OK;
} }
} }
if (error == STATUS_OK) { if (error == STATUS_OK) {
@ -6782,6 +6787,11 @@ StatusCode Asm::WriteA2GS_OMF(strref filename, bool full_collapse)
reloc_max = (int)s->pRelocs->size(); reloc_max = (int)s->pRelocs->size();
} }
} }
// reloc_max needs to greater than zero
if (reloc_max < 1)
return ERROR_ABORTED;
for (std::vector<int>::iterator i = SegNum.begin(); i != SegNum.end(); ++i) for (std::vector<int>::iterator i = SegNum.begin(); i != SegNum.end(); ++i)
SegLookup[*i] = (int)(&*i - &SegNum[0]); SegLookup[*i] = (int)(&*i - &SegNum[0]);
@ -6849,8 +6859,11 @@ StatusCode Asm::WriteA2GS_OMF(strref filename, bool full_collapse)
instructions[inst_curr++] = 0x80 | ((r->section_offset >> 8) - prev_page - 1); instructions[inst_curr++] = 0x80 | ((r->section_offset >> 8) - prev_page - 1);
count_offs = -1; count_offs = -1;
} // update patch counter for current page or add a new counter } // update patch counter for current page or add a new counter
if (count_offs < 0) { count_offs = inst_curr; instructions[inst_curr++] = 0; } if (count_offs < 0) {
else instructions[count_offs]++; count_offs = inst_curr;
instructions[inst_curr++] = 0;
} else
instructions[count_offs]++;
prev_page = r->section_offset>>8; prev_page = r->section_offset>>8;
instructions[inst_curr++] = (unsigned char)r->section_offset; // write patch offset into binary instructions[inst_curr++] = (unsigned char)r->section_offset; // write patch offset into binary
_writeNBytes(s.output + r->section_offset, b + 2, r->base_value); // patch binary with base value _writeNBytes(s.output + r->section_offset, b + 2, r->base_value); // patch binary with base value