js/src/gdb/gdb-tests.h

Thu, 15 Jan 2015 15:55:04 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:55:04 +0100
branch
TOR_BUG_9701
changeset 9
a63d609f5ebe
permissions
-rw-r--r--

Back out 97036ab72558 which inappropriately compared turds to third parties.

     1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     2  * vim: set ts=8 sts=4 et sw=4 tw=99:
     3  *
     4  * This Source Code Form is subject to the terms of the Mozilla Public
     5  * License, v. 2.0. If a copy of the MPL was not distributed with this
     6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     8 #ifndef gdb_gdb_tests_h
     9 #define gdb_gdb_tests_h
    11 // Support for C++ fragments to be used by Python unit tests for SpiderMonkey's
    12 // GDB support.
    13 //
    14 // That is:
    15 // - js/src/gdb/mozilla holds the actual GDB SpiderMonkey support code.
    16 // - Each '.py' file in js/src/gdb/tests is a unit test for the above.
    17 // - Each '.cpp' file in js/src/gdb/tests is C++ code for one of the unit tests
    18 //   to run.
    19 //
    20 // (So the .cpp files are two steps removed from being anything one would
    21 // actually run.)
    23 #include "NamespaceImports.h"
    25 void breakpoint();
    27 struct GDBFragment {
    28     GDBFragment() {
    29         next = allFragments;
    30         allFragments = this;
    31     }
    33     // The name of this fragment. gdb-tests.cpp runs the fragments whose names
    34     // are passed to it on the command line.
    35     virtual const char *name() = 0;
    37     // Run the fragment code. |argv| is a reference to the pointer into the
    38     // command-line argument vector, referring to the argument immediately
    39     // following this fragment's name. The fragment can consume arguments and
    40     // advance argv if it wishes.
    41     virtual void run(JSContext *cx, const char **&argv) = 0;
    43     // We declare one instance of this type for each fragment to run. The
    44     // constructor adds each instance to a linked list, of which this is
    45     // the head.
    46     static GDBFragment *allFragments;
    48     // The link in the list of all instances.
    49     GDBFragment *next;
    50 };
    52 // Macro for declaring a C++ fragment for some Python unit test to call. Usage:
    53 //
    54 //   FRAGMENT(<category>, <name>) { <body of fragment function> }
    55 //
    56 // where <category> and <name> are identifiers. The gdb-tests executable
    57 // takes a series of fragment names as command-line arguments and runs them in
    58 // turn; each fragment is named <category>.<name> on the command line.
    59 //
    60 // The body runs in a scope where 'cx' is a usable JSContext *.
    62 #define FRAGMENT(category, subname)                                                             \
    63 class FRAGMENT_CLASS_NAME(category, subname): public GDBFragment {                              \
    64     void run(JSContext *cx, const char **&argv);                                                \
    65     const char *name() { return FRAGMENT_STRING_NAME(category, subname); }                      \
    66     static FRAGMENT_CLASS_NAME(category, subname) singleton;                                    \
    67 };                                                                                              \
    68 FRAGMENT_CLASS_NAME(category, subname) FRAGMENT_CLASS_NAME(category, subname)::singleton;       \
    69 void FRAGMENT_CLASS_NAME(category, subname)::run(JSContext *cx, const char **&argv)
    71 #define FRAGMENT_STRING_NAME(category, subname) (#category "." #subname)
    72 #define FRAGMENT_CLASS_NAME(category, subname) Fragment_ ## category ## _ ## subname
    74 #endif /* gdb_gdb_tests_h */

mercurial