///|
fn Vm::object_flat_merge(
self : Vm,
items : Array[Int],
loc : Location,
) -> Value raise {
let fields : Map[String, LayerField] = Map([])
let env : Env = {
parent: None,
names: Map([]),
import_from: "",
debug_visible: None,
diagnostic_context: ("$", "anonymous"),
diagnostic_suppressed: false,
}
for t in items {
self.tick(loc)
guard self.force(t, loc) is ObjectValue(id, top) else {
raise problem(Type, loc, "$objectFlatMerge requires objects")
}
let layers = self.objects[id].layers
if top != 1 || !layers[0].locals.is_empty() {
// The reference panics when this compiler helper is called with an
// extended object or object-local bindings. Keep the host process alive.
raise problem(
Runtime,
loc,
"$objectFlatMerge requires simple objects without locals",
)
}
for name, field in layers[0].fields {
self.tick(loc)
if fields.contains(name) {
raise problem(Runtime, loc, "duplicate field name: " + name)
}
fields[name] = field
}
}
self.object_value([
{ fields, locals: [], assertions: [], assertion_sites: [], env, },
])
}