Skip to content

Commit c7c734b

Browse files
committed
Cherry-pick #2343
1 parent b5d5e9e commit c7c734b

File tree

1 file changed

+27
-73
lines changed

1 file changed

+27
-73
lines changed

hugr-model/src/v0/binary/read.rs

Lines changed: 27 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -126,88 +126,21 @@ fn read_operation<'a>(
126126
Which::Dfg(()) => table::Operation::Dfg,
127127
Which::Cfg(()) => table::Operation::Cfg,
128128
Which::Block(()) => table::Operation::Block,
129-
Which::FuncDefn(reader) => {
130-
let reader = reader?;
131-
let name = bump.alloc_str(reader.get_name()?.to_str()?);
132-
let params = read_list!(bump, reader.get_params()?, read_param);
133-
let constraints = read_scalar_list!(bump, reader, get_constraints, table::TermId);
134-
let signature = table::TermId(reader.get_signature());
135-
let symbol = bump.alloc(table::Symbol {
136-
name,
137-
params,
138-
constraints,
139-
signature,
140-
});
141-
table::Operation::DefineFunc(symbol)
142-
}
143-
Which::FuncDecl(reader) => {
144-
let reader = reader?;
145-
let name = bump.alloc_str(reader.get_name()?.to_str()?);
146-
let params = read_list!(bump, reader.get_params()?, read_param);
147-
let constraints = read_scalar_list!(bump, reader, get_constraints, table::TermId);
148-
let signature = table::TermId(reader.get_signature());
149-
let symbol = bump.alloc(table::Symbol {
150-
name,
151-
params,
152-
constraints,
153-
signature,
154-
});
155-
table::Operation::DeclareFunc(symbol)
156-
}
129+
Which::FuncDefn(reader) => table::Operation::DefineFunc(read_symbol(bump, reader?, None)?),
130+
Which::FuncDecl(reader) => table::Operation::DeclareFunc(read_symbol(bump, reader?, None)?),
157131
Which::AliasDefn(reader) => {
158132
let symbol = reader.get_symbol()?;
159133
let value = table::TermId(reader.get_value());
160-
let name = bump.alloc_str(symbol.get_name()?.to_str()?);
161-
let params = read_list!(bump, symbol.get_params()?, read_param);
162-
let signature = table::TermId(symbol.get_signature());
163-
let symbol = bump.alloc(table::Symbol {
164-
name,
165-
params,
166-
constraints: &[],
167-
signature,
168-
});
169-
table::Operation::DefineAlias(symbol, value)
134+
table::Operation::DefineAlias(read_symbol(bump, symbol, Some(&[]))?, value)
170135
}
171136
Which::AliasDecl(reader) => {
172-
let reader = reader?;
173-
let name = bump.alloc_str(reader.get_name()?.to_str()?);
174-
let params = read_list!(bump, reader.get_params()?, read_param);
175-
let signature = table::TermId(reader.get_signature());
176-
let symbol = bump.alloc(table::Symbol {
177-
name,
178-
params,
179-
constraints: &[],
180-
signature,
181-
});
182-
table::Operation::DeclareAlias(symbol)
137+
table::Operation::DeclareAlias(read_symbol(bump, reader?, Some(&[]))?)
183138
}
184139
Which::ConstructorDecl(reader) => {
185-
let reader = reader?;
186-
let name = bump.alloc_str(reader.get_name()?.to_str()?);
187-
let params = read_list!(bump, reader.get_params()?, read_param);
188-
let constraints = read_scalar_list!(bump, reader, get_constraints, table::TermId);
189-
let signature = table::TermId(reader.get_signature());
190-
let symbol = bump.alloc(table::Symbol {
191-
name,
192-
params,
193-
constraints,
194-
signature,
195-
});
196-
table::Operation::DeclareConstructor(symbol)
140+
table::Operation::DeclareConstructor(read_symbol(bump, reader?, None)?)
197141
}
198142
Which::OperationDecl(reader) => {
199-
let reader = reader?;
200-
let name = bump.alloc_str(reader.get_name()?.to_str()?);
201-
let params = read_list!(bump, reader.get_params()?, read_param);
202-
let constraints = read_scalar_list!(bump, reader, get_constraints, table::TermId);
203-
let signature = table::TermId(reader.get_signature());
204-
let symbol = bump.alloc(table::Symbol {
205-
name,
206-
params,
207-
constraints,
208-
signature,
209-
});
210-
table::Operation::DeclareOperation(symbol)
143+
table::Operation::DeclareOperation(read_symbol(bump, reader?, None)?)
211144
}
212145
Which::Custom(operation) => table::Operation::Custom(table::TermId(operation)),
213146
Which::TailLoop(()) => table::Operation::TailLoop,
@@ -257,6 +190,27 @@ fn read_region_scope(reader: hugr_capnp::region_scope::Reader) -> ReadResult<tab
257190
Ok(table::RegionScope { links, ports })
258191
}
259192

193+
/// (Only) if `constraints` are None, then they are read from the `reader`
194+
fn read_symbol<'a>(
195+
bump: &'a Bump,
196+
reader: hugr_capnp::symbol::Reader,
197+
constraints: Option<&'a [table::TermId]>,
198+
) -> ReadResult<&'a mut table::Symbol<'a>> {
199+
let name = bump.alloc_str(reader.get_name()?.to_str()?);
200+
let params = read_list!(bump, reader.get_params()?, read_param);
201+
let constraints = match constraints {
202+
Some(cs) => cs,
203+
None => read_scalar_list!(bump, reader, get_constraints, table::TermId),
204+
};
205+
let signature = table::TermId(reader.get_signature());
206+
Ok(bump.alloc(table::Symbol {
207+
name,
208+
params,
209+
constraints,
210+
signature,
211+
}))
212+
}
213+
260214
fn read_term<'a>(bump: &'a Bump, reader: hugr_capnp::term::Reader) -> ReadResult<table::Term<'a>> {
261215
use hugr_capnp::term::Which;
262216
Ok(match reader.which()? {

0 commit comments

Comments
 (0)