Skip to content

Commit 74e2d3c

Browse files
authored
Introduce a compile contrib program for fuzzing purposes (#410)
For example: ```sh ./build/contrib/sourcemeta_blaze_contrib_compile fast path/to/schema.json ./build/contrib/sourcemeta_blaze_contrib_compile exhaustive path/to/schema.json ``` See: #99 Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent bbaf725 commit 74e2d3c

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

contrib/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
if(BLAZE_COMPILER AND BLAZE_EVALUATOR)
2+
sourcemeta_executable(NAMESPACE sourcemeta PROJECT blaze NAME contrib_compile
3+
FOLDER "Blaze/Contrib" SOURCES compile.cc)
4+
target_link_libraries(sourcemeta_blaze_contrib_compile
5+
PRIVATE sourcemeta::core::json)
6+
target_link_libraries(sourcemeta_blaze_contrib_compile
7+
PRIVATE sourcemeta::core::jsonschema)
8+
target_link_libraries(sourcemeta_blaze_contrib_compile
9+
PRIVATE sourcemeta::blaze::compiler)
10+
211
sourcemeta_executable(NAMESPACE sourcemeta PROJECT blaze NAME contrib_validate
312
FOLDER "Blaze/Contrib" SOURCES validate.cc)
413
target_link_libraries(sourcemeta_blaze_contrib_validate

contrib/compile.cc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include <sourcemeta/blaze/compiler.h>
2+
#include <sourcemeta/core/json.h>
3+
4+
#include <chrono> // std::chrono
5+
#include <cstdlib> // EXIT_SUCCESS, EXIT_FAILURE
6+
#include <iostream> // std::cerr
7+
8+
auto main(int argc, char **argv) noexcept -> int {
9+
if (argc < 3) {
10+
std::cerr << "Usage: " << argv[0] << " <fast|exhaustive> <schema.json>\n";
11+
return EXIT_FAILURE;
12+
}
13+
14+
const std::string mode_string{argv[1]};
15+
auto mode{sourcemeta::blaze::Mode::FastValidation};
16+
if (mode_string == "fast") {
17+
std::cerr << "Choosing fast mode\n";
18+
} else if (mode_string == "exhaustive") {
19+
std::cerr << "Choosing exhaustive mode\n";
20+
mode = sourcemeta::blaze::Mode::Exhaustive;
21+
} else {
22+
std::cerr << "Invalid mode: " << mode_string << "\n";
23+
return EXIT_FAILURE;
24+
}
25+
26+
const auto schema{sourcemeta::core::read_json(argv[2])};
27+
std::cerr << "Compiling schema: " << argv[2] << "\n";
28+
const auto compile_start{std::chrono::high_resolution_clock::now()};
29+
const auto schema_template{sourcemeta::blaze::compile(
30+
schema, sourcemeta::core::schema_official_walker,
31+
sourcemeta::core::schema_official_resolver,
32+
sourcemeta::blaze::default_schema_compiler, mode)};
33+
const auto compile_end{std::chrono::high_resolution_clock::now()};
34+
const auto compile_duration{
35+
std::chrono::duration_cast<std::chrono::milliseconds>(compile_end -
36+
compile_start)};
37+
std::cerr << "Took: " << compile_duration.count() << "ms\n";
38+
std::cerr << "Number of generated instructions: "
39+
<< schema_template.instructions.size() << "\n";
40+
41+
return EXIT_SUCCESS;
42+
}

0 commit comments

Comments
 (0)