| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/api.h" | 5 #include "src/api.h" |
| 6 | 6 |
| 7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
| 8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
| 9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
| 10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
| (...skipping 2795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2806 double value = obj->Number(); | 2806 double value = obj->Number(); |
| 2807 return !i::IsMinusZero(value) && | 2807 return !i::IsMinusZero(value) && |
| 2808 value >= 0 && | 2808 value >= 0 && |
| 2809 value <= i::kMaxUInt32 && | 2809 value <= i::kMaxUInt32 && |
| 2810 value == i::FastUI2D(i::FastD2UI(value)); | 2810 value == i::FastUI2D(i::FastD2UI(value)); |
| 2811 } | 2811 } |
| 2812 return false; | 2812 return false; |
| 2813 } | 2813 } |
| 2814 | 2814 |
| 2815 | 2815 |
| 2816 static bool CheckConstructor(i::Isolate* isolate, | |
| 2817 i::Handle<i::JSObject> obj, | |
| 2818 const char* class_name) { | |
| 2819 i::Handle<i::Object> constr(obj->map()->GetConstructor(), isolate); | |
| 2820 if (!constr->IsJSFunction()) return false; | |
| 2821 i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast(constr); | |
| 2822 return func->shared()->native() && constr.is_identical_to( | |
| 2823 i::Object::GetProperty(isolate, | |
| 2824 isolate->js_builtins_object(), | |
| 2825 class_name).ToHandleChecked()); | |
| 2826 } | |
| 2827 | |
| 2828 | |
| 2829 bool Value::IsNativeError() const { | 2816 bool Value::IsNativeError() const { |
| 2830 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2817 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2831 if (obj->IsJSObject()) { | 2818 if (!obj->IsJSObject()) return false; |
| 2832 i::Handle<i::JSObject> js_obj(i::JSObject::cast(*obj)); | 2819 i::Handle<i::JSObject> js_obj = i::Handle<i::JSObject>::cast(obj); |
| 2833 i::Isolate* isolate = js_obj->GetIsolate(); | 2820 i::Isolate* isolate = js_obj->GetIsolate(); |
| 2834 return CheckConstructor(isolate, js_obj, "$Error") || | 2821 i::Handle<i::Object> constructor(js_obj->map()->GetConstructor(), isolate); |
| 2835 CheckConstructor(isolate, js_obj, "$EvalError") || | 2822 if (!constructor->IsJSFunction()) return false; |
| 2836 CheckConstructor(isolate, js_obj, "$RangeError") || | 2823 i::Handle<i::JSFunction> function = |
| 2837 CheckConstructor(isolate, js_obj, "$ReferenceError") || | 2824 i::Handle<i::JSFunction>::cast(constructor); |
| 2838 CheckConstructor(isolate, js_obj, "$SyntaxError") || | 2825 if (!function->shared()->native()) return false; |
| 2839 CheckConstructor(isolate, js_obj, "$TypeError") || | 2826 return function.is_identical_to(isolate->error_function()) || |
| 2840 CheckConstructor(isolate, js_obj, "$URIError"); | 2827 function.is_identical_to(isolate->eval_error_function()) || |
| 2841 } else { | 2828 function.is_identical_to(isolate->range_error_function()) || |
| 2842 return false; | 2829 function.is_identical_to(isolate->reference_error_function()) || |
| 2843 } | 2830 function.is_identical_to(isolate->syntax_error_function()) || |
| 2831 function.is_identical_to(isolate->type_error_function()) || |
| 2832 function.is_identical_to(isolate->uri_error_function()); |
| 2844 } | 2833 } |
| 2845 | 2834 |
| 2846 | 2835 |
| 2847 bool Value::IsRegExp() const { | 2836 bool Value::IsRegExp() const { |
| 2848 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2837 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2849 return obj->IsJSRegExp(); | 2838 return obj->IsJSRegExp(); |
| 2850 } | 2839 } |
| 2851 | 2840 |
| 2852 | 2841 |
| 2853 bool Value::IsGeneratorFunction() const { | 2842 bool Value::IsGeneratorFunction() const { |
| (...skipping 4779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7633 str_ = i::NewArray<uint16_t>(length_ + 1); | 7622 str_ = i::NewArray<uint16_t>(length_ + 1); |
| 7634 str->Write(str_); | 7623 str->Write(str_); |
| 7635 } | 7624 } |
| 7636 | 7625 |
| 7637 | 7626 |
| 7638 String::Value::~Value() { | 7627 String::Value::~Value() { |
| 7639 i::DeleteArray(str_); | 7628 i::DeleteArray(str_); |
| 7640 } | 7629 } |
| 7641 | 7630 |
| 7642 | 7631 |
| 7643 #define DEFINE_ERROR(NAME) \ | 7632 #define DEFINE_ERROR(NAME, name) \ |
| 7644 Local<Value> Exception::NAME(v8::Local<v8::String> raw_message) { \ | 7633 Local<Value> Exception::NAME(v8::Local<v8::String> raw_message) { \ |
| 7645 i::Isolate* isolate = i::Isolate::Current(); \ | 7634 i::Isolate* isolate = i::Isolate::Current(); \ |
| 7646 LOG_API(isolate, #NAME); \ | 7635 LOG_API(isolate, #NAME); \ |
| 7647 ENTER_V8(isolate); \ | 7636 ENTER_V8(isolate); \ |
| 7648 i::Object* error; \ | 7637 i::Object* error; \ |
| 7649 { \ | 7638 { \ |
| 7650 i::HandleScope scope(isolate); \ | 7639 i::HandleScope scope(isolate); \ |
| 7651 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); \ | 7640 i::Handle<i::String> message = Utils::OpenHandle(*raw_message); \ |
| 7652 error = *isolate->factory()->NewError("$" #NAME, message); \ | 7641 i::Handle<i::JSFunction> constructor = isolate->name##_function(); \ |
| 7653 } \ | 7642 error = *isolate->factory()->NewError(constructor, message); \ |
| 7654 i::Handle<i::Object> result(error, isolate); \ | 7643 } \ |
| 7655 return Utils::ToLocal(result); \ | 7644 i::Handle<i::Object> result(error, isolate); \ |
| 7645 return Utils::ToLocal(result); \ |
| 7656 } | 7646 } |
| 7657 | 7647 |
| 7658 DEFINE_ERROR(RangeError) | 7648 DEFINE_ERROR(RangeError, range_error) |
| 7659 DEFINE_ERROR(ReferenceError) | 7649 DEFINE_ERROR(ReferenceError, reference_error) |
| 7660 DEFINE_ERROR(SyntaxError) | 7650 DEFINE_ERROR(SyntaxError, syntax_error) |
| 7661 DEFINE_ERROR(TypeError) | 7651 DEFINE_ERROR(TypeError, type_error) |
| 7662 DEFINE_ERROR(Error) | 7652 DEFINE_ERROR(Error, error) |
| 7663 | 7653 |
| 7664 #undef DEFINE_ERROR | 7654 #undef DEFINE_ERROR |
| 7665 | 7655 |
| 7666 | 7656 |
| 7667 Local<Message> Exception::CreateMessage(Local<Value> exception) { | 7657 Local<Message> Exception::CreateMessage(Local<Value> exception) { |
| 7668 i::Handle<i::Object> obj = Utils::OpenHandle(*exception); | 7658 i::Handle<i::Object> obj = Utils::OpenHandle(*exception); |
| 7669 if (!obj->IsHeapObject()) return Local<Message>(); | 7659 if (!obj->IsHeapObject()) return Local<Message>(); |
| 7670 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 7660 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
| 7671 ENTER_V8(isolate); | 7661 ENTER_V8(isolate); |
| 7672 i::HandleScope scope(isolate); | 7662 i::HandleScope scope(isolate); |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8455 Address callback_address = | 8445 Address callback_address = |
| 8456 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8446 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 8457 VMState<EXTERNAL> state(isolate); | 8447 VMState<EXTERNAL> state(isolate); |
| 8458 ExternalCallbackScope call_scope(isolate, callback_address); | 8448 ExternalCallbackScope call_scope(isolate, callback_address); |
| 8459 callback(info); | 8449 callback(info); |
| 8460 } | 8450 } |
| 8461 | 8451 |
| 8462 | 8452 |
| 8463 } // namespace internal | 8453 } // namespace internal |
| 8464 } // namespace v8 | 8454 } // namespace v8 |
| OLD | NEW |