| 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 2878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2889 if (num->IsSmi()) { | 2889 if (num->IsSmi()) { |
| 2890 return i::Smi::cast(*num)->value(); | 2890 return i::Smi::cast(*num)->value(); |
| 2891 } else { | 2891 } else { |
| 2892 return static_cast<int32_t>(num->Number()); | 2892 return static_cast<int32_t>(num->Number()); |
| 2893 } | 2893 } |
| 2894 } | 2894 } |
| 2895 } | 2895 } |
| 2896 | 2896 |
| 2897 | 2897 |
| 2898 bool Value::Equals(Handle<Value> that) const { | 2898 bool Value::Equals(Handle<Value> that) const { |
| 2899 i::Isolate* isolate = i::Isolate::Current(); | |
| 2900 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); | 2899 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); |
| 2900 i::Handle<i::Object> other = Utils::OpenHandle(*that); |
| 2901 if (obj->IsSmi() && other->IsSmi()) { |
| 2902 return obj->Number() == other->Number(); |
| 2903 } |
| 2904 i::Object* ho = obj->IsSmi() ? *other : *obj; |
| 2905 i::Isolate* isolate = i::HeapObject::cast(ho)->GetIsolate(); |
| 2901 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), | 2906 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), |
| 2902 "v8::Value::Equals()", | 2907 "v8::Value::Equals()", |
| 2903 "Reading from empty handle")) { | 2908 "Reading from empty handle")) { |
| 2904 return false; | 2909 return false; |
| 2905 } | 2910 } |
| 2906 LOG_API(isolate, "Equals"); | 2911 LOG_API(isolate, "Equals"); |
| 2907 ENTER_V8(isolate); | 2912 ENTER_V8(isolate); |
| 2908 i::Handle<i::Object> other = Utils::OpenHandle(*that); | |
| 2909 // If both obj and other are JSObjects, we'd better compare by identity | 2913 // If both obj and other are JSObjects, we'd better compare by identity |
| 2910 // immediately when going into JS builtin. The reason is Invoke | 2914 // immediately when going into JS builtin. The reason is Invoke |
| 2911 // would overwrite global object receiver with global proxy. | 2915 // would overwrite global object receiver with global proxy. |
| 2912 if (obj->IsJSObject() && other->IsJSObject()) { | 2916 if (obj->IsJSObject() && other->IsJSObject()) { |
| 2913 return *obj == *other; | 2917 return *obj == *other; |
| 2914 } | 2918 } |
| 2915 i::Handle<i::Object> args[] = { other }; | 2919 i::Handle<i::Object> args[] = { other }; |
| 2916 EXCEPTION_PREAMBLE(isolate); | 2920 EXCEPTION_PREAMBLE(isolate); |
| 2917 i::Handle<i::Object> result; | 2921 i::Handle<i::Object> result; |
| 2918 has_pending_exception = | 2922 has_pending_exception = |
| 2919 !CallV8HeapFunction(isolate, "EQUALS", obj, arraysize(args), args) | 2923 !CallV8HeapFunction(isolate, "EQUALS", obj, arraysize(args), args) |
| 2920 .ToHandle(&result); | 2924 .ToHandle(&result); |
| 2921 EXCEPTION_BAILOUT_CHECK(isolate, false); | 2925 EXCEPTION_BAILOUT_CHECK(isolate, false); |
| 2922 return *result == i::Smi::FromInt(i::EQUAL); | 2926 return *result == i::Smi::FromInt(i::EQUAL); |
| 2923 } | 2927 } |
| 2924 | 2928 |
| 2925 | 2929 |
| 2926 bool Value::StrictEquals(Handle<Value> that) const { | 2930 bool Value::StrictEquals(Handle<Value> that) const { |
| 2927 i::Isolate* isolate = i::Isolate::Current(); | |
| 2928 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); | 2931 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); |
| 2932 i::Handle<i::Object> other = Utils::OpenHandle(*that); |
| 2933 if (obj->IsSmi()) { |
| 2934 return other->IsNumber() && obj->Number() == other->Number(); |
| 2935 } |
| 2936 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
| 2929 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), | 2937 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), |
| 2930 "v8::Value::StrictEquals()", | 2938 "v8::Value::StrictEquals()", |
| 2931 "Reading from empty handle")) { | 2939 "Reading from empty handle")) { |
| 2932 return false; | 2940 return false; |
| 2933 } | 2941 } |
| 2934 LOG_API(isolate, "StrictEquals"); | 2942 LOG_API(isolate, "StrictEquals"); |
| 2935 i::Handle<i::Object> other = Utils::OpenHandle(*that); | |
| 2936 // Must check HeapNumber first, since NaN !== NaN. | 2943 // Must check HeapNumber first, since NaN !== NaN. |
| 2937 if (obj->IsHeapNumber()) { | 2944 if (obj->IsHeapNumber()) { |
| 2938 if (!other->IsNumber()) return false; | 2945 if (!other->IsNumber()) return false; |
| 2939 double x = obj->Number(); | 2946 double x = obj->Number(); |
| 2940 double y = other->Number(); | 2947 double y = other->Number(); |
| 2941 // Must check explicitly for NaN:s on Windows, but -0 works fine. | 2948 // Must check explicitly for NaN:s on Windows, but -0 works fine. |
| 2942 return x == y && !std::isnan(x) && !std::isnan(y); | 2949 return x == y && !std::isnan(x) && !std::isnan(y); |
| 2943 } else if (*obj == *other) { // Also covers Booleans. | 2950 } else if (*obj == *other) { // Also covers Booleans. |
| 2944 return true; | 2951 return true; |
| 2945 } else if (obj->IsSmi()) { | 2952 } else if (obj->IsSmi()) { |
| (...skipping 4712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7658 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7665 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
| 7659 Address callback_address = | 7666 Address callback_address = |
| 7660 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7667 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 7661 VMState<EXTERNAL> state(isolate); | 7668 VMState<EXTERNAL> state(isolate); |
| 7662 ExternalCallbackScope call_scope(isolate, callback_address); | 7669 ExternalCallbackScope call_scope(isolate, callback_address); |
| 7663 callback(info); | 7670 callback(info); |
| 7664 } | 7671 } |
| 7665 | 7672 |
| 7666 | 7673 |
| 7667 } } // namespace v8::internal | 7674 } } // namespace v8::internal |
| OLD | NEW |