Skip to content

Commit 3b64484

Browse files
committed
fixup! Add error message handling to JSON parser
1 parent a24db1f commit 3b64484

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

src/json_parser.cc

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "json_parser.h"
22
#include "debug_utils.h"
3+
#include <cstdio>
34

45
namespace node {
56

@@ -12,20 +13,25 @@ bool JSONParser::Parse(const std::string& content) {
1213
size_t json_length = json_content_.size();
1314
json_content_.append(simdjson::SIMDJSON_PADDING, ' ');
1415

15-
simdjson::padded_string_view json_view(json_content_.data(),
16-
json_length,
17-
json_content_.size());
16+
simdjson::padded_string_view json_view(
17+
json_content_.data(), json_length, json_content_.size());
1818

1919
simdjson::ondemand::document document;
2020
simdjson::error_code error = parser_.iterate(json_view).get(document);
2121

2222
if (error != simdjson::SUCCESS) {
23+
error_message_ = simdjson::error_message(error);
24+
// Print error to stderr to match V8 behavior
25+
std::fprintf(stderr, "JSON Parse error: %s\n", error_message_.c_str());
2326
return false;
2427
}
2528

2629
simdjson::ondemand::object obj;
2730
error = document.get_object().get(obj);
2831
if (error != simdjson::SUCCESS) {
32+
error_message_ = simdjson::error_message(error);
33+
// Print error to stderr to match V8 behavior
34+
std::fprintf(stderr, "JSON Parse error: %s\n", error_message_.c_str());
2935
return false;
3036
}
3137

@@ -39,9 +45,10 @@ std::optional<std::string> JSONParser::GetTopLevelStringField(
3945
return {};
4046
}
4147

42-
simdjson::padded_string_view json_view(json_content_.data(),
43-
json_content_.size() - simdjson::SIMDJSON_PADDING,
44-
json_content_.size());
48+
simdjson::padded_string_view json_view(
49+
json_content_.data(),
50+
json_content_.size() - simdjson::SIMDJSON_PADDING,
51+
json_content_.size());
4552

4653
simdjson::ondemand::document document;
4754
simdjson::error_code error = parser_.iterate(json_view).get(document);
@@ -69,9 +76,10 @@ std::optional<bool> JSONParser::GetTopLevelBoolField(std::string_view field) {
6976
return {};
7077
}
7178

72-
simdjson::padded_string_view json_view(json_content_.data(),
73-
json_content_.size() - simdjson::SIMDJSON_PADDING,
74-
json_content_.size());
79+
simdjson::padded_string_view json_view(
80+
json_content_.data(),
81+
json_content_.size() - simdjson::SIMDJSON_PADDING,
82+
json_content_.size());
7583

7684
simdjson::ondemand::document document;
7785
simdjson::error_code error = parser_.iterate(json_view).get(document);
@@ -106,9 +114,10 @@ std::optional<JSONParser::StringDict> JSONParser::GetTopLevelStringDict(
106114
return std::nullopt;
107115
}
108116

109-
simdjson::padded_string_view json_view(json_content_.data(),
110-
json_content_.size() - simdjson::SIMDJSON_PADDING,
111-
json_content_.size());
117+
simdjson::padded_string_view json_view(
118+
json_content_.data(),
119+
json_content_.size() - simdjson::SIMDJSON_PADDING,
120+
json_content_.size());
112121

113122
simdjson::ondemand::document document;
114123
simdjson::error_code error = parser_.iterate(json_view).get(document);

src/json_parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ class JSONParser {
2222
std::optional<std::string> GetTopLevelStringField(std::string_view field);
2323
std::optional<bool> GetTopLevelBoolField(std::string_view field);
2424
std::optional<StringDict> GetTopLevelStringDict(std::string_view field);
25+
std::string GetErrorMessage() const { return error_message_; }
2526

2627
private:
2728
simdjson::ondemand::parser parser_;
2829
std::string json_content_;
30+
std::string error_message_;
2931
bool parsed_ = false;
3032
};
3133
} // namespace node

test/parallel/test-single-executable-blob-config-errors.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ const assert = require('assert');
5252
});
5353
const stderr = child.stderr.toString();
5454
assert.strictEqual(child.status, 1);
55-
assert.match(stderr, /SyntaxError: Expected ':' after property name/);
55+
// The error message changed from V8's parser to simdjson
56+
assert.match(stderr, /JSON Parse error: INCOMPLETE_ARRAY_OR_OBJECT/);
5657
assert(
5758
stderr.includes(
5859
`Cannot parse JSON from ${config}`

0 commit comments

Comments
 (0)