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