Skip to content

Commit d32ab69

Browse files
author
Joel Allred
authored
Merge pull request #3601 from tautschnig/json-api
Equip json_arrayt and json_objectt with a full API to enable hiding [blocks: #3602]
2 parents 4b05dcb + 5167bcb commit d32ab69

File tree

12 files changed

+182
-88
lines changed

12 files changed

+182
-88
lines changed

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void java_bytecode_languaget::set_language_options(const optionst &options)
161161
throw "the JSON file has a wrong format";
162162

163163
// add jars from JSON config file to classpath
164-
for(const jsont &file_entry : include_files.array)
164+
for(const jsont &file_entry : to_json_array(include_files))
165165
{
166166
DATA_INVARIANT(
167167
file_entry.is_string() && has_suffix(file_entry.value, ".jar"),

jbmc/src/java_bytecode/java_class_loader_limit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void java_class_loader_limitt::setup_class_load_limit(
7474
jsont include_files=json_cp_config["classFiles"];
7575
if(!include_files.is_null() && !include_files.is_array())
7676
throw "the JSON file has a wrong format";
77-
for(const jsont &file_entry : include_files.array)
77+
for(const jsont &file_entry : to_json_array(include_files))
7878
{
7979
assert(file_entry.is_string());
8080
set_matcher.insert(file_entry.value);

src/goto-analyzer/taint_analysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ bool taint_analysist::operator()(
358358
json["file"] = json_stringt(i_it->source_location.get_file());
359359
json["line"]=
360360
json_numbert(id2string(i_it->source_location.get_line()));
361-
json_result.array.push_back(json);
361+
json_result.push_back(json);
362362
}
363363
else
364364
{

src/goto-analyzer/taint_parser.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,25 @@ bool taint_parser(
4040
return true;
4141
}
4242

43-
for(jsont::arrayt::const_iterator
44-
it=json.array.begin();
45-
it!=json.array.end();
46-
it++)
43+
for(const auto &taint_spec : to_json_array(json))
4744
{
48-
if(!it->is_object())
45+
if(!taint_spec.is_object())
4946
{
5047
messaget message(message_handler);
5148
message.error() << "expecting an array of objects "
52-
<< "in the taint file, but got "
53-
<< *it << messaget::eom;
49+
<< "in the taint file, but got " << taint_spec
50+
<< messaget::eom;
5451
return true;
5552
}
5653

5754
taint_parse_treet::rulet rule;
5855

59-
const std::string kind=(*it)["kind"].value;
60-
const std::string function=(*it)["function"].value;
61-
const std::string where=(*it)["where"].value;
62-
const std::string taint=(*it)["taint"].value;
63-
const std::string message=(*it)["message"].value;
64-
const std::string id=(*it)["id"].value;
56+
const std::string kind = taint_spec["kind"].value;
57+
const std::string function = taint_spec["function"].value;
58+
const std::string where = taint_spec["where"].value;
59+
const std::string taint = taint_spec["taint"].value;
60+
const std::string message = taint_spec["message"].value;
61+
const std::string id = taint_spec["id"].value;
6562

6663
if(kind=="source")
6764
rule.kind=taint_parse_treet::rulet::SOURCE;

src/goto-analyzer/unreachable_instructions.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void unreachable_instructions(
197197
}
198198
}
199199

200-
if(json && !json_result.array.empty())
200+
if(json && !json_result.empty())
201201
os << json_result << '\n';
202202
}
203203

@@ -239,7 +239,7 @@ bool static_unreachable_instructions(
239239
}
240240
}
241241

242-
if(options.get_bool_option("json") && !json_result.array.empty())
242+
if(options.get_bool_option("json") && !json_result.empty())
243243
out << json_result << '\n';
244244
else if(options.get_bool_option("xml"))
245245
out << xml_result << '\n';
@@ -369,7 +369,7 @@ static void list_functions(
369369
}
370370
}
371371

372-
if(options.get_bool_option("json") && !json_result.array.empty())
372+
if(options.get_bool_option("json") && !json_result.empty())
373373
os << json_result << '\n';
374374
else if(options.get_bool_option("xml"))
375375
os << xml_result << '\n';

src/goto-cc/linker_script_merge.cpp

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ int linker_script_merget::ls_data2instructions(
400400
{
401401
goto_programt::instructionst initialize_instructions=gp.instructions;
402402
std::map<irep_idt, std::size_t> truncated_symbols;
403-
for(auto &d : data["regions"].array)
403+
for(auto &d : to_json_array(data["regions"]))
404404
{
405405
bool has_end=d["has-end-symbol"].is_true();
406406

@@ -446,11 +446,13 @@ int linker_script_merget::ls_data2instructions(
446446

447447
// Since the value of the pointer will be a random CBMC address, write a
448448
// note about the real address in the object file
449-
auto it=std::find_if(data["addresses"].array.begin(),
450-
data["addresses"].array.end(),
451-
[&d](const jsont &add)
452-
{ return add["sym"].value==d["start-symbol"].value; });
453-
if(it==data["addresses"].array.end())
449+
auto it = std::find_if(
450+
to_json_array(data["addresses"]).begin(),
451+
to_json_array(data["addresses"]).end(),
452+
[&d](const jsont &add) {
453+
return add["sym"].value == d["start-symbol"].value;
454+
});
455+
if(it == to_json_array(data["addresses"]).end())
454456
{
455457
error() << "Start: Could not find address corresponding to symbol '"
456458
<< d["start-symbol"].value << "' (start of section)" << eom;
@@ -481,12 +483,12 @@ int linker_script_merget::ls_data2instructions(
481483
linker_values[d["end-symbol"].value]=std::make_pair(end_sym, array_end);
482484

483485
auto entry = std::find_if(
484-
data["addresses"].array.begin(),
485-
data["addresses"].array.end(),
486+
to_json_array(data["addresses"]).begin(),
487+
to_json_array(data["addresses"]).end(),
486488
[&d](const jsont &add) {
487489
return add["sym"].value == d["end-symbol"].value;
488490
});
489-
if(entry == data["addresses"].array.end())
491+
if(entry == to_json_array(data["addresses"]).end())
490492
{
491493
error() << "Could not find address corresponding to symbol '"
492494
<< d["end-symbol"].value << "' (end of section)" << eom;
@@ -539,7 +541,7 @@ int linker_script_merget::ls_data2instructions(
539541
// address. These will have been declared extern too, so we need to give them
540542
// a value also. Here, we give them the actual value that they have in the
541543
// object file, since we're not assigning any object to them.
542-
for(const auto &d : data["addresses"].array)
544+
for(const auto &d : to_json_array(data["addresses"]))
543545
{
544546
auto it=linker_values.find(irep_idt(d["sym"].value));
545547
if(it!=linker_values.end())
@@ -591,7 +593,7 @@ int linker_script_merget::ls_data2instructions(
591593
#else
592594
{
593595
goto_programt::instructionst initialize_instructions=gp.instructions;
594-
for(const auto &d : data["regions"].array)
596+
for(const auto &d : to_json_array(data["regions"]))
595597
{
596598
unsigned start=safe_string2unsigned(d["start"].value);
597599
unsigned size=safe_string2unsigned(d["size"].value);
@@ -623,7 +625,7 @@ int linker_script_merget::ls_data2instructions(
623625
symbol_table.add(sym);
624626
}
625627
626-
for(const auto &d : data["addresses"].array)
628+
for(const auto &d : to_json_array(data["addresses"]))
627629
{
628630
source_locationt loc;
629631
loc.set_file(linker_script);
@@ -738,38 +740,51 @@ int linker_script_merget::goto_and_object_mismatch(
738740

739741
int linker_script_merget::linker_data_is_malformed(const jsont &data) const
740742
{
743+
if(!data.is_object())
744+
return true;
745+
746+
const json_objectt &data_object = to_json_object(data);
741747
return (
742-
!(data.is_object() && data.object.find("regions") != data.object.end() &&
743-
data.object.find("addresses") != data.object.end() &&
748+
!(data_object.find("regions") != data_object.end() &&
749+
data_object.find("addresses") != data_object.end() &&
744750
data["regions"].is_array() && data["addresses"].is_array() &&
745751
std::all_of(
746-
data["addresses"].array.begin(),
747-
data["addresses"].array.end(),
752+
to_json_array(data["addresses"]).begin(),
753+
to_json_array(data["addresses"]).end(),
748754
[](const jsont &j) {
749-
return j.is_object() && j.object.find("val") != j.object.end() &&
750-
j.object.find("sym") != j.object.end() &&
751-
j["val"].is_number() && j["sym"].is_string();
755+
if(!j.is_object())
756+
return false;
757+
758+
const json_objectt &address = to_json_object(j);
759+
return address.find("val") != address.end() &&
760+
address.find("sym") != address.end() &&
761+
address["val"].is_number() && address["sym"].is_string();
752762
}) &&
753763
std::all_of(
754-
data["regions"].array.begin(),
755-
data["regions"].array.end(),
764+
to_json_array(data["regions"]).begin(),
765+
to_json_array(data["regions"]).end(),
756766
[](const jsont &j) {
757-
return j.is_object() && j.object.find("start") != j.object.end() &&
758-
j.object.find("size") != j.object.end() &&
759-
j.object.find("annot") != j.object.end() &&
760-
j.object.find("commt") != j.object.end() &&
761-
j.object.find("start-symbol") != j.object.end() &&
762-
j.object.find("has-end-symbol") != j.object.end() &&
763-
j.object.find("section") != j.object.end() &&
764-
j["start"].is_number() && j["size"].is_number() &&
765-
j["annot"].is_string() && j["start-symbol"].is_string() &&
766-
j["section"].is_string() && j["commt"].is_string() &&
767-
((j["has-end-symbol"].is_true() &&
768-
j.object.find("end-symbol") != j.object.end() &&
769-
j["end-symbol"].is_string()) ||
770-
(j["has-end-symbol"].is_false() &&
771-
j.object.find("size-symbol") != j.object.end() &&
772-
j.object.find("end-symbol") == j.object.end() &&
773-
j["size-symbol"].is_string()));
767+
if(!j.is_object())
768+
return false;
769+
770+
const json_objectt &region = to_json_object(j);
771+
return region.find("start") != region.end() &&
772+
region.find("size") != region.end() &&
773+
region.find("annot") != region.end() &&
774+
region.find("commt") != region.end() &&
775+
region.find("start-symbol") != region.end() &&
776+
region.find("has-end-symbol") != region.end() &&
777+
region.find("section") != region.end() &&
778+
region["start"].is_number() && region["size"].is_number() &&
779+
region["annot"].is_string() &&
780+
region["start-symbol"].is_string() &&
781+
region["section"].is_string() && region["commt"].is_string() &&
782+
((region["has-end-symbol"].is_true() &&
783+
region.find("end-symbol") != region.end() &&
784+
region["end-symbol"].is_string()) ||
785+
(region["has-end-symbol"].is_false() &&
786+
region.find("size-symbol") != region.end() &&
787+
region.find("end-symbol") == region.end() &&
788+
region["size-symbol"].is_string()));
774789
})));
775790
}

src/json-symtab-language/json_symbol.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ symbolt symbol_from_json(const jsont &in)
4848
throw deserialization_exceptiont("symbol_from_json takes an object");
4949
symbolt result;
5050
json_irept json2irep(true);
51-
for(const auto &kv : in.object)
51+
for(const auto &kv : to_json_object(in))
5252
{
5353
if(kv.first == "type")
5454
{

src/json-symtab-language/json_symbol_table.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void symbol_table_from_json(const jsont &in, symbol_tablet &symbol_table)
1818
if(!in.is_array())
1919
throw deserialization_exceptiont(
2020
"symbol_table_from_json: JSON input must be an array");
21-
for(const auto &js_symbol : in.array)
21+
for(const auto &js_symbol : to_json_array(in))
2222
{
2323
symbolt deserialized = symbol_from_json(js_symbol);
2424
if(symbol_table.add(deserialized))

src/json/parser.y

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ key_value_pair:
9090
{
9191
jsont tmp;
9292
json_parser.pop(tmp);
93-
json_parser.top().object[json_parser.top().value].swap(tmp);
93+
to_json_object(json_parser.top())[json_parser.top().value].swap(tmp);
9494
json_parser.top().value.clear(); // end abuse
9595
}
9696
;
@@ -109,7 +109,7 @@ array_value:
109109
{
110110
jsont tmp;
111111
json_parser.pop(tmp);
112-
json_parser.top().array.push_back(tmp);
112+
to_json_array(json_parser.top()).push_back(tmp);
113113
}
114114
;
115115

0 commit comments

Comments
 (0)