OLD | NEW |
1 | 1 |
2 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 2 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
3 // Redistribution and use in source and binary forms, with or without | 3 // Redistribution and use in source and binary forms, with or without |
4 // modification, are permitted provided that the following conditions are | 4 // modification, are permitted provided that the following conditions are |
5 // met: | 5 // met: |
6 // | 6 // |
7 // * Redistributions of source code must retain the above copyright | 7 // * Redistributions of source code must retain the above copyright |
8 // notice, this list of conditions and the following disclaimer. | 8 // notice, this list of conditions and the following disclaimer. |
9 // * Redistributions in binary form must reproduce the above | 9 // * Redistributions in binary form must reproduce the above |
10 // copyright notice, this list of conditions and the following | 10 // copyright notice, this list of conditions and the following |
(...skipping 14 matching lines...) Expand all Loading... |
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | 28 |
29 #include "v8.h" | 29 #include "v8.h" |
30 | 30 |
31 #include "api.h" | 31 #include "api.h" |
32 #include "execution.h" | 32 #include "execution.h" |
33 #include "messages.h" | 33 #include "messages.h" |
34 #include "spaces-inl.h" | 34 #include "spaces-inl.h" |
35 #include "top.h" | |
36 | 35 |
37 namespace v8 { | 36 namespace v8 { |
38 namespace internal { | 37 namespace internal { |
39 | 38 |
40 | 39 |
41 // If no message listeners have been registered this one is called | 40 // If no message listeners have been registered this one is called |
42 // by default. | 41 // by default. |
43 void MessageHandler::DefaultMessageReport(const MessageLocation* loc, | 42 void MessageHandler::DefaultMessageReport(const MessageLocation* loc, |
44 Handle<Object> message_obj) { | 43 Handle<Object> message_obj) { |
45 SmartPointer<char> str = GetLocalizedMessage(message_obj); | 44 SmartPointer<char> str = GetLocalizedMessage(message_obj); |
(...skipping 15 matching lines...) Expand all Loading... |
61 PrintF("%s\n", msg); | 60 PrintF("%s\n", msg); |
62 } | 61 } |
63 | 62 |
64 | 63 |
65 Handle<JSMessageObject> MessageHandler::MakeMessageObject( | 64 Handle<JSMessageObject> MessageHandler::MakeMessageObject( |
66 const char* type, | 65 const char* type, |
67 MessageLocation* loc, | 66 MessageLocation* loc, |
68 Vector< Handle<Object> > args, | 67 Vector< Handle<Object> > args, |
69 Handle<String> stack_trace, | 68 Handle<String> stack_trace, |
70 Handle<JSArray> stack_frames) { | 69 Handle<JSArray> stack_frames) { |
71 Handle<String> type_handle = Factory::LookupAsciiSymbol(type); | 70 Handle<String> type_handle = FACTORY->LookupAsciiSymbol(type); |
72 Handle<FixedArray> arguments_elements = | 71 Handle<FixedArray> arguments_elements = |
73 Factory::NewFixedArray(args.length()); | 72 FACTORY->NewFixedArray(args.length()); |
74 for (int i = 0; i < args.length(); i++) { | 73 for (int i = 0; i < args.length(); i++) { |
75 arguments_elements->set(i, *args[i]); | 74 arguments_elements->set(i, *args[i]); |
76 } | 75 } |
77 Handle<JSArray> arguments_handle = | 76 Handle<JSArray> arguments_handle = |
78 Factory::NewJSArrayWithElements(arguments_elements); | 77 FACTORY->NewJSArrayWithElements(arguments_elements); |
79 | 78 |
80 int start = 0; | 79 int start = 0; |
81 int end = 0; | 80 int end = 0; |
82 Handle<Object> script_handle = Factory::undefined_value(); | 81 Handle<Object> script_handle = FACTORY->undefined_value(); |
83 if (loc) { | 82 if (loc) { |
84 start = loc->start_pos(); | 83 start = loc->start_pos(); |
85 end = loc->end_pos(); | 84 end = loc->end_pos(); |
86 script_handle = GetScriptWrapper(loc->script()); | 85 script_handle = GetScriptWrapper(loc->script()); |
87 } | 86 } |
88 | 87 |
89 Handle<Object> stack_trace_handle = stack_trace.is_null() | 88 Handle<Object> stack_trace_handle = stack_trace.is_null() |
90 ? Factory::undefined_value() | 89 ? FACTORY->undefined_value() |
91 : Handle<Object>::cast(stack_trace); | 90 : Handle<Object>::cast(stack_trace); |
92 | 91 |
93 Handle<Object> stack_frames_handle = stack_frames.is_null() | 92 Handle<Object> stack_frames_handle = stack_frames.is_null() |
94 ? Factory::undefined_value() | 93 ? FACTORY->undefined_value() |
95 : Handle<Object>::cast(stack_frames); | 94 : Handle<Object>::cast(stack_frames); |
96 | 95 |
97 Handle<JSMessageObject> message = | 96 Handle<JSMessageObject> message = |
98 Factory::NewJSMessageObject(type_handle, | 97 FACTORY->NewJSMessageObject(type_handle, |
99 arguments_handle, | 98 arguments_handle, |
100 start, | 99 start, |
101 end, | 100 end, |
102 script_handle, | 101 script_handle, |
103 stack_trace_handle, | 102 stack_trace_handle, |
104 stack_frames_handle); | 103 stack_frames_handle); |
105 | 104 |
106 return message; | 105 return message; |
107 } | 106 } |
108 | 107 |
109 | 108 |
110 void MessageHandler::ReportMessage(MessageLocation* loc, | 109 void MessageHandler::ReportMessage(MessageLocation* loc, |
111 Handle<Object> message) { | 110 Handle<Object> message) { |
112 v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message); | 111 v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message); |
113 | 112 |
114 v8::NeanderArray global_listeners(Factory::message_listeners()); | 113 v8::NeanderArray global_listeners(FACTORY->message_listeners()); |
115 int global_length = global_listeners.length(); | 114 int global_length = global_listeners.length(); |
116 if (global_length == 0) { | 115 if (global_length == 0) { |
117 DefaultMessageReport(loc, message); | 116 DefaultMessageReport(loc, message); |
118 } else { | 117 } else { |
119 for (int i = 0; i < global_length; i++) { | 118 for (int i = 0; i < global_length; i++) { |
120 HandleScope scope; | 119 HandleScope scope; |
121 if (global_listeners.get(i)->IsUndefined()) continue; | 120 if (global_listeners.get(i)->IsUndefined()) continue; |
122 v8::NeanderObject listener(JSObject::cast(global_listeners.get(i))); | 121 v8::NeanderObject listener(JSObject::cast(global_listeners.get(i))); |
123 Handle<Proxy> callback_obj(Proxy::cast(listener.get(0))); | 122 Handle<Proxy> callback_obj(Proxy::cast(listener.get(0))); |
124 v8::MessageCallback callback = | 123 v8::MessageCallback callback = |
125 FUNCTION_CAST<v8::MessageCallback>(callback_obj->proxy()); | 124 FUNCTION_CAST<v8::MessageCallback>(callback_obj->proxy()); |
126 Handle<Object> callback_data(listener.get(1)); | 125 Handle<Object> callback_data(listener.get(1)); |
127 callback(api_message_obj, v8::Utils::ToLocal(callback_data)); | 126 callback(api_message_obj, v8::Utils::ToLocal(callback_data)); |
128 } | 127 } |
129 } | 128 } |
130 } | 129 } |
131 | 130 |
132 | 131 |
133 Handle<String> MessageHandler::GetMessage(Handle<Object> data) { | 132 Handle<String> MessageHandler::GetMessage(Handle<Object> data) { |
134 Handle<String> fmt_str = Factory::LookupAsciiSymbol("FormatMessage"); | 133 Handle<String> fmt_str = FACTORY->LookupAsciiSymbol("FormatMessage"); |
135 Handle<JSFunction> fun = | 134 Handle<JSFunction> fun = |
136 Handle<JSFunction>(JSFunction::cast( | 135 Handle<JSFunction>( |
137 Top::builtins()->GetPropertyNoExceptionThrown(*fmt_str))); | 136 JSFunction::cast( |
| 137 Isolate::Current()->js_builtins_object()-> |
| 138 GetPropertyNoExceptionThrown(*fmt_str))); |
138 Object** argv[1] = { data.location() }; | 139 Object** argv[1] = { data.location() }; |
139 | 140 |
140 bool caught_exception; | 141 bool caught_exception; |
141 Handle<Object> result = | 142 Handle<Object> result = |
142 Execution::TryCall(fun, Top::builtins(), 1, argv, &caught_exception); | 143 Execution::TryCall(fun, |
| 144 Isolate::Current()->js_builtins_object(), 1, argv, &caught_exception); |
143 | 145 |
144 if (caught_exception || !result->IsString()) { | 146 if (caught_exception || !result->IsString()) { |
145 return Factory::LookupAsciiSymbol("<error>"); | 147 return FACTORY->LookupAsciiSymbol("<error>"); |
146 } | 148 } |
147 Handle<String> result_string = Handle<String>::cast(result); | 149 Handle<String> result_string = Handle<String>::cast(result); |
148 // A string that has been obtained from JS code in this way is | 150 // A string that has been obtained from JS code in this way is |
149 // likely to be a complicated ConsString of some sort. We flatten it | 151 // likely to be a complicated ConsString of some sort. We flatten it |
150 // here to improve the efficiency of converting it to a C string and | 152 // here to improve the efficiency of converting it to a C string and |
151 // other operations that are likely to take place (see GetLocalizedMessage | 153 // other operations that are likely to take place (see GetLocalizedMessage |
152 // for example). | 154 // for example). |
153 FlattenString(result_string); | 155 FlattenString(result_string); |
154 return result_string; | 156 return result_string; |
155 } | 157 } |
156 | 158 |
157 | 159 |
158 SmartPointer<char> MessageHandler::GetLocalizedMessage(Handle<Object> data) { | 160 SmartPointer<char> MessageHandler::GetLocalizedMessage(Handle<Object> data) { |
159 HandleScope scope; | 161 HandleScope scope; |
160 return GetMessage(data)->ToCString(DISALLOW_NULLS); | 162 return GetMessage(data)->ToCString(DISALLOW_NULLS); |
161 } | 163 } |
162 | 164 |
163 | 165 |
164 } } // namespace v8::internal | 166 } } // namespace v8::internal |
OLD | NEW |