void convert(const goto_programt::instructiont &instruction, irept &irep) { irep.set(ID_code, instruction.code); if(instruction.function!="") irep.set(ID_function, instruction.function); if(instruction.source_location.is_not_nil()) irep.set(ID_location, instruction.source_location); irep.set(ID_type, (long) instruction.type); irep.set(ID_guard, instruction.guard); if(!instruction.targets.empty()) { irept &tgts=irep.add(ID_targets); for(goto_programt::targetst::const_iterator it= instruction.targets.begin(); it!=instruction.targets.end(); it++) { irept t(i2string((*it)->location_number)); tgts.move_to_sub(t); } } if(!instruction.labels.empty()) { irept &lbls = irep.add(ID_labels); irept::subt &subs = lbls.get_sub(); subs.reserve(instruction.labels.size()); for(goto_programt::instructiont::labelst::const_iterator it= instruction.labels.begin(); it!=instruction.labels.end(); it++) { subs.push_back(irept(*it)); } } }
/// Deserialize a JSON irep representation. /// \param input: json object to convert /// \return result - irep equivalent of input void json_irept::convert_from_json(const jsont &in, irept &out) const { std::vector<std::string> have_keys; for(const auto &keyval : in.object) have_keys.push_back(keyval.first); std::sort(have_keys.begin(), have_keys.end()); if(have_keys!=std::vector<std::string>{"comment", "id", "namedSub", "sub"}) throw "irep JSON representation is missing one of needed keys: " "'id', 'sub', 'namedSub', 'comment'"; out.id(in["id"].value); for(const auto &sub : in["sub"].array) { out.get_sub().push_back(irept()); convert_from_json(sub, out.get_sub().back()); } for(const auto &named_sub : in["namedSub"].object) convert_from_json(named_sub.second, out.add(named_sub.first)); for(const auto &comment : in["comment"].object) convert_from_json(comment.second, out.add(comment.first)); }