Chromium Code Reviews| 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 |