2 #ifndef HOBBES_LANG_TYPE_HPP_INCLUDED 3 #define HOBBES_LANG_TYPE_HPP_INCLUDED 20 class MonoTypeUnifier;
41 typedef std::shared_ptr<MonoType>
ptr;
43 virtual void show(std::ostream&)
const = 0;
53 template <
typename Class,
typename T,
typename ...
Args>
74 inline std::ostream&
operator<<(std::ostream&
out,
const MonoTypePtr& t) {
81 typedef std::shared_ptr<TEnv>
TEnvPtr;
91 TEnv(
const TEnvPtr& parent);
94 bool hasBinding(
const std::string& vname)
const;
95 bool hasImmediateBinding(
const std::string& vname)
const;
98 void bind(
const std::string& vname,
const PolyTypePtr&);
99 void bind(
const std::string& vname,
const QualTypePtr&);
100 void bind(
const std::string& vname,
const MonoTypePtr&);
101 void unbind(
const std::string& vname);
102 PolyTypePtr
lookup(
const std::string& vname)
const;
105 void bind(
const std::string& predName,
const UnqualifierPtr& uq);
106 UnqualifierPtr lookupUnqualifier(
const std::string& predName)
const;
107 UnqualifierPtr lookupUnqualifier(
const ConstraintPtr& cst)
const;
110 const TEnvPtr& parentTypeEnv()
const;
116 PolyTypeEnv typeEnvTable()
const;
120 const Unqualifiers& unqualifiers()
const;
128 void alias(
const std::string&,
const MonoTypePtr&);
129 MonoTypePtr
unalias(
const std::string&)
const;
130 bool isOpaqueTypeAlias(
const std::string&)
const;
137 TEnvPtr
bindFrame(
const TEnvPtr&,
const std::string&,
const MonoTypePtr&);
138 TEnvPtr
bindFrame(
const TEnvPtr&,
const std::string&,
const QualTypePtr&);
147 size_t n = std::min<size_t>(ns.size(), ts.size());
148 for (
size_t i = 0; i < n; ++i) {
157 bool satisfied(
const UnqualifierPtr&,
const TEnvPtr&,
const ConstraintPtr&, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
158 bool satisfied(
const TEnvPtr& tenv,
const ConstraintPtr& c, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
159 bool satisfied(
const TEnvPtr& tenv,
const Constraints& cs, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
160 bool satisfiable(
const UnqualifierPtr&,
const TEnvPtr&,
const ConstraintPtr&, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
161 bool satisfiable(
const TEnvPtr& tenv,
const ConstraintPtr& c, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
162 bool satisfiable(
const TEnvPtr& tenv,
const Constraints& cs, std::vector<
std::pair<std::string, std::shared_ptr<Expr> > >*);
167 PolyType(
int vs,
const QualTypePtr& qt);
170 int typeVariables()
const;
173 void show(std::ostream&)
const;
177 const QualTypePtr&
qualtype()
const;
191 QualType(
const Constraints& cs,
const MonoTypePtr& mt);
194 const Constraints& constraints()
const;
195 const MonoTypePtr& monoType()
const;
197 Constraints& constraints();
198 void monoType(
const MonoTypePtr&);
200 void show(std::ostream&)
const;
215 Constraint(
const std::string& cat,
const MonoTypes& mts);
218 std::string name()
const;
221 const MonoTypes& arguments()
const;
224 ConstraintPtr
instantiate(
const MonoTypes& ts)
const;
226 ConstraintPtr
substitute(
const MonoTypeSubst& s)
const;
232 void show(std::ostream&)
const;
242 enum { Unresolved, Satisfied, Unsatisfiable }
state;
245 inline std::ostream&
operator<<(std::ostream&
out,
const ConstraintPtr& t) {
251 template <
typename Case>
262 void show(std::ostream&
out)
const;
264 const std::string& name()
const;
265 const MonoTypePtr& representation()
const;
267 static const int type_case_id = 0;
269 static MonoTypePtr
make(
const std::string&,
const MonoTypePtr& t =
MonoTypePtr());
275 Prim(
const std::string&,
const MonoTypePtr&);
281 void show(std::ostream& out)
const;
283 const std::string& name()
const;
284 unsigned int size()
const;
285 bool storedContiguously()
const;
287 static const int type_case_id = 1;
289 static MonoTypePtr
make(
const std::string& nm,
unsigned int sz,
bool scontig =
false);
296 OpaquePtr(
const std::string&,
unsigned int,
bool);
305 const std::string& name()
const;
306 void show(std::ostream& out)
const;
308 static const int type_case_id = 2;
310 static MonoTypePtr
make(
const std::string&);
315 TVar(
const std::string&);
322 void show(std::ostream& out)
const;
324 static const int type_case_id = 3;
326 static MonoTypePtr
make(
int);
337 void show(std::ostream& out)
const;
339 const MonoTypePtr& type()
const;
340 const MonoTypePtr& length()
const;
342 long requireLength()
const;
344 static const int type_case_id = 4;
346 static MonoTypePtr
make(
const MonoTypePtr& ty,
const MonoTypePtr& len);
352 FixedArray(
const MonoTypePtr&,
const MonoTypePtr&);
358 void show(std::ostream& out)
const;
360 const MonoTypePtr& type()
const;
362 static const int type_case_id = 5;
364 static MonoTypePtr
make(
const MonoTypePtr&);
369 Array(
const MonoTypePtr&);
376 Member(
const std::string& selector,
const MonoTypePtr& type,
unsigned int id);
379 bool operator<(
const Member&)
const;
387 void show(std::ostream& out)
const;
391 Member headMember()
const;
392 MonoTypePtr tailType()
const;
394 const Members& members()
const;
395 const MonoTypePtr& payload(
const std::string& selector)
const;
396 unsigned int index(
const std::string& selector)
const;
397 unsigned int id(
const std::string& selector)
const;
398 const Member* mmember(
const std::string& selector)
const;
406 unsigned int payloadOffset()
const;
407 unsigned int payloadSize()
const;
408 unsigned int size()
const;
410 static const int type_case_id = 6;
412 static MonoTypePtr
make(
const Members&);
413 static MonoTypePtr
make(
const MonoTypePtr& hty,
const Members& tty);
414 static MonoTypePtr
make(
const std::string& lbl,
const MonoTypePtr& hty,
const Members& tty);
429 bool operator<(
const Member&)
const;
437 void show(std::ostream& out)
const;
439 const Members& members()
const;
440 const MonoTypePtr& member(
const std::string& mn)
const;
441 unsigned int index(
const std::string& mn)
const;
442 const Member* mmember(
const std::string& mn)
const;
446 Member headMember()
const;
447 MonoTypePtr tailType()
const;
450 const Members& alignedMembers()
const;
451 unsigned int alignedIndex(
const std::string& mn)
const;
454 unsigned int size()
const;
457 bool isTuple()
const;
460 static Members withExplicitPadding(
const Members&,
const std::string& pfx =
".p");
462 static const int type_case_id = 7;
468 unsigned int maxFieldAlignment()
const;
470 static void showRecord(std::ostream&,
const Members&);
471 static std::string showRecord(
const Members&);
473 unsigned int index(
const Members& ms,
const std::string& mn)
const;
476 static Members withResolvedMemoryLayout(
const Members&);
479 static MonoTypePtr
make(
const Members& ms);
480 static MonoTypePtr
make(
const MonoTypePtr& hty,
const Members& tty);
481 static MonoTypePtr
make(
const std::string& lbl,
const MonoTypePtr& hty,
const Members& tty);
484 Record(
const Members& ms);
488 unsigned int alignment(
const MonoTypePtr&);
493 void show(std::ostream& out)
const;
495 const MonoTypePtr& argument()
const;
496 const MonoTypePtr&
result()
const;
499 MonoTypes parameters()
const;
501 static const int type_case_id = 8;
503 static MonoTypePtr
make(
const MonoTypePtr&,
const MonoTypePtr&);
509 Func(
const MonoTypePtr&,
const MonoTypePtr&);
515 void show(std::ostream& out)
const;
517 const std::string& absTypeName()
const;
518 const MonoTypePtr& absType()
const;
520 static const int type_case_id = 9;
522 static MonoTypePtr
make(
const std::string& tname,
const MonoTypePtr& bty);
528 Exists(
const std::string& tname,
const MonoTypePtr& bty);
539 void show(std::ostream& out)
const;
541 const std::string& value()
const;
543 static const int type_case_id = 10;
545 static MonoTypePtr
make(
const std::string&);
555 void show(std::ostream& out)
const;
559 static const int type_case_id = 11;
561 static MonoTypePtr
make(
long);
572 void show(std::ostream&)
const;
575 const MonoTypePtr& body()
const;
577 static const int type_case_id = 15;
579 static MonoTypePtr
make(
const str::seq&,
const MonoTypePtr&);
591 void show(std::ostream&)
const;
593 const MonoTypePtr&
fn()
const;
594 const MonoTypes& args()
const;
596 static const int type_case_id = 12;
598 static MonoTypePtr
make(
const MonoTypePtr&,
const MonoTypes&);
604 TApp(
const MonoTypePtr&,
const MonoTypes&);
610 void show(std::ostream&)
const;
612 const std::string& recTypeName()
const;
613 const MonoTypePtr& recType()
const;
615 static const int type_case_id = 13;
617 static MonoTypePtr
make(
const std::string&,
const MonoTypePtr&);
623 Recursive(
const std::string& tname,
const MonoTypePtr& bty);
629 typedef std::shared_ptr<Expr>
ExprPtr;
633 void show(std::ostream&)
const;
635 const ExprPtr& expr()
const;
637 static const int type_case_id = 14;
639 static MonoTypePtr
make(
const ExprPtr&);
644 TExpr(
const ExprPtr&);
647 template <
typename Case>
654 std::string
show(
const PolyTypePtr& e);
657 std::string
show(
const QualTypePtr& e);
660 std::string
show(
const ConstraintPtr& e);
663 std::string
show(
const MonoTypePtr& e);
682 template <
typename T>
684 virtual T with(
const Prim* v)
const = 0;
685 virtual T with(
const OpaquePtr* v)
const = 0;
686 virtual T with(
const TVar* v)
const = 0;
687 virtual T with(
const TGen* v)
const = 0;
688 virtual T with(
const TAbs* v)
const = 0;
689 virtual T with(
const TApp* v)
const = 0;
690 virtual T with(
const FixedArray* v)
const = 0;
691 virtual T with(
const Array* v)
const = 0;
692 virtual T with(
const Variant* v)
const = 0;
693 virtual T with(
const Record* v)
const = 0;
694 virtual T with(
const Func* v)
const = 0;
695 virtual T with(
const Exists* v)
const = 0;
696 virtual T with(
const Recursive* v)
const = 0;
698 virtual T with(
const TString* v)
const = 0;
699 virtual T with(
const TLong* v)
const = 0;
701 virtual T with(
const TExpr*)
const = 0;
705 template <
typename T>
712 template <
typename T>
718 template <
typename T,
typename Ptr,
typename PtrC,
typename F>
720 typedef typename PtrC::template as<Prim>::ty PrimT;
721 typedef typename PtrC::template as<OpaquePtr>::ty OpaquePtrT;
722 typedef typename PtrC::template as<TVar>::ty TVarT;
723 typedef typename PtrC::template as<TGen>::ty TGenT;
724 typedef typename PtrC::template as<TAbs>::ty TAbsT;
725 typedef typename PtrC::template as<TApp>::ty TAppT;
726 typedef typename PtrC::template as<FixedArray>::ty FixedArrayT;
727 typedef typename PtrC::template as<Array>::ty ArrayT;
728 typedef typename PtrC::template as<Variant>::ty VariantT;
729 typedef typename PtrC::template as<Record>::ty RecordT;
730 typedef typename PtrC::template as<Func>::ty FuncT;
731 typedef typename PtrC::template as<Exists>::ty ExistsT;
732 typedef typename PtrC::template as<Recursive>::ty RecursiveT;
733 typedef typename PtrC::template as<TString>::ty TStringT;
734 typedef typename PtrC::template as<TLong>::ty TLongT;
735 typedef typename PtrC::template as<TExpr>::ty TExprT;
737 switch (ty->case_id()) {
738 case Prim::type_case_id:
739 return f.with((PrimT)ty);
740 case OpaquePtr::type_case_id:
741 return f.with((OpaquePtrT)ty);
742 case TVar::type_case_id:
743 return f.with((TVarT)ty);
744 case TGen::type_case_id:
745 return f.with((TGenT)ty);
746 case TAbs::type_case_id:
747 return f.with((TAbsT)ty);
748 case TApp::type_case_id:
749 return f.with((TAppT)ty);
750 case FixedArray::type_case_id:
751 return f.with((FixedArrayT)ty);
752 case Array::type_case_id:
753 return f.with((ArrayT)ty);
754 case Variant::type_case_id:
755 return f.with((VariantT)ty);
756 case Record::type_case_id:
757 return f.with((RecordT)ty);
758 case Func::type_case_id:
759 return f.with((FuncT)ty);
760 case Exists::type_case_id:
761 return f.with((ExistsT)ty);
762 case Recursive::type_case_id:
763 return f.with((RecursiveT)ty);
764 case TString::type_case_id:
765 return f.with((TStringT)ty);
766 case TLong::type_case_id:
767 return f.with((TLongT)ty);
768 case TExpr::type_case_id:
769 return f.with((TExprT)ty);
771 throw std::runtime_error(
"Internal error, cannot switch on unknown type: " +
show(ty));
775 template <
typename T>
777 return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(&ty, f);
780 template <
typename T>
782 return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
785 template <
typename T>
788 for (MonoTypes::const_iterator t = ts.begin(); t != ts.end(); ++t) {
794 template <
typename T>
796 for (MonoTypes::const_iterator t = ts.begin(); t != ts.end(); ++t) {
802 template <
typename K,
typename T>
803 std::vector< std::pair<K, T> >
switchOf(
const std::vector< std::pair<K, MonoTypePtr> >& kts,
const switchType<T>& f) {
804 typedef std::pair<K, T> KT;
805 typedef std::vector<KT> KTS;
807 for (
typename std::vector< std::pair<K, MonoTypePtr> >::const_iterator kt = kts.begin(); kt != kts.end(); ++kt) {
808 r.push_back(KT(kt->first,
switchOf(kt->second, f)));
813 template <
typename T>
816 for (Variant::Members::const_iterator
m = ms.begin();
m != ms.end(); ++
m) {
822 template <
typename T>
825 for (Record::Members::const_iterator
m = ms.begin();
m != ms.end(); ++
m) {
833 for (Variant::Members::const_iterator
m = ms.begin();
m != ms.end(); ++
m) {
834 r.push_back(
m->type);
841 for (
const auto&
m : ms) {
842 r.push_back(
m.selector);
849 for (Record::Members::const_iterator
m = ms.begin();
m != ms.end(); ++
m) {
850 r.push_back(
m->type);
857 for (
const auto&
m : ms) {
858 r.push_back(
m.field);
885 MonoTypePtr with(
const Prim* v)
const;
886 MonoTypePtr with(
const OpaquePtr* v)
const;
887 MonoTypePtr with(
const TVar* v)
const;
888 MonoTypePtr with(
const TGen* v)
const;
889 MonoTypePtr with(
const TAbs* v)
const;
890 MonoTypePtr with(
const TApp* v)
const;
892 MonoTypePtr with(
const Array* v)
const;
893 MonoTypePtr with(
const Variant* v)
const;
894 MonoTypePtr with(
const Record* v)
const;
895 MonoTypePtr with(
const Func* v)
const;
896 MonoTypePtr with(
const Exists* v)
const;
897 MonoTypePtr with(
const Recursive* v)
const;
900 MonoTypePtr with(
const TString* v)
const;
901 MonoTypePtr with(
const TLong* v)
const;
904 MonoTypePtr with(
const TExpr*)
const;
907 MonoTypePtr
clone(
const MonoTypePtr&);
911 QualTypePtr
cloneP(
const QualTypePtr& p);
912 MonoTypePtr
cloneP(
const MonoTypePtr& p);
915 QualTypePtr
lookupFieldType(
const QualTypePtr& qt,
const std::string& fieldName);
916 MonoTypePtr
lookupFieldType(
const MonoTypePtr& mt,
const std::string& fieldName);
919 Constraints
mergeConstraints(
const Constraints& lhs,
const Constraints& rhs);
923 MonoTypes
tgens(
int vs);
924 int tgenSize(
const MonoTypePtr& mt);
926 int tgenSize(
const Constraints& cs);
927 int tgenSize(
const ConstraintPtr& c);
928 int tgenSize(
const QualTypePtr& qt);
931 TGenVarSet
tgenVars(
const MonoTypePtr&);
939 MonoTypes
typeVars(
const Names& ns);
941 MonoTypes
freshen(
const MonoTypes&);
942 ConstraintPtr
freshen(
const ConstraintPtr&);
943 Constraints
freshen(
const Constraints& cs);
945 QualTypePtr
instantiate(
int vs,
const QualTypePtr& scheme);
946 Constraints
instantiate(
int vs,
const Constraints& cs);
947 ConstraintPtr
instantiate(
int vs,
const ConstraintPtr& c);
948 MonoTypePtr
instantiate(
int vs,
const MonoTypePtr& mt);
949 MonoTypes
instantiate(
int vs,
const MonoTypes& ts);
950 QualTypePtr
instantiate(
const Names& ns,
const QualTypePtr& scheme);
951 Constraints
instantiate(
const Names& ns,
const Constraints& cs);
952 ConstraintPtr
instantiate(
const Names& ns,
const ConstraintPtr& c);
953 MonoTypePtr
instantiate(
const Names& ns,
const MonoTypePtr& mt);
954 MonoTypes
instantiate(
const Names& ns,
const MonoTypes& ts);
955 QualTypePtr
instantiate(
const MonoTypes& ts,
const QualTypePtr& scheme);
956 Constraints
instantiate(
const MonoTypes& ts,
const Constraints& cs);
957 ConstraintPtr
instantiate(
const MonoTypes& ts,
const ConstraintPtr& c);
958 MonoTypePtr
instantiate(
const MonoTypes& ts,
const MonoTypePtr& mt);
959 MonoTypes
instantiate(
const MonoTypes& ts,
const MonoTypes& sts);
961 NameSet
tvarNames(
const QualTypePtr& qt);
962 NameSet
tvarNames(
const Constraints& cs);
963 NameSet
tvarNames(
const ConstraintPtr& c);
964 NameSet
tvarNames(
const MonoTypePtr& mt);
967 void tvarNames(
const QualTypePtr& qt, NameSet* out);
968 void tvarNames(
const Constraints& cs, NameSet* out);
969 void tvarNames(
const ConstraintPtr& c, NameSet* out);
970 void tvarNames(
const MonoTypePtr& mt, NameSet* out);
972 void tvarNames(
const MonoTypes& mts, NameSet* out);
983 void show(
const MonoTypeSubst& s, std::ostream& out);
984 std::string
show(
const MonoTypeSubst& s);
986 QualTypePtr
substitute(
const MonoTypeSubst& s,
const QualTypePtr& qt);
987 Constraints
substitute(
const MonoTypeSubst& s,
const Constraints& cs);
988 ConstraintPtr
substitute(
const MonoTypeSubst& s,
const ConstraintPtr& p);
990 MonoTypePtr
substitute(
const MonoTypeSubst& s,
const MonoTypePtr& mt);
991 MonoTypes
substitute(
const MonoTypeSubst& s,
const MonoTypes& ts);
993 MonoTypePtr
substituteStep(
const MonoTypeSubst& s,
const MonoTypePtr& mt);
995 PolyTypePtr
generalize(
const QualTypePtr& qt);
1012 inline MonoTypePtr
primty(
const char* x,
const MonoTypePtr& aty) {
1016 inline QualTypePtr
qualtype(
const Constraints& cs,
const MonoTypePtr& p) {
1036 inline PolyTypePtr
polytype(
int tvs,
const QualTypePtr& qt) {
1060 inline MonoTypePtr
tvar(
const std::string& vn) {
1064 inline MonoTypePtr
tstring(
const std::string& x) {
1069 if (mtys.size() == 0) {
1073 for (
unsigned int i = 0; i < mtys.size(); ++i) {
1080 inline MonoTypePtr
sumtype(
const MonoTypePtr& t0,
const MonoTypePtr& t1) {
1087 inline MonoTypePtr
maybety(
const MonoTypePtr& t) {
1091 inline MonoTypePtr
isMaybe(
const MonoTypePtr& t) {
1092 if (
const Variant* vt = is<Variant>(t)) {
1094 if (ms.size() == 2 && ms[0].selector ==
".f0" && ms[1].selector ==
".f1" && ms[0].type ==
primty(
"unit")) {
1101 inline MonoTypePtr
tstrings(
const std::vector<std::string>& xs) {
1103 for (
const auto& x : xs) {
1109 inline MonoTypePtr
functy(
const MonoTypePtr& aty,
const MonoTypePtr& rty) {
1113 inline MonoTypePtr
functy(
const MonoTypes& atys,
const MonoTypePtr& rty) {
1114 if (atys.size() == 0) {
1121 inline MonoTypePtr
closty(
const MonoTypePtr& aty,
const MonoTypePtr& rty) {
1125 inline MonoTypePtr
closty(
const MonoTypes& atys,
const MonoTypePtr& rty) {
1133 inline MonoTypePtr
tapp(
const MonoTypePtr& f,
const MonoTypes& args) {
1141 inline MonoTypePtr
texpr(
const ExprPtr& x) {
1155 inline MonoTypePtr
arrayty(
const MonoTypePtr& ty,
size_t n) {
1159 inline MonoTypePtr
arrayty(
const MonoTypePtr& ty) {
1163 template <
typename T>
1165 return OpaquePtr::make(str::demangle<T>(), insertcontig ?
sizeof(T) : 0, insertcontig);
1169 if (
Prim* pt = is<Prim>(t)) {
1170 return pt->name() ==
"void";
1177 unsigned int sizeOf(
const MonoTypePtr& mt);
1183 }
catch (std::exception&) {
1192 MonoTypePtr
unroll(
const MonoTypePtr&);
1195 void encode(
const QualTypePtr&, std::ostream&);
1196 void encode(
const MonoTypePtr&, std::ostream&);
1198 void decode(QualTypePtr*, std::istream&);
1199 void decode(MonoTypePtr*, std::istream&);
1201 void encode(
const QualTypePtr&, std::vector<unsigned char>*);
1202 void encode(
const MonoTypePtr&, std::vector<unsigned char>*);
1203 MonoTypePtr
decode(
const std::vector<unsigned char>&
in);
1204 MonoTypePtr
decode(
const unsigned char* b,
const unsigned char* e);
1207 MonoTypePtr
unalias(
const MonoTypePtr&);
1210 template <
typename ... Xs>
1216 template <
typename ... Xs>
1224 template <
typename ... Xs>
1234 if (
const Func* f = is<Func>(fty)) {
1236 }
else if (
const TApp* fa = is<TApp>(fty)) {
1237 if (
const Prim*
fn = is<Prim>(fa->fn())) {
1238 if (
fn->name() ==
"->" && fa->args().size() == 2) {
1239 return fa->args()[1];
1244 throw std::runtime_error(
"Expected function type: " +
show(fty));
1253 typedef std::tuple<std::string, MonoTypePtr, unsigned int> RMTup;
1261 typedef std::tuple<std::string, MonoTypePtr, unsigned int> VMTup;
1269 static std::hash<void*> h;
1270 return h((
void*)x.get());
std::string nm
Definition: type.H:312
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
Definition: tyunqualify.H:20
MonoTypePtr rty
Definition: type.H:506
std::vector< TVName > Names
Definition: type.H:141
MonoTypePtr substituteStep(const MonoTypeSubst &s, const MonoTypePtr &mt)
Definition: type.C:1983
virtual void show(std::ostream &) const =0
MonoTypePtr clone(const MonoType &)
Definition: type.C:1552
bool hasFreeVariables(const MonoTypes &)
Definition: type.C:1879
TEnvPtr bindFrame(const TEnvPtr &, const std::string &, const MonoTypePtr &)
Definition: type.C:273
MonoTypePtr ty
Definition: type.H:366
int tgenSize(const QualTypePtr &qt)
Definition: type.C:1695
int vs
Definition: type.H:179
std::vector< Member > Members
Definition: type.H:385
PolyTypePtr generalize(const QualTypePtr &qt)
Definition: type.C:2016
std::string showNoSimpl(const MonoTypePtr &e)
Definition: type.C:69
MonoTypePtr functy(const MonoTypes &atys, const MonoTypePtr &rty)
Definition: type.H:1113
MonoTypePtr primty(const char *x, const MonoTypePtr &aty)
Definition: type.H:1012
ExprPtr field(MDFA *dfa, const std::string &vn, const std::string &fn)
Definition: dfa.C:183
MonoTypes substitute(const MonoTypeSubst &s, const MonoTypes &ts)
Definition: type.C:2007
std::set< std::string > TypeVarNames
Definition: type.H:60
MonoTypePtr arrayty(const MonoTypePtr &ty)
Definition: type.H:1159
size_t operator()(const Variant::Member &x) const
Definition: type.H:1260
std::set< TVName > NameSet
Definition: type.H:142
MonoTypePtr tgen(int i)
Definition: type.H:1056
MonoTypes tgens(int vs)
Definition: type.C:1661
void mergeConstraints(const Constraints &fcs, Constraints *tcs)
Definition: type.C:1588
MonoTypes typeVars(const Names &ns)
Definition: type.C:1653
Names freshNames(int vs)
Definition: type.C:1604
MonoTypePtr type
Definition: type.H:432
MonoTypePtr opaqueptr(bool insertcontig)
Definition: type.H:1164
Definition: tyunqualify.H:48
const T * ty
Definition: type.H:707
std::string field
Definition: type.H:431
unsigned int sizeOf(const MonoTypePtr &mt)
Definition: type.C:2190
MonoTypes freshTypeVars(int vs)
Definition: type.C:1616
bool satisfied(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
MonoTypePtr aty
Definition: type.H:505
bool isPrimName(const std::string &tn)
Definition: type.C:2197
std::map< std::string, MonoTypePtr > TypeAliases
Definition: type.H:132
MonoTypePtr bty
Definition: type.H:525
bool satisfiable(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
std::pair< std::string, std::string > pair
Definition: str.H:220
T * make(const Args &... args)
Definition: hobbes.H:60
void compactMTypeMemory()
Definition: type.C:595
str::seq targns
Definition: type.H:581
std::map< std::string, UnqualifierPtr > Unqualifiers
Definition: type.H:119
str::seq selectNames(const Variant::Members &ms)
Definition: type.H:839
MonoTypePtr f
Definition: type.H:600
void encode(const MonoTypePtr &, std::vector< unsigned char > *)
Definition: type.C:2516
bool isVoid(const MonoTypePtr &t)
Definition: type.H:1168
std::string from(const T &x)
Definition: str.H:101
QualTypePtr qualtype(const Constraints &cs, const MonoTypePtr &p)
Definition: type.H:1016
bool isMonoSingular(const QualTypePtr &)
Definition: type.C:1674
NameSet tvarNames(const ExprPtr &)
Definition: expr.C:1383
MonoTypePtr unroll(const MonoTypePtr &)
Definition: type.C:2217
MonoTypes mts
Definition: type.H:239
TVName canonicalName(int v)
Definition: type.C:2032
MonoTypePtr len
Definition: type.H:349
llvm::Value * offset(llvm::IRBuilder<> *b, llvm::Value *p, llvm::Value *o0)
Definition: llvm.H:419
MonoTypePtr bty
Definition: type.H:620
TEnvPtr fnFrame(const TEnvPtr &, const str::seq &, const MonoTypes &)
Definition: type.C:264
std::vector< QualTypePtr > QualTypes
Definition: type.H:30
size_t operator()(const Record::Member &x) const
Definition: type.H:1252
bool isFreeVarNameIn(const TVName &, const MonoTypes &)
Definition: type.C:1848
MonoTypePtr texpr(const ExprPtr &x)
Definition: type.H:1141
MonoTypePtr tstring(const std::string &x)
Definition: type.H:1064
int index(const std::vector< T > &xs, T x)
Definition: array.H:63
MonoType::ptr MonoTypePtr
Definition: type.H:71
std::ostream & operator<<(std::ostream &out, const array< char > *x)
Definition: hobbes.H:38
MonoTypePtr maybety(const MonoTypePtr &t)
Definition: type.H:1087
ExprPtr substitute(const VarMapping &vm, const ExprPtr &e, bool *mapped=0)
Definition: expr.C:968
static void accum(Record::Members *)
Definition: type.H:1212
virtual ~MonoType()
Definition: type.C:491
int x
Definition: type.H:328
MonoTypePtr type
Definition: type.H:382
std::string nm
Definition: type.H:271
static ptr makeType(const Args &... args)
MonoTypePtr lookupFieldType(const MonoTypePtr &mt, const std::string &fieldName)
Definition: type.C:1570
MonoTypePtr closty(const MonoTypes &atys, const MonoTypePtr &rty)
Definition: type.H:1125
long x
Definition: type.H:563
bool isMonotype(const PolyTypePtr &pt)
Definition: type.C:2245
PolyTypePtr polytype(const char *x)
Definition: type.H:1052
Members ms
Definition: type.H:464
std::string tname
Definition: type.H:619
std::set< int > TGenVarSet
Definition: type.H:930
MonoTypePtr fnresult(const MonoTypePtr &fty)
Definition: type.H:1233
int case_id() const
Definition: type.C:490
UnqualifierSetPtr unquals
Definition: type.H:123
bool operator==(const MonoType &rhs) const
Definition: type.C:493
MonoTypePtr tabs(const str::seq &tns, const MonoTypePtr &body)
Definition: type.H:1129
MonoTypes simplifyVarNames(const MonoTypes &mts)
Definition: type.C:2064
bool scontig
Definition: type.H:293
std::vector< T > cons(T h, std::vector< T > t)
Definition: array.H:286
Members ms
Definition: type.H:416
std::shared_ptr< Unqualifier > UnqualifierPtr
Definition: type.H:83
MonoTypePtr t
Definition: type.H:272
MonoTypes instantiate(const MonoTypes &ts, const MonoTypes &sts)
Definition: type.C:1763
std::vector< ConstraintPtr > Constraints
Definition: type.H:35
int tgenCount
Definition: type.H:62
MonoTypePtr tlong(long x)
Definition: type.H:1137
MonoType(int cid)
Definition: type.C:489
void tvarNames(const MonoTypes &mts, NameSet *out)
Definition: type.C:1838
ptr unaliasedType
Definition: type.H:68
std::string selector
Definition: type.H:381
std::map< std::string, PolyTypePtr > PolyTypeEnv
Definition: type.H:114
unsigned int sz
Definition: type.H:292
std::vector< PolyTypePtr > PolyTypes
Definition: type.H:25
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
TypeVarNames freeTVars
Definition: type.H:61
unsigned int payloadSizeM
Definition: type.H:404
std::vector< T > list()
Definition: array.H:25
MonoTypePtr ty
Definition: type.H:348
MonoTypeCase()
Definition: type.H:648
MonoTypePtr tvar(const std::string &vn)
Definition: type.H:1060
PolyTypeEnv ptenv
Definition: type.H:124
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
TypeAliases typeAliases
Definition: type.H:133
QualTypePtr instantiate(int vs, const QualTypePtr &scheme)
Definition: type.C:1722
int cid
Definition: type.H:56
MonoTypeSubst substitution(const str::seq &ns, const MonoTypes &ts)
Definition: type.H:145
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
std::vector< std::string > seq
Definition: str.H:19
uint32_t state
Definition: regex.C:372
MonoTypePtr freshTypeVar()
Definition: type.C:1612
T * ty
Definition: type.H:714
ExprPtr e
Definition: type.H:641
ExprPtr fn(const str::seq &vns, const ExprPtr &b, const LexicalAnnotation &la)
Definition: expr.H:837
std::string show(const MonoTypeSubst &s)
Definition: type.C:1889
#define out
Definition: netio.H:19
MonoTypes requireMonotype(const PolyTypes &pts)
Definition: type.C:2265
TGenVarSet tgenVars(const MonoTypePtr &)
Definition: type.C:1710
MonoTypePtr normIfOpaquePtr(const MonoTypePtr &ty)
Definition: type.C:640
MonoTypes targs
Definition: type.H:601
std::string cat
Definition: type.H:238
MonoTypePtr tstrings(const std::vector< std::string > &xs)
Definition: type.H:1101
Members ams
Definition: type.H:465
std::string TVName
Definition: type.H:140
std::set< std::string > set
Definition: str.H:241
unsigned int alignment(const MonoTypePtr &)
Definition: type.C:508
std::shared_ptr< UnqualifierSet > UnqualifierSetPtr
Definition: type.H:86
MonoTypePtr isMaybe(const MonoTypePtr &t)
Definition: type.H:1091
uint32_t result
Definition: regex.C:376
MonoTypePtr unalias(const MonoTypePtr &)
Definition: type.C:2738
std::shared_ptr< MonoType > ptr
Definition: type.H:41
unsigned int maxFieldAlignmentM
Definition: type.H:467
std::vector< Member > Members
Definition: type.H:435
MonoTypePtr unpackedType(const Exists *e)
Definition: type.C:2274
QualTypePtr qualtype(const char *x)
Definition: type.H:1032
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
T switchOfF(Ptr ty, F f)
Definition: type.H:719
bool hasFreeVariables(const QualTypePtr &)
Definition: type.C:1858
MonoTypePtr sumtype(const MonoTypePtr &t0, const MonoTypePtr &t1)
Definition: type.H:1080
MonoTypes selectTypes(const Variant::Members &ms)
Definition: type.H:831
MonoTypePtr mt
Definition: type.H:204
unsigned int memorySize
Definition: type.H:65
std::map< std::string, llvm::Value * > Args
Definition: dfa.C:1276
Constraints freshen(const Constraints &cs)
Definition: type.C:1644
std::vector< MonoTypePtr > MonoTypes
Definition: type.H:72
MonoTypePtr cloneP(const MonoTypePtr &p)
Definition: type.C:1558
Constraints cs
Definition: type.H:203
QualTypePtr qt
Definition: type.H:180
std::string nm
Definition: type.H:291
static void accum(Record::Members *r, const char *n, const MonoTypePtr &t, Xs ... xs)
Definition: type.H:1218
MonoTypeSubst canonicalNameSubst(const NameSet &ns)
Definition: type.C:2041
std::shared_ptr< QualType > QualTypePtr
Definition: type.H:28
MonoTypePtr tuple(const MonoTypes &mtys=MonoTypes())
Definition: type.H:1068
std::string tname
Definition: type.H:524
int offset
Definition: type.H:433
size_t operator()(const MonoTypePtr &x) const
Definition: type.H:1268
LexicalAnnotation m(const YYLTYPE &p)
Definition: hexpr.parse.C:127
Record::Members switchOf(const Record::Members &ms, const switchType< T > &f)
Definition: type.H:823
bool in(T x, const std::set< T > &xs)
Definition: array.H:47
std::map< TVName, MonoTypePtr > MonoTypeSubst
Definition: type.H:143
bool isUnit(const MonoTypePtr &t)
Definition: type.H:1180
MonoTypePtr decode(const unsigned char *b, const unsigned char *e)
Definition: type.C:2685
TEnvPtr parent
Definition: type.H:122
MonoTypePtr b
Definition: type.H:582
MonoTypePtr makeRecordType(Xs ... xs)
Definition: type.H:1225
std::string val
Definition: type.H:547
T lookup(const std::map< K, T > &tenv, const K &n)
Definition: cc.C:518
MonoTypePtr tapp(const MonoTypePtr &f, const MonoTypes &args)
Definition: type.H:1133
unsigned int id
Definition: type.H:383
unsigned char UnitV
Definition: array.H:17
TVName freshName()
Definition: type.C:1600