summaryrefslogtreecommitdiff
path: root/js/src/vm/ErrorReporting.h
blob: 96f3ef6f49cb80baed98752b4e1defd96746dd9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef vm_ErrorReporting_h
#define vm_ErrorReporting_h

#include "mozilla/Move.h"

#include <stdarg.h>

#include "jsapi.h" // for JSErrorNotes, JSErrorReport

#include "js/UniquePtr.h" // for UniquePtr
#include "js/Utility.h" // for UniqueTwoByteChars

struct JSContext;

namespace js {

/**
 * Metadata for a compilation error (or warning) at a particular offset, or at
 * no offset (i.e. with respect to a script overall).
 */
struct ErrorMetadata
{
    // The file/URL where the error occurred.
    const char* filename;

    // The line and column numbers where the error occurred.  If the error
    // is with respect to the entire script and not with respect to a
    // particular location, these will both be zero.
    uint32_t lineNumber;
    uint32_t columnNumber;

    // If the error occurs at a particular location, context surrounding the
    // location of the error: the line that contained the error, or a small
    // portion of it if the line is long.
    //
    // This information is provided on a best-effort basis: code populating
    // ErrorMetadata instances isn't obligated to supply this.
    JS::UniqueTwoByteChars lineOfContext;

    // If |lineOfContext| is non-null, its length.
    size_t lineLength;

    // If |lineOfContext| is non-null, the offset within it of the token that
    // triggered the error.
    size_t tokenOffset;

    // Whether the error is "muted" because it derives from a cross-origin
    // load.  See the comment in TransitiveCompileOptions in jsapi.h for
    // details.
    bool isMuted;
};

class CompileError : public JSErrorReport
{
  public:
    void throwError(JSContext* cx);
};

/** Send a JSErrorReport to the warningReporter callback. */
extern void
CallWarningReporter(JSContext* cx, JSErrorReport* report);

/**
 * Report a compile error during script processing prior to execution of the
 * script.
 */
extern void
ReportCompileError(ErrorMetadata&& metadata, UniquePtr<JSErrorNotes> notes,
                   unsigned flags, unsigned errorNumber, va_list args);

/**
 * Report a compile warning during script processing prior to execution of the
 * script.  Returns true if the warning was successfully reported, false if an
 * error occurred.
 *
 * This function DOES NOT respect an existing werror option.  If the caller
 * wishes such option to be respected, it must do so itself.
 */
[[nodiscard]] extern bool
ReportCompileWarning(JSContext* cx, ErrorMetadata&& metadata, UniquePtr<JSErrorNotes> notes,
                     unsigned flags, unsigned errorNumber, va_list args);

} // namespace js

#endif /* vm_ErrorReporting_h */