1// Copyright 2006-2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// The infrastructure used for (localized) message reporting in V8.
29//
30// Note: there's a big unresolved issue about ownership of the data
31// structures used by this framework.
32
33#ifndef V8_MESSAGES_H_
34#define V8_MESSAGES_H_
35
36#include "handles-inl.h"
37
38// Forward declaration of MessageLocation.
39namespace v8 {
40namespace internal {
41class MessageLocation;
42} }  // namespace v8::internal
43
44
45class V8Message {
46 public:
47  V8Message(char* type,
48            v8::internal::Handle<v8::internal::JSArray> args,
49            const v8::internal::MessageLocation* loc) :
50      type_(type), args_(args), loc_(loc) { }
51  char* type() const { return type_; }
52  v8::internal::Handle<v8::internal::JSArray> args() const { return args_; }
53  const v8::internal::MessageLocation* loc() const { return loc_; }
54 private:
55  char* type_;
56  v8::internal::Handle<v8::internal::JSArray> const args_;
57  const v8::internal::MessageLocation* loc_;
58};
59
60
61namespace v8 {
62namespace internal {
63
64struct Language;
65class SourceInfo;
66
67class MessageLocation {
68 public:
69  MessageLocation(Handle<Script> script,
70                  int start_pos,
71                  int end_pos)
72      : script_(script),
73        start_pos_(start_pos),
74        end_pos_(end_pos) { }
75  MessageLocation() : start_pos_(-1), end_pos_(-1) { }
76
77  Handle<Script> script() const { return script_; }
78  int start_pos() const { return start_pos_; }
79  int end_pos() const { return end_pos_; }
80
81 private:
82  Handle<Script> script_;
83  int start_pos_;
84  int end_pos_;
85};
86
87
88// A message handler is a convenience interface for accessing the list
89// of message listeners registered in an environment
90class MessageHandler {
91 public:
92  // Returns a message object for the API to use.
93  static Handle<JSMessageObject> MakeMessageObject(
94      const char* type,
95      MessageLocation* loc,
96      Vector< Handle<Object> > args,
97      Handle<String> stack_trace,
98      Handle<JSArray> stack_frames);
99
100  // Report a formatted message (needs JS allocation).
101  static void ReportMessage(Isolate* isolate,
102                            MessageLocation* loc,
103                            Handle<Object> message);
104
105  static void DefaultMessageReport(const MessageLocation* loc,
106                                   Handle<Object> message_obj);
107  static Handle<String> GetMessage(Handle<Object> data);
108  static SmartArrayPointer<char> GetLocalizedMessage(Handle<Object> data);
109};
110
111} }  // namespace v8::internal
112
113#endif  // V8_MESSAGES_H_
114