mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
prevent crashes
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user