Skip to content

Instantly share code, notes, and snippets.

@pervognsen
Created March 24, 2017 09:01
Show Gist options
  • Select an option

  • Save pervognsen/21bc71829bc514628f1eaefdcd94bbbc to your computer and use it in GitHub Desktop.

Select an option

Save pervognsen/21bc71829bc514628f1eaefdcd94bbbc to your computer and use it in GitHub Desktop.
typedef struct {
char *address;
char *reference;
} label_t;
void emit_label_reference(label_t *label) {
if (label->address) {
emit4(label->address - emit_pointer);
} else {
char *reference = emit_pointer;
emit4(label->reference - emit_pointer);
label->reference = reference;
}
}
void resolve_label(label_t *label) {
char *address = emit_pointer;
label->address = address;
char *reference = label->reference;
while (reference) {
int32_t offset = *(int32_t *)reference;
*(int32_t *)reference = address - reference;
reference += offset;
}
label->reference = NULL;
}
// ...
if (token == TOKEN_IF) {
next_token();
label_t end = {0};
expr();
emit(BRZ);
label_t next = {0};
emit_label_reference(&next);
stmt_block();
while (token == TOKEN_ELSEIF) {
next_token();
emit(JMP);
emit_label_reference(&end);
resolve_label(&next);
expr();
emit(BRZ);
next.address = NULL;
emit_label_reference(&next);
stmt_block();
}
if (token == TOKEN_ELSE) {
next_token();
emit(JMP);
emit_label_reference(&end);
resolve_label(&next);
stmt_block();
}
resolve_label(&end);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment