|  | // Copyright 2019 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_JSON_JSON_COMMON_H_ | 
|  | #define BASE_JSON_JSON_COMMON_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include "base/check_op.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace internal { | 
|  |  | 
|  | // Chosen to support 99.9% of documents found in the wild late 2016. | 
|  | // http://crbug.com/673263 | 
|  | const size_t kAbsoluteMaxDepth = 200; | 
|  |  | 
|  | // Simple class that checks for maximum recursion/stack overflow. | 
|  | class StackMarker { | 
|  | public: | 
|  | StackMarker(size_t max_depth, size_t* depth) | 
|  | : max_depth_(max_depth), depth_(depth) { | 
|  | ++(*depth_); | 
|  | DCHECK_LE(*depth_, max_depth_); | 
|  | } | 
|  |  | 
|  | StackMarker(const StackMarker&) = delete; | 
|  | StackMarker& operator=(const StackMarker&) = delete; | 
|  |  | 
|  | ~StackMarker() { --(*depth_); } | 
|  |  | 
|  | bool IsTooDeep() const { return *depth_ >= max_depth_; } | 
|  |  | 
|  | private: | 
|  | const size_t max_depth_; | 
|  | const raw_ptr<size_t> depth_; | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_JSON_JSON_COMMON_H_ |