2019-02-05 02:44:07 +02:00
|
|
|
[Inter::Packages::] Packages.
|
|
|
|
|
|
|
|
To manage packages of inter code.
|
|
|
|
|
|
|
|
@h Symbols tables.
|
|
|
|
|
|
|
|
=
|
|
|
|
typedef struct inter_package {
|
2019-07-22 02:01:18 +03:00
|
|
|
struct inter_tree *stored_in;
|
2019-02-05 02:44:07 +02:00
|
|
|
inter_t index_n;
|
|
|
|
struct inter_symbol *package_name;
|
|
|
|
struct inter_symbols_table *package_scope;
|
2019-07-22 02:01:18 +03:00
|
|
|
struct inter_package *mask_down;
|
2019-06-10 10:30:20 +03:00
|
|
|
int package_flags;
|
2019-02-05 02:44:07 +02:00
|
|
|
MEMORY_MANAGEMENT
|
|
|
|
} inter_package;
|
|
|
|
|
2019-06-10 10:30:20 +03:00
|
|
|
@
|
|
|
|
|
2019-07-13 16:48:27 +03:00
|
|
|
@d CODELIKE_PACKAGE_FLAG 1
|
2019-07-20 09:18:40 +03:00
|
|
|
@d LINKAGE_PACKAGE_FLAG 2
|
|
|
|
@d USED_PACKAGE_FLAG 4
|
2019-06-10 10:30:20 +03:00
|
|
|
|
2019-02-05 02:44:07 +02:00
|
|
|
@ =
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::new(inter_tree *I, inter_t n) {
|
2019-02-05 02:44:07 +02:00
|
|
|
inter_package *pack = CREATE(inter_package);
|
|
|
|
pack->stored_in = I;
|
|
|
|
pack->package_scope = NULL;
|
|
|
|
pack->package_name = NULL;
|
2019-06-10 10:30:20 +03:00
|
|
|
pack->package_flags = 0;
|
2019-07-22 02:01:18 +03:00
|
|
|
pack->mask_down = NULL;
|
2019-02-05 02:44:07 +02:00
|
|
|
pack->index_n = n;
|
|
|
|
return pack;
|
|
|
|
}
|
|
|
|
|
2019-07-13 16:48:27 +03:00
|
|
|
int Inter::Packages::is_codelike(inter_package *pack) {
|
|
|
|
if ((pack) && (pack->package_flags & CODELIKE_PACKAGE_FLAG)) return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Inter::Packages::make_codelike(inter_package *pack) {
|
|
|
|
if (pack) {
|
|
|
|
pack->package_flags |= CODELIKE_PACKAGE_FLAG;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-20 09:18:40 +03:00
|
|
|
int Inter::Packages::is_linklike(inter_package *pack) {
|
|
|
|
if ((pack) && (pack->package_flags & LINKAGE_PACKAGE_FLAG)) return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Inter::Packages::make_linklike(inter_package *pack) {
|
|
|
|
if (pack) {
|
|
|
|
pack->package_flags |= LINKAGE_PACKAGE_FLAG;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-13 16:48:27 +03:00
|
|
|
inter_package *Inter::Packages::parent(inter_package *pack) {
|
|
|
|
if (pack) {
|
|
|
|
inter_frame D = Inter::Symbols::defining_frame(pack->package_name);
|
|
|
|
inter_t P_index = Inter::Frame::get_parent_index(D);
|
|
|
|
if (P_index == 0) return NULL;
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_frame P = Inter::Warehouse::frame_from_index(Inter::Frame::warehouse(&D), P_index);
|
2019-07-13 16:48:27 +03:00
|
|
|
return Inter::Package::defined_by_frame(P);
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-07-13 16:17:48 +03:00
|
|
|
void Inter::Packages::unmark_all(void) {
|
|
|
|
inter_package *pack;
|
|
|
|
LOOP_OVER(pack, inter_package)
|
|
|
|
CodeGen::unmark(pack->package_name);
|
|
|
|
}
|
|
|
|
|
2019-02-05 02:44:07 +02:00
|
|
|
void Inter::Packages::set_scope(inter_package *P, inter_symbols_table *T) {
|
|
|
|
if (P == NULL) internal_error("null package");
|
|
|
|
P->package_scope = T;
|
|
|
|
if (T) T->owning_package = P;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Inter::Packages::set_name(inter_package *P, inter_symbol *N) {
|
|
|
|
if (P == NULL) internal_error("null package");
|
|
|
|
if (N == NULL) internal_error("null package name");
|
|
|
|
P->package_name = N;
|
|
|
|
if ((N) && (Str::eq(N->symbol_name, I"main"))) {
|
|
|
|
P->stored_in->main_package = P;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Inter::Packages::log(OUTPUT_STREAM, void *vp) {
|
|
|
|
inter_package *pack = (inter_package *) vp;
|
|
|
|
if (pack == NULL) WRITE("<null-package>");
|
|
|
|
else {
|
|
|
|
WRITE("%S", pack->package_name->symbol_name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::main(inter_tree *I) {
|
2019-02-05 02:44:07 +02:00
|
|
|
if (I) return I->main_package;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::basics(inter_tree *I) {
|
2019-04-07 12:54:25 +03:00
|
|
|
inter_symbol *S = Inter::Packages::search_main_exhaustively(I, I"basics");
|
|
|
|
if (S) return Inter::Package::which(S);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::veneer(inter_tree *I) {
|
2019-06-10 10:30:20 +03:00
|
|
|
inter_symbol *S = Inter::Packages::search_main_exhaustively(I, I"veneer");
|
|
|
|
if (S) return Inter::Package::which(S);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::template(inter_tree *I) {
|
2019-06-10 10:30:20 +03:00
|
|
|
inter_symbol *S = Inter::Packages::search_main_exhaustively(I, I"template");
|
|
|
|
if (S) return Inter::Package::which(S);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-02-05 02:44:07 +02:00
|
|
|
inter_symbol *Inter::Packages::search_exhaustively(inter_package *P, text_stream *S) {
|
|
|
|
inter_symbol *found = Inter::SymbolsTables::symbol_from_name(Inter::Packages::scope(P), S);
|
|
|
|
if (found) return found;
|
2019-07-13 16:17:48 +03:00
|
|
|
inter_frame D = Inter::Symbols::defining_frame(P->package_name);
|
|
|
|
LOOP_THROUGH_INTER_CHILDREN(C, D) {
|
|
|
|
if (C.data[ID_IFLD] == PACKAGE_IST) {
|
|
|
|
inter_package *Q = Inter::Package::defined_by_frame(C);
|
|
|
|
found = Inter::Packages::search_exhaustively(Q, S);
|
|
|
|
if (found) return found;
|
|
|
|
}
|
2019-02-05 02:44:07 +02:00
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_symbol *Inter::Packages::search_main_exhaustively(inter_tree *I, text_stream *S) {
|
2019-02-05 02:44:07 +02:00
|
|
|
return Inter::Packages::search_exhaustively(Inter::Packages::main(I), S);
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_symbol *Inter::Packages::search_resources_exhaustively(inter_tree *I, text_stream *S) {
|
2019-07-13 16:17:48 +03:00
|
|
|
inter_package *main_package = Inter::Packages::main(I);
|
|
|
|
if (main_package) {
|
|
|
|
inter_frame D = Inter::Symbols::defining_frame(main_package->package_name);
|
|
|
|
LOOP_THROUGH_INTER_CHILDREN(C, D) {
|
|
|
|
if (C.data[ID_IFLD] == PACKAGE_IST) {
|
|
|
|
inter_package *Q = Inter::Package::defined_by_frame(C);
|
|
|
|
inter_symbol *found = Inter::Packages::search_exhaustively(Q, S);
|
|
|
|
if (found) return found;
|
|
|
|
}
|
|
|
|
}
|
2019-04-23 01:29:02 +03:00
|
|
|
}
|
2019-04-08 11:03:53 +03:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-02-05 02:44:07 +02:00
|
|
|
inter_t Inter::Packages::to_PID(inter_package *P) {
|
|
|
|
if (P == NULL) return 0;
|
|
|
|
return P->index_n;
|
|
|
|
}
|
|
|
|
|
2019-07-22 02:01:18 +03:00
|
|
|
inter_package *Inter::Packages::from_PID(inter_tree *I, inter_t PID) {
|
2019-02-05 02:44:07 +02:00
|
|
|
if (PID == 0) return NULL;
|
|
|
|
return Inter::get_package(I, PID);
|
|
|
|
}
|
|
|
|
|
|
|
|
inter_package *Inter::Packages::container(inter_frame P) {
|
|
|
|
if (P.repo_segment == NULL) return NULL;
|
2019-07-22 02:01:18 +03:00
|
|
|
return Inter::Frame::ID_to_package(&P, Inter::Frame::get_package(P));
|
2019-02-05 02:44:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
inter_symbols_table *Inter::Packages::scope(inter_package *pack) {
|
|
|
|
if (pack == NULL) return NULL;
|
|
|
|
return pack->package_scope;
|
|
|
|
}
|
|
|
|
|
|
|
|
inter_symbols_table *Inter::Packages::scope_of(inter_frame P) {
|
|
|
|
inter_package *pack = Inter::Packages::container(P);
|
|
|
|
if (pack) return pack->package_scope;
|
2019-07-22 02:01:18 +03:00
|
|
|
return Inter::Frame::globals(&P);
|
2019-02-05 02:44:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
inter_symbol *Inter::Packages::type(inter_package *P) {
|
|
|
|
if (P == NULL) return NULL;
|
|
|
|
if (P->package_name == NULL) return NULL;
|
|
|
|
return Inter::Package::type(P->package_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Inter::Packages::baseline(inter_package *P) {
|
|
|
|
if (P == NULL) return 0;
|
|
|
|
if (P->package_name == NULL) return 0;
|
|
|
|
return Inter::Defn::get_level(Inter::Symbols::defining_frame(P->package_name));
|
|
|
|
}
|
2019-07-13 16:17:48 +03:00
|
|
|
|
|
|
|
text_stream *Inter::Packages::read_metadata(inter_package *P, text_stream *key) {
|
|
|
|
if (P == NULL) return NULL;
|
|
|
|
inter_symbol *found = Inter::SymbolsTables::symbol_from_name(Inter::Packages::scope(P), key);
|
|
|
|
if ((found) && (Inter::Symbols::is_defined(found))) {
|
|
|
|
inter_frame F = Inter::Symbols::defining_frame(found);
|
|
|
|
inter_t val2 = F.data[VAL1_MD_IFLD + 1];
|
|
|
|
return Inter::get_text(P->stored_in, val2);
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2019-07-20 09:18:40 +03:00
|
|
|
|
|
|
|
void Inter::Packages::wrap(inter_package *P) {
|
|
|
|
}
|
|
|
|
|