1
0
forked from GitHub/gf-core

prevent crashes

This commit is contained in:
krangelov
2021-12-23 14:26:51 +01:00
parent 4792665241
commit 5b5ecc6934

View File

@@ -255,21 +255,25 @@ PgfExpr PgfReader::read_expr()
PgfBindType bind_type = (PgfBindType) read_tag(); PgfBindType bind_type = (PgfBindType) read_tag();
ref<PgfExprAbs> eabs = read_name(&PgfExprAbs::name); ref<PgfExprAbs> eabs = read_name(&PgfExprAbs::name);
eabs->bind_type = bind_type; eabs->bind_type = bind_type;
eabs->body = read_expr(); PgfExpr body = read_expr();
eabs->body = body;
expr = ref<PgfExprAbs>::tagged(eabs); expr = ref<PgfExprAbs>::tagged(eabs);
break; break;
} }
case PgfExprApp::tag: { case PgfExprApp::tag: {
PgfExpr fun = read_expr();
PgfExpr arg = read_expr();
ref<PgfExprApp> eapp = PgfDB::malloc<PgfExprApp>(); ref<PgfExprApp> eapp = PgfDB::malloc<PgfExprApp>();
eapp->fun = read_expr(); eapp->fun = fun;
eapp->arg = read_expr(); eapp->arg = arg;
expr = ref<PgfExprApp>::tagged(eapp); expr = ref<PgfExprApp>::tagged(eapp);
break; break;
} }
case PgfExprLit::tag: { case PgfExprLit::tag: {
PgfExpr lit = read_literal();
ref<PgfExprLit> elit = PgfDB::malloc<PgfExprLit>(); ref<PgfExprLit> elit = PgfDB::malloc<PgfExprLit>();
elit->lit = read_literal(); elit->lit = lit;
expr = ref<PgfExprLit>::tagged(elit); expr = ref<PgfExprLit>::tagged(elit);
break; break;
} }
case PgfExprMeta::tag: { case PgfExprMeta::tag: {
@@ -290,15 +294,18 @@ PgfExpr PgfReader::read_expr()
break; break;
} }
case PgfExprTyped::tag: { case PgfExprTyped::tag: {
auto expr = read_expr();
auto type = read_type();
ref<PgfExprTyped> etyped = PgfDB::malloc<PgfExprTyped>(); ref<PgfExprTyped> etyped = PgfDB::malloc<PgfExprTyped>();
etyped->expr = read_expr(); etyped->expr = expr;
etyped->type = read_type(); etyped->type = type;
expr = ref<PgfExprTyped>::tagged(etyped); expr = ref<PgfExprTyped>::tagged(etyped);
break; break;
} }
case PgfExprImplArg::tag: { case PgfExprImplArg::tag: {
auto expr = read_expr();
ref<PgfExprImplArg> eimpl = current_db->malloc<PgfExprImplArg>(); ref<PgfExprImplArg> eimpl = current_db->malloc<PgfExprImplArg>();
eimpl->expr = read_expr(); eimpl->expr = expr;
expr = ref<PgfExprImplArg>::tagged(eimpl); expr = ref<PgfExprImplArg>::tagged(eimpl);
break; break;
} }
@@ -312,18 +319,21 @@ PgfExpr PgfReader::read_expr()
void PgfReader::read_hypo(ref<PgfHypo> hypo) void PgfReader::read_hypo(ref<PgfHypo> hypo)
{ {
hypo->bind_type = (PgfBindType) read_tag(); hypo->bind_type = (PgfBindType) read_tag();
hypo->cid = read_name(); auto cid = read_name();
hypo->type = read_type(); hypo->cid = cid;
auto type = read_type();
hypo->type = type;
} }
ref<PgfDTyp> PgfReader::read_type() ref<PgfDTyp> PgfReader::read_type()
{ {
ref<Vector<PgfHypo>> hypos = auto hypos =
read_vector<PgfHypo>(&PgfReader::read_hypo); read_vector<PgfHypo>(&PgfReader::read_hypo);
ref<PgfDTyp> tp = read_name<PgfDTyp>(&PgfDTyp::name); ref<PgfDTyp> tp = read_name<PgfDTyp>(&PgfDTyp::name);
tp->hypos = hypos; tp->hypos = hypos;
tp->exprs = auto exprs =
read_vector<PgfExpr>(&PgfReader::read_expr); read_vector<PgfExpr>(&PgfReader::read_expr);
tp->exprs = exprs;
return tp; return tp;
} }