From ead83813f51dfc60ef19a26f8cb6cafd034a13d3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 1 Feb 2024 11:35:45 -0800 Subject: [PATCH] JSON: Add simple printing and creation (#6265) --- src/support/CMakeLists.txt | 1 + src/support/json.cpp | 43 ++++++++++++++++++++++++++++++++++++++ src/support/json.h | 2 ++ test/gtest/CMakeLists.txt | 1 + test/gtest/json.cpp | 16 ++++++++++++++ 5 files changed, 63 insertions(+) create mode 100644 src/support/json.cpp create mode 100644 test/gtest/json.cpp diff --git a/src/support/CMakeLists.txt b/src/support/CMakeLists.txt index 87f835c7b03..13bf463e42c 100644 --- a/src/support/CMakeLists.txt +++ b/src/support/CMakeLists.txt @@ -8,6 +8,7 @@ set(support_SOURCES dfa_minimization.cpp file.cpp istring.cpp + json.cpp path.cpp safe_integer.cpp threads.cpp diff --git a/src/support/json.cpp b/src/support/json.cpp new file mode 100644 index 00000000000..d43ac03239a --- /dev/null +++ b/src/support/json.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2024 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "support/json.h" + +namespace json { + +void Value::stringify(std::ostream& os, bool pretty) { + if (isString()) { + // TODO: escaping + os << '"' << getCString() << '"'; + } else if (isArray()) { + os << '['; + auto first = true; + for (auto& item : getArray()) { + if (first) { + first = false; + } else { + // TODO pretty whitespace + os << ','; + } + item->stringify(os, pretty); + } + os << ']'; + } else { + WASM_UNREACHABLE("TODO: stringify all of JSON"); + } +} + +} // namespace json diff --git a/src/support/json.h b/src/support/json.h index bc880f382d8..c005543f60e 100644 --- a/src/support/json.h +++ b/src/support/json.h @@ -54,6 +54,8 @@ struct Value { Ref& operator[](IString x) { return (*this->get())[x]; } }; + template static Ref make(T t) { return Ref(new Value(t)); } + enum Type { String = 0, Number = 1, diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index b401307608e..303e386c642 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -4,6 +4,7 @@ include_directories(../../src/wasm) set(unittest_SOURCES cfg.cpp dfa_minimization.cpp + json.cpp lattices.cpp possible-contents.cpp printing.cpp diff --git a/test/gtest/json.cpp b/test/gtest/json.cpp new file mode 100644 index 00000000000..10417cdb947 --- /dev/null +++ b/test/gtest/json.cpp @@ -0,0 +1,16 @@ +#include "support/json.h" +#include "gtest/gtest.h" + +using JSONTest = ::testing::Test; + +TEST_F(JSONTest, Stringify) { + // TODO: change the API to not require a copy + auto input = "[\"hello\",\"world\"]"; + auto* copy = strdup(input); + json::Value value; + value.parse(copy); + std::stringstream ss; + value.stringify(ss); + EXPECT_EQ(ss.str(), input); + free(copy); +}