ModulePtr staticModule(ObjectPtr x) { switch (x->objKind) { case TYPE : { Type *y = (Type *)x.ptr(); return typeModule(y); } case PRIM_OP : { return primitivesModule(); } case MODULE_HOLDER : { ModuleHolder *mh = (ModuleHolder *)x.ptr(); if (mh->import.ptr()) return mh->import->module; return NULL; } case GLOBAL_VARIABLE : case GLOBAL_ALIAS : case EXTERNAL_PROCEDURE : case EXTERNAL_VARIABLE : case PROCEDURE : case RECORD : case VARIANT : { TopLevelItem *t = (TopLevelItem *)x.ptr(); return envModule(t->env); } default : return NULL; } }
ModulePtr staticModule(ObjectPtr x) { switch (x->objKind) { case TYPE : { Type *y = (Type *)x.ptr(); return typeModule(y); } case PRIM_OP : { return primitivesModule(); } case MODULE : { return (Module*)x.ptr(); } case INTRINSIC : { return intrinsicsModule(); } case GLOBAL_VARIABLE : case GLOBAL_ALIAS : case EXTERNAL_PROCEDURE : case EXTERNAL_VARIABLE : case PROCEDURE : case RECORD_DECL : case VARIANT_DECL : { TopLevelItem *t = (TopLevelItem *)x.ptr(); return envModule(t->env); } default : return NULL; } }
static ModulePtr typeModule(TypePtr t) { switch (t->typeKind) { case BOOL_TYPE : case INTEGER_TYPE : case FLOAT_TYPE : case COMPLEX_TYPE : case POINTER_TYPE : case CODE_POINTER_TYPE : case CCODE_POINTER_TYPE : case ARRAY_TYPE : case VEC_TYPE : case TUPLE_TYPE : case UNION_TYPE : case STATIC_TYPE : return primitivesModule(); case RECORD_TYPE : { RecordType *rt = (RecordType *)t.ptr(); return envModule(rt->record->env); } case VARIANT_TYPE : { VariantType *vt = (VariantType *)t.ptr(); return envModule(vt->variant->env); } case ENUM_TYPE : { EnumType *et = (EnumType *)t.ptr(); return envModule(et->enumeration->env); } default : return NULL; } }