toolkit/crashreporter/google-breakpad/src/processor/simple_serializer-inl.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Copyright (c) 2010, Google Inc.
     2 // All rights reserved.
     3 //
     4 // Redistribution and use in source and binary forms, with or without
     5 // modification, are permitted provided that the following conditions are
     6 // met:
     7 //
     8 //     * Redistributions of source code must retain the above copyright
     9 // notice, this list of conditions and the following disclaimer.
    10 //     * Redistributions in binary form must reproduce the above
    11 // copyright notice, this list of conditions and the following disclaimer
    12 // in the documentation and/or other materials provided with the
    13 // distribution.
    14 //     * Neither the name of Google Inc. nor the names of its
    15 // contributors may be used to endorse or promote products derived from
    16 // this software without specific prior written permission.
    17 //
    18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    29 //
    30 // simple_serializer-inl.h: template specializations for following types:
    31 // bool, const char *(C-string), string,
    32 // Line, Function, PublicSymbol, WindowsFrameInfo and their linked pointers.
    33 //
    34 // See simple_serializer.h for moredocumentation.
    35 //
    36 // Author: Siyang Xie (lambxsy@google.com)
    38 #ifndef PROCESSOR_SIMPLE_SERIALIZER_INL_H__
    39 #define PROCESSOR_SIMPLE_SERIALIZER_INL_H__
    41 #include <string>
    43 #include "processor/simple_serializer.h"
    44 #include "map_serializers-inl.h"
    46 #include "google_breakpad/processor/basic_source_line_resolver.h"
    47 #include "processor/basic_source_line_resolver_types.h"
    48 #include "processor/linked_ptr.h"
    49 #include "processor/windows_frame_info.h"
    51 namespace google_breakpad {
    53 // Specializations of SimpleSerializer: bool
    54 template<>
    55 class SimpleSerializer<bool> {
    56  public:
    57   static size_t SizeOf(bool boolean) { return 1; }
    59   static char *Write(bool boolean, char *dest) {
    60     *dest = static_cast<char>(boolean? 255 : 0);
    61     return ++dest;
    62   }
    63 };
    65 // Specializations of SimpleSerializer: string
    66 template<>
    67 class SimpleSerializer<string> {
    68  public:
    69   static size_t SizeOf(const string &str) { return str.size() + 1; }
    71   static char *Write(const string &str, char *dest) {
    72     strcpy(dest, str.c_str());
    73     return dest + SizeOf(str);
    74   }
    75 };
    77 // Specializations of SimpleSerializer: C-string
    78 template<>
    79 class SimpleSerializer<const char*> {
    80  public:
    81   static size_t SizeOf(const char *cstring) {
    82     return strlen(cstring) + 1;
    83   }
    85   static char *Write(const char *cstring, char *dest) {
    86     strcpy(dest, cstring);
    87     return dest + SizeOf(cstring);
    88   }
    89 };
    91 // Specializations of SimpleSerializer: Line
    92 template<>
    93 class SimpleSerializer<BasicSourceLineResolver::Line> {
    94   typedef BasicSourceLineResolver::Line Line;
    95  public:
    96   static size_t SizeOf(const Line &line) {
    97     return SimpleSerializer<MemAddr>::SizeOf(line.address)
    98          + SimpleSerializer<MemAddr>::SizeOf(line.size)
    99          + SimpleSerializer<int32_t>::SizeOf(line.source_file_id)
   100          + SimpleSerializer<int32_t>::SizeOf(line.line);
   101   }
   102   static char *Write(const Line &line, char *dest) {
   103     dest = SimpleSerializer<MemAddr>::Write(line.address, dest);
   104     dest = SimpleSerializer<MemAddr>::Write(line.size, dest);
   105     dest = SimpleSerializer<int32_t>::Write(line.source_file_id, dest);
   106     dest = SimpleSerializer<int32_t>::Write(line.line, dest);
   107     return dest;
   108   }
   109 };
   111 // Specializations of SimpleSerializer: PublicSymbol
   112 template<>
   113 class SimpleSerializer<BasicSourceLineResolver::PublicSymbol> {
   114   typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;
   115  public:
   116   static size_t SizeOf(const PublicSymbol &pubsymbol) {
   117     return SimpleSerializer<string>::SizeOf(pubsymbol.name)
   118          + SimpleSerializer<MemAddr>::SizeOf(pubsymbol.address)
   119          + SimpleSerializer<int32_t>::SizeOf(pubsymbol.parameter_size);
   120   }
   121   static char *Write(const PublicSymbol &pubsymbol, char *dest) {
   122     dest = SimpleSerializer<string>::Write(pubsymbol.name, dest);
   123     dest = SimpleSerializer<MemAddr>::Write(pubsymbol.address, dest);
   124     dest = SimpleSerializer<int32_t>::Write(pubsymbol.parameter_size, dest);
   125     return dest;
   126   }
   127 };
   129 // Specializations of SimpleSerializer: WindowsFrameInfo
   130 template<>
   131 class SimpleSerializer<WindowsFrameInfo> {
   132  public:
   133   static size_t SizeOf(const WindowsFrameInfo &wfi) {
   134     unsigned int size = 0;
   135     size += sizeof(int32_t);  // wfi.type_
   136     size += SimpleSerializer<int32_t>::SizeOf(wfi.valid);
   137     size += SimpleSerializer<uint32_t>::SizeOf(wfi.prolog_size);
   138     size += SimpleSerializer<uint32_t>::SizeOf(wfi.epilog_size);
   139     size += SimpleSerializer<uint32_t>::SizeOf(wfi.parameter_size);
   140     size += SimpleSerializer<uint32_t>::SizeOf(wfi.saved_register_size);
   141     size += SimpleSerializer<uint32_t>::SizeOf(wfi.local_size);
   142     size += SimpleSerializer<uint32_t>::SizeOf(wfi.max_stack_size);
   143     size += SimpleSerializer<bool>::SizeOf(wfi.allocates_base_pointer);
   144     size += SimpleSerializer<string>::SizeOf(wfi.program_string);
   145     return size;
   146   }
   147   static char *Write(const WindowsFrameInfo &wfi, char *dest) {
   148     dest = SimpleSerializer<int32_t>::Write(
   149         static_cast<const int32_t>(wfi.type_), dest);
   150     dest = SimpleSerializer<int32_t>::Write(wfi.valid, dest);
   151     dest = SimpleSerializer<uint32_t>::Write(wfi.prolog_size, dest);
   152     dest = SimpleSerializer<uint32_t>::Write(wfi.epilog_size, dest);
   153     dest = SimpleSerializer<uint32_t>::Write(wfi.parameter_size, dest);
   154     dest = SimpleSerializer<uint32_t>::Write(wfi.saved_register_size, dest);
   155     dest = SimpleSerializer<uint32_t>::Write(wfi.local_size, dest);
   156     dest = SimpleSerializer<uint32_t>::Write(wfi.max_stack_size, dest);
   157     dest = SimpleSerializer<bool>::Write(wfi.allocates_base_pointer, dest);
   158     return SimpleSerializer<string>::Write(wfi.program_string, dest);
   159   }
   160 };
   162 // Specializations of SimpleSerializer: Linked_ptr version of
   163 // Line, Function, PublicSymbol, WindowsFrameInfo.
   164 template<>
   165 class SimpleSerializer< linked_ptr<BasicSourceLineResolver::Line> > {
   166   typedef BasicSourceLineResolver::Line Line;
   167  public:
   168   static size_t SizeOf(const linked_ptr<Line> &lineptr) {
   169     if (lineptr.get() == NULL) return 0;
   170     return SimpleSerializer<Line>::SizeOf(*(lineptr.get()));
   171   }
   172   static char *Write(const linked_ptr<Line> &lineptr, char *dest) {
   173     if (lineptr.get())
   174       dest = SimpleSerializer<Line>::Write(*(lineptr.get()), dest);
   175     return dest;
   176   }
   177 };
   179 template<>
   180 class SimpleSerializer<BasicSourceLineResolver::Function> {
   181   // Convenient type names.
   182   typedef BasicSourceLineResolver::Function Function;
   183   typedef BasicSourceLineResolver::Line Line;
   184  public:
   185   static size_t SizeOf(const Function &func) {
   186     unsigned int size = 0;
   187     size += SimpleSerializer<string>::SizeOf(func.name);
   188     size += SimpleSerializer<MemAddr>::SizeOf(func.address);
   189     size += SimpleSerializer<MemAddr>::SizeOf(func.size);
   190     size += SimpleSerializer<int32_t>::SizeOf(func.parameter_size);
   191     size += range_map_serializer_.SizeOf(func.lines);
   192     return size;
   193   }
   195   static char *Write(const Function &func, char *dest) {
   196     dest = SimpleSerializer<string>::Write(func.name, dest);
   197     dest = SimpleSerializer<MemAddr>::Write(func.address, dest);
   198     dest = SimpleSerializer<MemAddr>::Write(func.size, dest);
   199     dest = SimpleSerializer<int32_t>::Write(func.parameter_size, dest);
   200     dest = range_map_serializer_.Write(func.lines, dest);
   201     return dest;
   202   }
   203  private:
   204   // This static member is defined in module_serializer.cc.
   205   static RangeMapSerializer< MemAddr, linked_ptr<Line> > range_map_serializer_;
   206 };
   208 template<>
   209 class SimpleSerializer< linked_ptr<BasicSourceLineResolver::Function> > {
   210   typedef BasicSourceLineResolver::Function Function;
   211  public:
   212   static size_t SizeOf(const linked_ptr<Function> &func) {
   213     if (!func.get()) return 0;
   214     return SimpleSerializer<Function>::SizeOf(*(func.get()));
   215   }
   217   static char *Write(const linked_ptr<Function> &func, char *dest) {
   218     if (func.get())
   219       dest = SimpleSerializer<Function>::Write(*(func.get()), dest);
   220     return dest;
   221   }
   222 };
   224 template<>
   225 class SimpleSerializer< linked_ptr<BasicSourceLineResolver::PublicSymbol> > {
   226   typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;
   227  public:
   228   static size_t SizeOf(const linked_ptr<PublicSymbol> &pubsymbol) {
   229     if (pubsymbol.get() == NULL) return 0;
   230     return SimpleSerializer<PublicSymbol>::SizeOf(*(pubsymbol.get()));
   231   }
   232   static char *Write(const linked_ptr<PublicSymbol> &pubsymbol, char *dest) {
   233     if (pubsymbol.get())
   234       dest = SimpleSerializer<PublicSymbol>::Write(*(pubsymbol.get()), dest);
   235     return dest;
   236   }
   237 };
   239 template<>
   240 class SimpleSerializer< linked_ptr<WindowsFrameInfo> > {
   241  public:
   242   static size_t SizeOf(const linked_ptr<WindowsFrameInfo> &wfi) {
   243     if (wfi.get() == NULL) return 0;
   244     return SimpleSerializer<WindowsFrameInfo>::SizeOf(*(wfi.get()));
   245   }
   246   static char *Write(const linked_ptr<WindowsFrameInfo> &wfi, char *dest) {
   247     if (wfi.get())
   248       dest = SimpleSerializer<WindowsFrameInfo>::Write(*(wfi.get()), dest);
   249     return dest;
   250   }
   251 };
   253 }  // namespace google_breakpad
   255 #endif  // PROCESSOR_SIMPLE_SERIALIZER_INL_H__

mercurial