OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/messages.h" | 5 #include "src/messages.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/execution.h" | 8 #include "src/execution.h" |
9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
10 #include "src/string-builder.h" | 10 #include "src/string-builder.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
161 Isolate* isolate, Handle<Object> data) { | 161 Isolate* isolate, Handle<Object> data) { |
162 HandleScope scope(isolate); | 162 HandleScope scope(isolate); |
163 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); | 163 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); |
164 } | 164 } |
165 | 165 |
166 | 166 |
167 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) | 167 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) |
168 : isolate_(isolate) { | 168 : isolate_(isolate) { |
169 Handle<Object> maybe_function = JSObject::GetDataProperty( | 169 Handle<Object> maybe_function = JSObject::GetDataProperty( |
170 call_site_obj, isolate->factory()->call_site_function_symbol()); | 170 call_site_obj, isolate->factory()->call_site_function_symbol()); |
171 if (!maybe_function->IsJSFunction()) return; | 171 Handle<Object> maybe_wasm_func_index; |
172 if (maybe_function->IsJSFunction()) { | |
173 // javascript | |
174 fun_ = Handle<JSFunction>::cast(maybe_function); | |
175 receiver_ = JSObject::GetDataProperty( | |
176 call_site_obj, isolate->factory()->call_site_receiver_symbol()); | |
177 } else if (!(maybe_wasm_func_index = JSObject::GetDataProperty( | |
178 call_site_obj, | |
179 isolate->factory()->call_site_wasm_func_index_symbol())) | |
180 ->IsUndefined()) { | |
181 // wasm | |
182 wasm_obj_ = JSObject::GetDataProperty( | |
183 call_site_obj, isolate->factory()->call_site_wasm_obj_symbol()); | |
184 CHECK(maybe_wasm_func_index->ToUint32(&wasm_func_index_)); | |
185 } else { | |
186 return; | |
187 } | |
172 | 188 |
173 fun_ = Handle<JSFunction>::cast(maybe_function); | |
174 receiver_ = JSObject::GetDataProperty( | |
175 call_site_obj, isolate->factory()->call_site_receiver_symbol()); | |
176 CHECK(JSObject::GetDataProperty( | 189 CHECK(JSObject::GetDataProperty( |
177 call_site_obj, isolate->factory()->call_site_position_symbol()) | 190 call_site_obj, isolate->factory()->call_site_position_symbol()) |
178 ->ToInt32(&pos_)); | 191 ->ToInt32(&pos_)); |
179 } | 192 } |
180 | 193 |
181 | 194 |
182 Handle<Object> CallSite::GetFileName() { | 195 Handle<Object> CallSite::GetFileName() { |
183 Handle<Object> script(fun_->shared()->script(), isolate_); | 196 Object* script; |
184 if (script->IsScript()) { | 197 if (!IsJavaScript() || !(script = fun_->shared()->script())->IsScript()) |
185 return Handle<Object>(Handle<Script>::cast(script)->name(), isolate_); | 198 return isolate_->factory()->null_value(); |
186 } | 199 return Handle<Object>(Script::cast(script)->name(), isolate_); |
187 return isolate_->factory()->null_value(); | |
188 } | 200 } |
189 | 201 |
190 | 202 |
191 Handle<Object> CallSite::GetFunctionName() { | 203 Handle<Object> CallSite::GetFunctionName() { |
204 if (!IsJavaScript()) return isolate_->factory()->null_value(); | |
titzer
2016/04/22 12:16:25
We probably want to use the WASM function name her
Clemens Hammacher
2016/04/26 14:00:10
Oh, definitely. Forgot to change this. Nice catch!
| |
192 Handle<String> result = JSFunction::GetName(fun_); | 205 Handle<String> result = JSFunction::GetName(fun_); |
193 if (result->length() != 0) return result; | 206 if (result->length() != 0) return result; |
194 | 207 |
195 Handle<Object> script(fun_->shared()->script(), isolate_); | 208 Handle<Object> script(fun_->shared()->script(), isolate_); |
196 if (script->IsScript() && | 209 if (script->IsScript() && |
197 Handle<Script>::cast(script)->compilation_type() == | 210 Handle<Script>::cast(script)->compilation_type() == |
198 Script::COMPILATION_TYPE_EVAL) { | 211 Script::COMPILATION_TYPE_EVAL) { |
199 return isolate_->factory()->eval_string(); | 212 return isolate_->factory()->eval_string(); |
200 } | 213 } |
201 return isolate_->factory()->null_value(); | 214 return isolate_->factory()->null_value(); |
202 } | 215 } |
203 | 216 |
204 | |
205 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { | 217 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { |
206 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 218 Object* script_obj; |
207 if (script_obj->IsScript()) { | 219 if (!IsJavaScript() || !(script_obj = fun_->shared()->script())->IsScript()) |
208 Handle<Script> script = Handle<Script>::cast(script_obj); | 220 return isolate_->factory()->null_value(); |
209 Object* source_url = script->source_url(); | 221 Handle<Script> script(Script::cast(script_obj), isolate_); |
210 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); | 222 Object* source_url = script->source_url(); |
211 return Handle<Object>(script->name(), isolate_); | 223 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); |
212 } | 224 return Handle<Object>(script->name(), isolate_); |
213 return isolate_->factory()->null_value(); | |
214 } | 225 } |
215 | 226 |
216 | |
217 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, | 227 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, |
218 Handle<JSFunction> fun, | 228 Handle<JSFunction> fun, |
219 LookupIterator::Configuration config) { | 229 LookupIterator::Configuration config) { |
220 LookupIterator iter = | 230 LookupIterator iter = |
221 LookupIterator::PropertyOrElement(isolate, obj, name, config); | 231 LookupIterator::PropertyOrElement(isolate, obj, name, config); |
222 if (iter.state() == LookupIterator::DATA) { | 232 if (iter.state() == LookupIterator::DATA) { |
223 return iter.GetDataValue().is_identical_to(fun); | 233 return iter.GetDataValue().is_identical_to(fun); |
224 } else if (iter.state() == LookupIterator::ACCESSOR) { | 234 } else if (iter.state() == LookupIterator::ACCESSOR) { |
225 Handle<Object> accessors = iter.GetAccessors(); | 235 Handle<Object> accessors = iter.GetAccessors(); |
226 if (accessors->IsAccessorPair()) { | 236 if (accessors->IsAccessorPair()) { |
227 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); | 237 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); |
228 return pair->getter() == *fun || pair->setter() == *fun; | 238 return pair->getter() == *fun || pair->setter() == *fun; |
229 } | 239 } |
230 } | 240 } |
231 return false; | 241 return false; |
232 } | 242 } |
233 | 243 |
234 | 244 |
235 Handle<Object> CallSite::GetMethodName() { | 245 Handle<Object> CallSite::GetMethodName() { |
236 if (receiver_->IsNull() || receiver_->IsUndefined()) { | 246 if (!IsJavaScript() || receiver_->IsNull() || receiver_->IsUndefined()) { |
237 return isolate_->factory()->null_value(); | 247 return isolate_->factory()->null_value(); |
238 } | 248 } |
239 Handle<JSReceiver> receiver = | 249 Handle<JSReceiver> receiver = |
240 Object::ToObject(isolate_, receiver_).ToHandleChecked(); | 250 Object::ToObject(isolate_, receiver_).ToHandleChecked(); |
241 if (!receiver->IsJSObject()) { | 251 if (!receiver->IsJSObject()) { |
242 return isolate_->factory()->null_value(); | 252 return isolate_->factory()->null_value(); |
243 } | 253 } |
244 | 254 |
245 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); | 255 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); |
246 Handle<Object> function_name(fun_->shared()->name(), isolate_); | 256 Handle<Object> function_name(fun_->shared()->name(), isolate_); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
284 result = inner_scope.CloseAndEscape(name_key); | 294 result = inner_scope.CloseAndEscape(name_key); |
285 } | 295 } |
286 } | 296 } |
287 | 297 |
288 if (!result.is_null()) return outer_scope.CloseAndEscape(result); | 298 if (!result.is_null()) return outer_scope.CloseAndEscape(result); |
289 return isolate_->factory()->null_value(); | 299 return isolate_->factory()->null_value(); |
290 } | 300 } |
291 | 301 |
292 | 302 |
293 int CallSite::GetLineNumber() { | 303 int CallSite::GetLineNumber() { |
294 if (pos_ >= 0) { | 304 if (pos_ >= 0 && IsJavaScript()) { |
295 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 305 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
296 if (script_obj->IsScript()) { | 306 if (script_obj->IsScript()) { |
297 Handle<Script> script = Handle<Script>::cast(script_obj); | 307 Handle<Script> script = Handle<Script>::cast(script_obj); |
298 return Script::GetLineNumber(script, pos_) + 1; | 308 return Script::GetLineNumber(script, pos_) + 1; |
299 } | 309 } |
300 } | 310 } |
301 return -1; | 311 return -1; |
302 } | 312 } |
303 | 313 |
304 | 314 |
305 int CallSite::GetColumnNumber() { | 315 int CallSite::GetColumnNumber() { |
306 if (pos_ >= 0) { | 316 if (pos_ >= 0 && IsJavaScript()) { |
307 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 317 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
308 if (script_obj->IsScript()) { | 318 if (script_obj->IsScript()) { |
309 Handle<Script> script = Handle<Script>::cast(script_obj); | 319 Handle<Script> script = Handle<Script>::cast(script_obj); |
310 return Script::GetColumnNumber(script, pos_) + 1; | 320 return Script::GetColumnNumber(script, pos_) + 1; |
311 } | 321 } |
312 } | 322 } |
313 return -1; | 323 return -1; |
314 } | 324 } |
315 | 325 |
316 | 326 |
317 bool CallSite::IsNative() { | 327 bool CallSite::IsNative() { |
328 if (!IsJavaScript()) return false; | |
318 Handle<Object> script(fun_->shared()->script(), isolate_); | 329 Handle<Object> script(fun_->shared()->script(), isolate_); |
319 return script->IsScript() && | 330 return script->IsScript() && |
320 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; | 331 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; |
321 } | 332 } |
322 | 333 |
323 | 334 |
324 bool CallSite::IsToplevel() { | 335 bool CallSite::IsToplevel() { |
325 return receiver_->IsJSGlobalProxy() || receiver_->IsNull() || | 336 return IsWasm() || receiver_->IsJSGlobalProxy() || receiver_->IsNull() || |
titzer
2016/04/22 12:16:26
I think isTopLevel for WASM should be false.
Clemens Hammacher
2016/04/26 14:00:10
Probably, yes. It's a bit unclear from the documen
| |
326 receiver_->IsUndefined(); | 337 receiver_->IsUndefined(); |
327 } | 338 } |
328 | 339 |
329 | 340 |
330 bool CallSite::IsEval() { | 341 bool CallSite::IsEval() { |
342 if (!IsJavaScript()) return false; | |
331 Handle<Object> script(fun_->shared()->script(), isolate_); | 343 Handle<Object> script(fun_->shared()->script(), isolate_); |
332 return script->IsScript() && | 344 return script->IsScript() && |
333 Handle<Script>::cast(script)->compilation_type() == | 345 Handle<Script>::cast(script)->compilation_type() == |
334 Script::COMPILATION_TYPE_EVAL; | 346 Script::COMPILATION_TYPE_EVAL; |
335 } | 347 } |
336 | 348 |
337 | 349 |
338 bool CallSite::IsConstructor() { | 350 bool CallSite::IsConstructor() { |
339 if (!receiver_->IsJSObject()) return false; | 351 if (!IsJavaScript() || !receiver_->IsJSObject()) return false; |
340 Handle<Object> constructor = | 352 Handle<Object> constructor = |
341 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), | 353 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), |
342 isolate_->factory()->constructor_string()); | 354 isolate_->factory()->constructor_string()); |
343 return constructor.is_identical_to(fun_); | 355 return constructor.is_identical_to(fun_); |
344 } | 356 } |
345 | 357 |
346 | 358 |
347 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, | 359 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, |
348 int template_index, | 360 int template_index, |
349 Handle<Object> arg) { | 361 Handle<Object> arg) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
421 builder.AppendCharacter(*c); | 433 builder.AppendCharacter(*c); |
422 } | 434 } |
423 } | 435 } |
424 | 436 |
425 return builder.Finish(); | 437 return builder.Finish(); |
426 } | 438 } |
427 | 439 |
428 | 440 |
429 } // namespace internal | 441 } // namespace internal |
430 } // namespace v8 | 442 } // namespace v8 |
OLD | NEW |