1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "llvm/Support/raw_ostream.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Helper to write information for the points-to graph. 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass JsonWriter { 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static JsonWriter* from(llvm::raw_fd_ostream* os) { 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return os ? new JsonWriter(os) : 0; 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ~JsonWriter() { 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_.close(); 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OpenList() { 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "["; 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state_.push(false); 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OpenList(const std::string key) { 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Write(key); 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << ":"; 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OpenList(); 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void CloseList() { 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "]"; 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state_.pop(); 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OpenObject() { 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "{"; 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state_.push(false); 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void CloseObject() { 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "}\n"; 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state_.pop(); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Write(const size_t val) { 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << val; 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Write(const std::string val) { 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "\"" << val << "\""; 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Write(const std::string key, const size_t val) { 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "\"" << key << "\":" << val; 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Write(const std::string key, const std::string val) { 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Separator(); 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << "\"" << key << "\":\"" << val << "\""; 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JsonWriter(llvm::raw_fd_ostream* os) : os_(*os) {} 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Separator() { 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (state_.empty()) 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (state_.top()) { 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch os_ << ","; 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state_.top() = true; 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch llvm::raw_fd_ostream& os_; 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::stack<bool> state_; 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 74