1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00
inform7/inter/bytecode-module/Chapter 3/Verifying Inter.w

115 lines
5.1 KiB
OpenEdge ABL
Raw Normal View History

2019-02-05 02:44:07 +02:00
[Inter::Verify::] Verifying Inter.
Verifying that a chunk of inter is correct and consistent.
@ =
2019-07-24 20:15:07 +03:00
inter_error_message *Inter::Verify::defn(inter_package *owner, inter_tree_node *P, int index) {
2022-01-31 01:49:12 +02:00
inter_symbols_table *T = InterPackage::scope(owner);
2020-05-11 17:21:29 +03:00
if (T == NULL) T = Inode::globals(P);
2022-02-07 00:33:07 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID_not_following(T, P->W.instruction[index]);
2020-05-11 17:21:29 +03:00
if (S == NULL) return Inode::error(P, I"no symbol for ID (case 1)", NULL);
2022-01-04 01:40:23 +02:00
if (Wiring::is_wired(S)) {
inter_symbol *E = Wiring::cable_end(S);
LOG("This is $6 but $3 is wired to $3 in $6\n",
2022-01-31 01:49:12 +02:00
InterPackage::container(P), S, E, InterPackage::container(E->definition));
return Inode::error(P, I"symbol defined outside its native scope",
InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
}
if (InterSymbol::misc_but_undefined(S)) {
InterSymbol::define(S, P);
} else if (P != InterSymbol::definition(S)) {
LOG("So S ---> %S\n", InterSymbol::get_translate(S));
return Inode::error(P, I"duplicated symbol", InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
}
return NULL;
}
2019-07-24 20:15:07 +03:00
inter_error_message *Inter::Verify::local_defn(inter_tree_node *P, int index, inter_symbols_table *T) {
2022-02-03 17:51:44 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID(T, P->W.instruction[index]);
2020-05-11 17:21:29 +03:00
if (S == NULL) return Inode::error(P, I"no symbol for ID (case 2)", NULL);
2022-02-04 12:04:41 +02:00
if (InterSymbol::is_defined(S))
return Inode::error(P, I"duplicated local symbol", InterSymbol::identifier(S));
InterSymbol::define(S, P);
2019-02-05 02:44:07 +02:00
return NULL;
}
2020-07-01 02:58:55 +03:00
inter_error_message *Inter::Verify::symbol(inter_package *owner, inter_tree_node *P, inter_ti ID, inter_ti construct) {
2022-01-31 01:49:12 +02:00
inter_symbols_table *T = InterPackage::scope(owner);
2020-05-11 17:21:29 +03:00
if (T == NULL) T = Inode::globals(P);
2022-02-03 17:51:44 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID(T, ID);
2020-05-11 17:21:29 +03:00
if (S == NULL) return Inode::error(P, I"no symbol for ID (case 3)", NULL);
inter_tree_node *D = InterSymbol::definition(S);
2022-02-04 02:55:12 +02:00
if (InterSymbol::defined_elsewhere(S)) return NULL;
2022-02-04 12:04:41 +02:00
if (InterSymbol::misc_but_undefined(S)) return NULL;
if (D == NULL) return Inode::error(P, I"undefined symbol", InterSymbol::identifier(S));
2022-01-30 15:32:38 +02:00
if ((D->W.instruction[ID_IFLD] != construct) &&
2022-02-04 02:55:12 +02:00
(InterSymbol::defined_elsewhere(S) == FALSE) &&
2022-02-04 12:04:41 +02:00
(InterSymbol::misc_but_undefined(S) == FALSE)) {
return Inode::error(P, I"symbol of wrong type", InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
}
return NULL;
}
2020-07-01 02:58:55 +03:00
inter_error_message *Inter::Verify::global_symbol(inter_tree_node *P, inter_ti ID, inter_ti construct) {
2022-02-03 17:51:44 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID(Inode::globals(P), ID);
2020-05-11 17:21:29 +03:00
if (S == NULL) { internal_error("IO"); return Inode::error(P, I"3no symbol for ID", NULL); }
inter_tree_node *D = InterSymbol::definition(S);
2022-02-04 02:55:12 +02:00
if (InterSymbol::defined_elsewhere(S)) return NULL;
2022-02-04 12:04:41 +02:00
if (InterSymbol::misc_but_undefined(S)) return NULL;
if (D == NULL) return Inode::error(P, I"undefined symbol", InterSymbol::identifier(S));
2022-01-30 15:32:38 +02:00
if ((D->W.instruction[ID_IFLD] != construct) &&
2022-02-04 02:55:12 +02:00
(InterSymbol::defined_elsewhere(S) == FALSE) &&
2022-02-04 12:04:41 +02:00
(InterSymbol::misc_but_undefined(S) == FALSE)) {
return Inode::error(P, I"symbol of wrong type", InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
}
return NULL;
}
2020-07-01 02:58:55 +03:00
inter_error_message *Inter::Verify::local_symbol(inter_tree_node *P, inter_ti ID, inter_ti construct, inter_symbols_table *T) {
2022-02-03 17:51:44 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID(T, ID);
2020-05-11 17:21:29 +03:00
if (S == NULL) return Inode::error(P, I"4no symbol for ID", NULL);
inter_tree_node *D = InterSymbol::definition(S);
2022-02-04 02:55:12 +02:00
if (InterSymbol::defined_elsewhere(S)) return NULL;
2022-02-04 12:04:41 +02:00
if (InterSymbol::misc_but_undefined(S)) return NULL;
if (D == NULL) return Inode::error(P, I"undefined symbol", InterSymbol::identifier(S));
2022-01-30 15:32:38 +02:00
if ((D->W.instruction[ID_IFLD] != construct) &&
2022-02-04 02:55:12 +02:00
(InterSymbol::defined_elsewhere(S) == FALSE) &&
2022-02-04 12:04:41 +02:00
(InterSymbol::misc_but_undefined(S) == FALSE)) {
return Inode::error(P, I"symbol of wrong type", InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
}
return NULL;
}
2020-07-01 02:58:55 +03:00
inter_error_message *Inter::Verify::symbol_KOI(inter_package *owner, inter_tree_node *P, inter_ti ID) {
2022-01-31 01:49:12 +02:00
inter_symbols_table *T = InterPackage::scope(owner);
2020-05-11 17:21:29 +03:00
if (T == NULL) T = Inode::globals(P);
2022-02-03 17:51:44 +02:00
inter_symbol *S = InterSymbolsTable::symbol_from_ID(T, ID);
2020-05-11 17:21:29 +03:00
if (S == NULL) return Inode::error(P, I"5no symbol for ID", NULL);
inter_tree_node *D = InterSymbol::definition(S);
2022-02-04 02:55:12 +02:00
if (InterSymbol::defined_elsewhere(S)) return NULL;
2022-02-04 12:04:41 +02:00
if (InterSymbol::misc_but_undefined(S)) return NULL;
if (D == NULL) return Inode::error(P, I"undefined symbol", InterSymbol::identifier(S));
2022-01-30 15:32:38 +02:00
if ((D->W.instruction[ID_IFLD] != KIND_IST) &&
2022-02-04 02:55:12 +02:00
(InterSymbol::defined_elsewhere(S) == FALSE) &&
2022-01-30 15:32:38 +02:00
(D->W.instruction[ID_IFLD] != INSTANCE_IST) &&
(InterSymbol::misc_but_undefined(S) == FALSE))
return Inode::error(P, I"symbol of wrong type", InterSymbol::identifier(S));
2019-02-05 02:44:07 +02:00
return NULL;
}
2019-07-24 20:15:07 +03:00
inter_error_message *Inter::Verify::data_type(inter_tree_node *P, int index) {
2022-01-30 15:32:38 +02:00
inter_ti ID = P->W.instruction[index];
2019-02-05 02:44:07 +02:00
inter_data_type *idt = Inter::Types::find_by_ID(ID);
2020-05-11 17:21:29 +03:00
if (idt == NULL) return Inode::error(P, I"unknown data type", NULL);
2019-02-05 02:44:07 +02:00
return NULL;
}
void Inter::Verify::writer(OUTPUT_STREAM, char *format_string, void *vI) {
2019-07-24 20:15:07 +03:00
inter_tree_node *F = (inter_tree_node *) vI;
2019-02-05 02:44:07 +02:00
if (F == NULL) { WRITE("<no frame>"); return; }
2019-07-24 20:15:07 +03:00
WRITE("%05d -> ", F->W.index);
WRITE("%d {", F->W.extent);
2022-01-30 15:32:38 +02:00
for (int i=0; i<F->W.extent; i++) WRITE(" %08x", F->W.instruction[i]);
2019-02-05 02:44:07 +02:00
WRITE(" }");
}