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" |
| 11 #include "src/wasm/wasm-module.h" | |
| 11 | 12 |
| 12 namespace v8 { | 13 namespace v8 { |
| 13 namespace internal { | 14 namespace internal { |
| 14 | 15 |
| 15 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, | 16 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, |
| 16 int end_pos) | 17 int end_pos) |
| 17 : script_(script), start_pos_(start_pos), end_pos_(end_pos) {} | 18 : script_(script), start_pos_(start_pos), end_pos_(end_pos) {} |
| 18 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, | 19 MessageLocation::MessageLocation(Handle<Script> script, int start_pos, |
| 19 int end_pos, Handle<JSFunction> function) | 20 int end_pos, Handle<JSFunction> function) |
| 20 : script_(script), | 21 : script_(script), |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 Isolate* isolate, Handle<Object> data) { | 162 Isolate* isolate, Handle<Object> data) { |
| 162 HandleScope scope(isolate); | 163 HandleScope scope(isolate); |
| 163 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); | 164 return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS); |
| 164 } | 165 } |
| 165 | 166 |
| 166 | 167 |
| 167 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) | 168 CallSite::CallSite(Isolate* isolate, Handle<JSObject> call_site_obj) |
| 168 : isolate_(isolate) { | 169 : isolate_(isolate) { |
| 169 Handle<Object> maybe_function = JSObject::GetDataProperty( | 170 Handle<Object> maybe_function = JSObject::GetDataProperty( |
| 170 call_site_obj, isolate->factory()->call_site_function_symbol()); | 171 call_site_obj, isolate->factory()->call_site_function_symbol()); |
| 171 if (!maybe_function->IsJSFunction()) return; | 172 Handle<Object> maybe_wasm_func_index; |
| 173 if (maybe_function->IsJSFunction()) { | |
| 174 // javascript | |
| 175 fun_ = Handle<JSFunction>::cast(maybe_function); | |
| 176 receiver_ = JSObject::GetDataProperty( | |
| 177 call_site_obj, isolate->factory()->call_site_receiver_symbol()); | |
| 178 } else if (!(maybe_wasm_func_index = JSObject::GetDataProperty( | |
|
Yang
2016/05/03 18:59:08
Please don't do assignments inside an if-expressio
Clemens Hammacher
2016/05/04 09:06:20
Done.
| |
| 179 call_site_obj, | |
| 180 isolate->factory()->call_site_wasm_func_index_symbol())) | |
| 181 ->IsUndefined()) { | |
| 182 // wasm | |
| 183 wasm_obj_ = JSObject::GetDataProperty( | |
| 184 call_site_obj, isolate->factory()->call_site_wasm_obj_symbol()); | |
| 185 CHECK(maybe_wasm_func_index->ToUint32(&wasm_func_index_)); | |
| 186 } else { | |
| 187 return; | |
| 188 } | |
| 172 | 189 |
| 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( | 190 CHECK(JSObject::GetDataProperty( |
| 177 call_site_obj, isolate->factory()->call_site_position_symbol()) | 191 call_site_obj, isolate->factory()->call_site_position_symbol()) |
| 178 ->ToInt32(&pos_)); | 192 ->ToInt32(&pos_)); |
| 179 } | 193 } |
| 180 | 194 |
| 181 | 195 |
| 182 Handle<Object> CallSite::GetFileName() { | 196 Handle<Object> CallSite::GetFileName() { |
| 183 Handle<Object> script(fun_->shared()->script(), isolate_); | 197 Object* script; |
| 184 if (script->IsScript()) { | 198 if (!IsJavaScript() || !(script = fun_->shared()->script())->IsScript()) |
|
Yang
2016/05/03 18:59:08
same here. No assignments inside if-expression. An
Clemens Hammacher
2016/05/04 09:06:20
Done.
| |
| 185 return Handle<Object>(Handle<Script>::cast(script)->name(), isolate_); | 199 return isolate_->factory()->null_value(); |
| 186 } | 200 return Handle<Object>(Script::cast(script)->name(), isolate_); |
| 187 return isolate_->factory()->null_value(); | |
| 188 } | 201 } |
| 189 | 202 |
| 190 | 203 |
| 191 Handle<Object> CallSite::GetFunctionName() { | 204 Handle<Object> CallSite::GetFunctionName() { |
| 205 if (IsWasm()) { | |
| 206 if (wasm_obj_->IsUndefined()) return isolate_->factory()->null_value(); | |
| 207 // wasm_obj_ can be a String if we generate WASM code directly in a test | |
|
Yang
2016/05/03 18:59:08
That... is really weird and sounds like a hack. Wh
Clemens Hammacher
2016/05/04 09:06:20
See above.
Yang
2016/05/04 12:04:27
So, like above, can we hide this detail (introduce
| |
| 208 // case. | |
| 209 if (wasm_obj_->IsString()) return wasm_obj_; | |
| 210 return wasm::GetWasmFunctionName(Handle<JSObject>::cast(wasm_obj_), | |
| 211 wasm_func_index_); | |
| 212 } | |
| 192 Handle<String> result = JSFunction::GetName(fun_); | 213 Handle<String> result = JSFunction::GetName(fun_); |
| 193 if (result->length() != 0) return result; | 214 if (result->length() != 0) return result; |
| 194 | 215 |
| 195 Handle<Object> script(fun_->shared()->script(), isolate_); | 216 Handle<Object> script(fun_->shared()->script(), isolate_); |
| 196 if (script->IsScript() && | 217 if (script->IsScript() && |
| 197 Handle<Script>::cast(script)->compilation_type() == | 218 Handle<Script>::cast(script)->compilation_type() == |
| 198 Script::COMPILATION_TYPE_EVAL) { | 219 Script::COMPILATION_TYPE_EVAL) { |
| 199 return isolate_->factory()->eval_string(); | 220 return isolate_->factory()->eval_string(); |
| 200 } | 221 } |
| 201 return isolate_->factory()->null_value(); | 222 return isolate_->factory()->null_value(); |
| 202 } | 223 } |
| 203 | 224 |
| 204 | |
| 205 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { | 225 Handle<Object> CallSite::GetScriptNameOrSourceUrl() { |
| 206 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 226 Object* script_obj; |
| 207 if (script_obj->IsScript()) { | 227 if (!IsJavaScript() || !(script_obj = fun_->shared()->script())->IsScript()) |
|
Yang
2016/05/03 18:59:08
same as above.
Clemens Hammacher
2016/05/04 09:06:20
Done.
| |
| 208 Handle<Script> script = Handle<Script>::cast(script_obj); | 228 return isolate_->factory()->null_value(); |
| 209 Object* source_url = script->source_url(); | 229 Handle<Script> script(Script::cast(script_obj), isolate_); |
| 210 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); | 230 Object* source_url = script->source_url(); |
| 211 return Handle<Object>(script->name(), isolate_); | 231 if (source_url->IsString()) return Handle<Object>(source_url, isolate_); |
| 212 } | 232 return Handle<Object>(script->name(), isolate_); |
| 213 return isolate_->factory()->null_value(); | |
| 214 } | 233 } |
| 215 | 234 |
| 216 | |
| 217 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, | 235 bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, |
| 218 Handle<JSFunction> fun, | 236 Handle<JSFunction> fun, |
| 219 LookupIterator::Configuration config) { | 237 LookupIterator::Configuration config) { |
| 220 LookupIterator iter = | 238 LookupIterator iter = |
| 221 LookupIterator::PropertyOrElement(isolate, obj, name, config); | 239 LookupIterator::PropertyOrElement(isolate, obj, name, config); |
| 222 if (iter.state() == LookupIterator::DATA) { | 240 if (iter.state() == LookupIterator::DATA) { |
| 223 return iter.GetDataValue().is_identical_to(fun); | 241 return iter.GetDataValue().is_identical_to(fun); |
| 224 } else if (iter.state() == LookupIterator::ACCESSOR) { | 242 } else if (iter.state() == LookupIterator::ACCESSOR) { |
| 225 Handle<Object> accessors = iter.GetAccessors(); | 243 Handle<Object> accessors = iter.GetAccessors(); |
| 226 if (accessors->IsAccessorPair()) { | 244 if (accessors->IsAccessorPair()) { |
| 227 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); | 245 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors); |
| 228 return pair->getter() == *fun || pair->setter() == *fun; | 246 return pair->getter() == *fun || pair->setter() == *fun; |
| 229 } | 247 } |
| 230 } | 248 } |
| 231 return false; | 249 return false; |
| 232 } | 250 } |
| 233 | 251 |
| 234 | 252 |
| 235 Handle<Object> CallSite::GetMethodName() { | 253 Handle<Object> CallSite::GetMethodName() { |
| 236 if (receiver_->IsNull() || receiver_->IsUndefined()) { | 254 if (!IsJavaScript() || receiver_->IsNull() || receiver_->IsUndefined()) { |
| 237 return isolate_->factory()->null_value(); | 255 return isolate_->factory()->null_value(); |
| 238 } | 256 } |
| 239 Handle<JSReceiver> receiver = | 257 Handle<JSReceiver> receiver = |
| 240 Object::ToObject(isolate_, receiver_).ToHandleChecked(); | 258 Object::ToObject(isolate_, receiver_).ToHandleChecked(); |
| 241 if (!receiver->IsJSObject()) { | 259 if (!receiver->IsJSObject()) { |
| 242 return isolate_->factory()->null_value(); | 260 return isolate_->factory()->null_value(); |
| 243 } | 261 } |
| 244 | 262 |
| 245 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); | 263 Handle<JSObject> obj = Handle<JSObject>::cast(receiver); |
| 246 Handle<Object> function_name(fun_->shared()->name(), isolate_); | 264 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); | 302 result = inner_scope.CloseAndEscape(name_key); |
| 285 } | 303 } |
| 286 } | 304 } |
| 287 | 305 |
| 288 if (!result.is_null()) return outer_scope.CloseAndEscape(result); | 306 if (!result.is_null()) return outer_scope.CloseAndEscape(result); |
| 289 return isolate_->factory()->null_value(); | 307 return isolate_->factory()->null_value(); |
| 290 } | 308 } |
| 291 | 309 |
| 292 | 310 |
| 293 int CallSite::GetLineNumber() { | 311 int CallSite::GetLineNumber() { |
| 294 if (pos_ >= 0) { | 312 if (pos_ >= 0 && IsJavaScript()) { |
| 295 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 313 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
| 296 if (script_obj->IsScript()) { | 314 if (script_obj->IsScript()) { |
| 297 Handle<Script> script = Handle<Script>::cast(script_obj); | 315 Handle<Script> script = Handle<Script>::cast(script_obj); |
| 298 return Script::GetLineNumber(script, pos_) + 1; | 316 return Script::GetLineNumber(script, pos_) + 1; |
| 299 } | 317 } |
| 300 } | 318 } |
| 301 return -1; | 319 return -1; |
| 302 } | 320 } |
| 303 | 321 |
| 304 | 322 |
| 305 int CallSite::GetColumnNumber() { | 323 int CallSite::GetColumnNumber() { |
| 306 if (pos_ >= 0) { | 324 if (pos_ >= 0 && IsJavaScript()) { |
| 307 Handle<Object> script_obj(fun_->shared()->script(), isolate_); | 325 Handle<Object> script_obj(fun_->shared()->script(), isolate_); |
| 308 if (script_obj->IsScript()) { | 326 if (script_obj->IsScript()) { |
| 309 Handle<Script> script = Handle<Script>::cast(script_obj); | 327 Handle<Script> script = Handle<Script>::cast(script_obj); |
| 310 return Script::GetColumnNumber(script, pos_) + 1; | 328 return Script::GetColumnNumber(script, pos_) + 1; |
| 311 } | 329 } |
| 312 } | 330 } |
| 313 return -1; | 331 return -1; |
| 314 } | 332 } |
| 315 | 333 |
| 316 | 334 |
| 317 bool CallSite::IsNative() { | 335 bool CallSite::IsNative() { |
| 336 if (!IsJavaScript()) return false; | |
| 318 Handle<Object> script(fun_->shared()->script(), isolate_); | 337 Handle<Object> script(fun_->shared()->script(), isolate_); |
| 319 return script->IsScript() && | 338 return script->IsScript() && |
| 320 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; | 339 Handle<Script>::cast(script)->type() == Script::TYPE_NATIVE; |
| 321 } | 340 } |
| 322 | 341 |
| 323 | 342 |
| 324 bool CallSite::IsToplevel() { | 343 bool CallSite::IsToplevel() { |
| 344 if (IsWasm()) return false; | |
| 325 return receiver_->IsJSGlobalProxy() || receiver_->IsNull() || | 345 return receiver_->IsJSGlobalProxy() || receiver_->IsNull() || |
| 326 receiver_->IsUndefined(); | 346 receiver_->IsUndefined(); |
| 327 } | 347 } |
| 328 | 348 |
| 329 | 349 |
| 330 bool CallSite::IsEval() { | 350 bool CallSite::IsEval() { |
| 351 if (!IsJavaScript()) return false; | |
| 331 Handle<Object> script(fun_->shared()->script(), isolate_); | 352 Handle<Object> script(fun_->shared()->script(), isolate_); |
| 332 return script->IsScript() && | 353 return script->IsScript() && |
| 333 Handle<Script>::cast(script)->compilation_type() == | 354 Handle<Script>::cast(script)->compilation_type() == |
| 334 Script::COMPILATION_TYPE_EVAL; | 355 Script::COMPILATION_TYPE_EVAL; |
| 335 } | 356 } |
| 336 | 357 |
| 337 | 358 |
| 338 bool CallSite::IsConstructor() { | 359 bool CallSite::IsConstructor() { |
| 339 if (!receiver_->IsJSObject()) return false; | 360 if (!IsJavaScript() || !receiver_->IsJSObject()) return false; |
| 340 Handle<Object> constructor = | 361 Handle<Object> constructor = |
| 341 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), | 362 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), |
| 342 isolate_->factory()->constructor_string()); | 363 isolate_->factory()->constructor_string()); |
| 343 return constructor.is_identical_to(fun_); | 364 return constructor.is_identical_to(fun_); |
| 344 } | 365 } |
| 345 | 366 |
| 346 | 367 |
| 347 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, | 368 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, |
| 348 int template_index, | 369 int template_index, |
| 349 Handle<Object> arg) { | 370 Handle<Object> arg) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 421 builder.AppendCharacter(*c); | 442 builder.AppendCharacter(*c); |
| 422 } | 443 } |
| 423 } | 444 } |
| 424 | 445 |
| 425 return builder.Finish(); | 446 return builder.Finish(); |
| 426 } | 447 } |
| 427 | 448 |
| 428 | 449 |
| 429 } // namespace internal | 450 } // namespace internal |
| 430 } // namespace v8 | 451 } // namespace v8 |
| OLD | NEW |