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 2047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2058 return i::Execution::Call(isolate, fun, recv, argc, argv); | 2058 return i::Execution::Call(isolate, fun, recv, argc, argv); |
2059 } | 2059 } |
2060 | 2060 |
2061 | 2061 |
2062 MUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction( | 2062 MUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction( |
2063 const char* name, | 2063 const char* name, |
2064 i::Handle<i::Object> data) { | 2064 i::Handle<i::Object> data) { |
2065 i::Handle<i::Object> argv[] = { data }; | 2065 i::Handle<i::Object> argv[] = { data }; |
2066 return CallV8HeapFunction(name, | 2066 return CallV8HeapFunction(name, |
2067 i::Isolate::Current()->js_builtins_object(), | 2067 i::Isolate::Current()->js_builtins_object(), |
2068 ARRAY_SIZE(argv), | 2068 arraysize(argv), |
2069 argv); | 2069 argv); |
2070 } | 2070 } |
2071 | 2071 |
2072 | 2072 |
2073 int Message::GetLineNumber() const { | 2073 int Message::GetLineNumber() const { |
2074 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 2074 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
2075 ON_BAILOUT(isolate, "v8::Message::GetLineNumber()", return kNoLineNumberInfo); | 2075 ON_BAILOUT(isolate, "v8::Message::GetLineNumber()", return kNoLineNumberInfo); |
2076 ENTER_V8(isolate); | 2076 ENTER_V8(isolate); |
2077 i::HandleScope scope(isolate); | 2077 i::HandleScope scope(isolate); |
2078 | 2078 |
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2960 // If both obj and other are JSObjects, we'd better compare by identity | 2960 // If both obj and other are JSObjects, we'd better compare by identity |
2961 // immediately when going into JS builtin. The reason is Invoke | 2961 // immediately when going into JS builtin. The reason is Invoke |
2962 // would overwrite global object receiver with global proxy. | 2962 // would overwrite global object receiver with global proxy. |
2963 if (obj->IsJSObject() && other->IsJSObject()) { | 2963 if (obj->IsJSObject() && other->IsJSObject()) { |
2964 return *obj == *other; | 2964 return *obj == *other; |
2965 } | 2965 } |
2966 i::Handle<i::Object> args[] = { other }; | 2966 i::Handle<i::Object> args[] = { other }; |
2967 EXCEPTION_PREAMBLE(isolate); | 2967 EXCEPTION_PREAMBLE(isolate); |
2968 i::Handle<i::Object> result; | 2968 i::Handle<i::Object> result; |
2969 has_pending_exception = !CallV8HeapFunction( | 2969 has_pending_exception = !CallV8HeapFunction( |
2970 "EQUALS", obj, ARRAY_SIZE(args), args).ToHandle(&result); | 2970 "EQUALS", obj, arraysize(args), args).ToHandle(&result); |
2971 EXCEPTION_BAILOUT_CHECK(isolate, false); | 2971 EXCEPTION_BAILOUT_CHECK(isolate, false); |
2972 return *result == i::Smi::FromInt(i::EQUAL); | 2972 return *result == i::Smi::FromInt(i::EQUAL); |
2973 } | 2973 } |
2974 | 2974 |
2975 | 2975 |
2976 bool Value::StrictEquals(Handle<Value> that) const { | 2976 bool Value::StrictEquals(Handle<Value> that) const { |
2977 i::Isolate* isolate = i::Isolate::Current(); | 2977 i::Isolate* isolate = i::Isolate::Current(); |
2978 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); | 2978 i::Handle<i::Object> obj = Utils::OpenHandle(this, true); |
2979 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), | 2979 if (!Utils::ApiCheck(!obj.is_null() && !that.IsEmpty(), |
2980 "v8::Value::StrictEquals()", | 2980 "v8::Value::StrictEquals()", |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3189 return Local<Value>()); | 3189 return Local<Value>()); |
3190 ENTER_V8(isolate); | 3190 ENTER_V8(isolate); |
3191 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 3191 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
3192 i::Handle<i::Name> key_name = Utils::OpenHandle(*key); | 3192 i::Handle<i::Name> key_name = Utils::OpenHandle(*key); |
3193 i::Handle<i::Object> args[] = { obj, key_name }; | 3193 i::Handle<i::Object> args[] = { obj, key_name }; |
3194 EXCEPTION_PREAMBLE(isolate); | 3194 EXCEPTION_PREAMBLE(isolate); |
3195 i::Handle<i::Object> result; | 3195 i::Handle<i::Object> result; |
3196 has_pending_exception = !CallV8HeapFunction( | 3196 has_pending_exception = !CallV8HeapFunction( |
3197 "ObjectGetOwnPropertyDescriptor", | 3197 "ObjectGetOwnPropertyDescriptor", |
3198 isolate->factory()->undefined_value(), | 3198 isolate->factory()->undefined_value(), |
3199 ARRAY_SIZE(args), | 3199 arraysize(args), |
3200 args).ToHandle(&result); | 3200 args).ToHandle(&result); |
3201 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); | 3201 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); |
3202 return Utils::ToLocal(result); | 3202 return Utils::ToLocal(result); |
3203 } | 3203 } |
3204 | 3204 |
3205 | 3205 |
3206 Local<Value> v8::Object::GetPrototype() { | 3206 Local<Value> v8::Object::GetPrototype() { |
3207 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3207 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
3208 ON_BAILOUT(isolate, "v8::Object::GetPrototype()", return Local<v8::Value>()); | 3208 ON_BAILOUT(isolate, "v8::Object::GetPrototype()", return Local<v8::Value>()); |
3209 ENTER_V8(isolate); | 3209 ENTER_V8(isolate); |
(...skipping 2518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5728 } | 5728 } |
5729 | 5729 |
5730 | 5730 |
5731 static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { | 5731 static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { |
5732 i::Isolate* isolate = i::Isolate::Current(); | 5732 i::Isolate* isolate = i::Isolate::Current(); |
5733 uint8_t flags_buf[3]; | 5733 uint8_t flags_buf[3]; |
5734 int num_flags = 0; | 5734 int num_flags = 0; |
5735 if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g'; | 5735 if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g'; |
5736 if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm'; | 5736 if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm'; |
5737 if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i'; | 5737 if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i'; |
5738 DCHECK(num_flags <= static_cast<int>(ARRAY_SIZE(flags_buf))); | 5738 DCHECK(num_flags <= static_cast<int>(arraysize(flags_buf))); |
5739 return isolate->factory()->InternalizeOneByteString( | 5739 return isolate->factory()->InternalizeOneByteString( |
5740 i::Vector<const uint8_t>(flags_buf, num_flags)); | 5740 i::Vector<const uint8_t>(flags_buf, num_flags)); |
5741 } | 5741 } |
5742 | 5742 |
5743 | 5743 |
5744 Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, | 5744 Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, |
5745 Flags flags) { | 5745 Flags flags) { |
5746 i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); | 5746 i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); |
5747 EnsureInitializedForIsolate(isolate, "v8::RegExp::New()"); | 5747 EnsureInitializedForIsolate(isolate, "v8::RegExp::New()"); |
5748 LOG_API(isolate, "RegExp::New"); | 5748 LOG_API(isolate, "RegExp::New"); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5834 i::Isolate* isolate = obj->GetIsolate(); | 5834 i::Isolate* isolate = obj->GetIsolate(); |
5835 LOG_API(isolate, "IsPromise"); | 5835 LOG_API(isolate, "IsPromise"); |
5836 ENTER_V8(isolate); | 5836 ENTER_V8(isolate); |
5837 EXCEPTION_PREAMBLE(isolate); | 5837 EXCEPTION_PREAMBLE(isolate); |
5838 i::Handle<i::Object> argv[] = { obj }; | 5838 i::Handle<i::Object> argv[] = { obj }; |
5839 i::Handle<i::Object> b; | 5839 i::Handle<i::Object> b; |
5840 has_pending_exception = !i::Execution::Call( | 5840 has_pending_exception = !i::Execution::Call( |
5841 isolate, | 5841 isolate, |
5842 isolate->is_promise(), | 5842 isolate->is_promise(), |
5843 isolate->factory()->undefined_value(), | 5843 isolate->factory()->undefined_value(), |
5844 ARRAY_SIZE(argv), argv, | 5844 arraysize(argv), argv, |
5845 false).ToHandle(&b); | 5845 false).ToHandle(&b); |
5846 EXCEPTION_BAILOUT_CHECK(isolate, false); | 5846 EXCEPTION_BAILOUT_CHECK(isolate, false); |
5847 return b->BooleanValue(); | 5847 return b->BooleanValue(); |
5848 } | 5848 } |
5849 | 5849 |
5850 | 5850 |
5851 Local<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) { | 5851 Local<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) { |
5852 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); | 5852 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
5853 LOG_API(isolate, "Promise::Resolver::New"); | 5853 LOG_API(isolate, "Promise::Resolver::New"); |
5854 ENTER_V8(isolate); | 5854 ENTER_V8(isolate); |
(...skipping 20 matching lines...) Expand all Loading... |
5875 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); | 5875 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); |
5876 i::Isolate* isolate = promise->GetIsolate(); | 5876 i::Isolate* isolate = promise->GetIsolate(); |
5877 LOG_API(isolate, "Promise::Resolver::Resolve"); | 5877 LOG_API(isolate, "Promise::Resolver::Resolve"); |
5878 ENTER_V8(isolate); | 5878 ENTER_V8(isolate); |
5879 EXCEPTION_PREAMBLE(isolate); | 5879 EXCEPTION_PREAMBLE(isolate); |
5880 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; | 5880 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; |
5881 has_pending_exception = i::Execution::Call( | 5881 has_pending_exception = i::Execution::Call( |
5882 isolate, | 5882 isolate, |
5883 isolate->promise_resolve(), | 5883 isolate->promise_resolve(), |
5884 isolate->factory()->undefined_value(), | 5884 isolate->factory()->undefined_value(), |
5885 ARRAY_SIZE(argv), argv, | 5885 arraysize(argv), argv, |
5886 false).is_null(); | 5886 false).is_null(); |
5887 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); | 5887 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); |
5888 } | 5888 } |
5889 | 5889 |
5890 | 5890 |
5891 void Promise::Resolver::Reject(Handle<Value> value) { | 5891 void Promise::Resolver::Reject(Handle<Value> value) { |
5892 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); | 5892 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); |
5893 i::Isolate* isolate = promise->GetIsolate(); | 5893 i::Isolate* isolate = promise->GetIsolate(); |
5894 LOG_API(isolate, "Promise::Resolver::Reject"); | 5894 LOG_API(isolate, "Promise::Resolver::Reject"); |
5895 ENTER_V8(isolate); | 5895 ENTER_V8(isolate); |
5896 EXCEPTION_PREAMBLE(isolate); | 5896 EXCEPTION_PREAMBLE(isolate); |
5897 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; | 5897 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; |
5898 has_pending_exception = i::Execution::Call( | 5898 has_pending_exception = i::Execution::Call( |
5899 isolate, | 5899 isolate, |
5900 isolate->promise_reject(), | 5900 isolate->promise_reject(), |
5901 isolate->factory()->undefined_value(), | 5901 isolate->factory()->undefined_value(), |
5902 ARRAY_SIZE(argv), argv, | 5902 arraysize(argv), argv, |
5903 false).is_null(); | 5903 false).is_null(); |
5904 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); | 5904 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); |
5905 } | 5905 } |
5906 | 5906 |
5907 | 5907 |
5908 Local<Promise> Promise::Chain(Handle<Function> handler) { | 5908 Local<Promise> Promise::Chain(Handle<Function> handler) { |
5909 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); | 5909 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); |
5910 i::Isolate* isolate = promise->GetIsolate(); | 5910 i::Isolate* isolate = promise->GetIsolate(); |
5911 LOG_API(isolate, "Promise::Chain"); | 5911 LOG_API(isolate, "Promise::Chain"); |
5912 ENTER_V8(isolate); | 5912 ENTER_V8(isolate); |
5913 EXCEPTION_PREAMBLE(isolate); | 5913 EXCEPTION_PREAMBLE(isolate); |
5914 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; | 5914 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; |
5915 i::Handle<i::Object> result; | 5915 i::Handle<i::Object> result; |
5916 has_pending_exception = !i::Execution::Call( | 5916 has_pending_exception = !i::Execution::Call( |
5917 isolate, | 5917 isolate, |
5918 isolate->promise_chain(), | 5918 isolate->promise_chain(), |
5919 promise, | 5919 promise, |
5920 ARRAY_SIZE(argv), argv, | 5920 arraysize(argv), argv, |
5921 false).ToHandle(&result); | 5921 false).ToHandle(&result); |
5922 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); | 5922 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); |
5923 return Local<Promise>::Cast(Utils::ToLocal(result)); | 5923 return Local<Promise>::Cast(Utils::ToLocal(result)); |
5924 } | 5924 } |
5925 | 5925 |
5926 | 5926 |
5927 Local<Promise> Promise::Catch(Handle<Function> handler) { | 5927 Local<Promise> Promise::Catch(Handle<Function> handler) { |
5928 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); | 5928 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); |
5929 i::Isolate* isolate = promise->GetIsolate(); | 5929 i::Isolate* isolate = promise->GetIsolate(); |
5930 LOG_API(isolate, "Promise::Catch"); | 5930 LOG_API(isolate, "Promise::Catch"); |
5931 ENTER_V8(isolate); | 5931 ENTER_V8(isolate); |
5932 EXCEPTION_PREAMBLE(isolate); | 5932 EXCEPTION_PREAMBLE(isolate); |
5933 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; | 5933 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; |
5934 i::Handle<i::Object> result; | 5934 i::Handle<i::Object> result; |
5935 has_pending_exception = !i::Execution::Call( | 5935 has_pending_exception = !i::Execution::Call( |
5936 isolate, | 5936 isolate, |
5937 isolate->promise_catch(), | 5937 isolate->promise_catch(), |
5938 promise, | 5938 promise, |
5939 ARRAY_SIZE(argv), argv, | 5939 arraysize(argv), argv, |
5940 false).ToHandle(&result); | 5940 false).ToHandle(&result); |
5941 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); | 5941 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); |
5942 return Local<Promise>::Cast(Utils::ToLocal(result)); | 5942 return Local<Promise>::Cast(Utils::ToLocal(result)); |
5943 } | 5943 } |
5944 | 5944 |
5945 | 5945 |
5946 Local<Promise> Promise::Then(Handle<Function> handler) { | 5946 Local<Promise> Promise::Then(Handle<Function> handler) { |
5947 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); | 5947 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); |
5948 i::Isolate* isolate = promise->GetIsolate(); | 5948 i::Isolate* isolate = promise->GetIsolate(); |
5949 LOG_API(isolate, "Promise::Then"); | 5949 LOG_API(isolate, "Promise::Then"); |
5950 ENTER_V8(isolate); | 5950 ENTER_V8(isolate); |
5951 EXCEPTION_PREAMBLE(isolate); | 5951 EXCEPTION_PREAMBLE(isolate); |
5952 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; | 5952 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; |
5953 i::Handle<i::Object> result; | 5953 i::Handle<i::Object> result; |
5954 has_pending_exception = !i::Execution::Call( | 5954 has_pending_exception = !i::Execution::Call( |
5955 isolate, | 5955 isolate, |
5956 isolate->promise_then(), | 5956 isolate->promise_then(), |
5957 promise, | 5957 promise, |
5958 ARRAY_SIZE(argv), argv, | 5958 arraysize(argv), argv, |
5959 false).ToHandle(&result); | 5959 false).ToHandle(&result); |
5960 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); | 5960 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>()); |
5961 return Local<Promise>::Cast(Utils::ToLocal(result)); | 5961 return Local<Promise>::Cast(Utils::ToLocal(result)); |
5962 } | 5962 } |
5963 | 5963 |
5964 | 5964 |
5965 bool v8::ArrayBuffer::IsExternal() const { | 5965 bool v8::ArrayBuffer::IsExternal() const { |
5966 return Utils::OpenHandle(this)->is_external(); | 5966 return Utils::OpenHandle(this)->is_external(); |
5967 } | 5967 } |
5968 | 5968 |
(...skipping 1599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7568 | 7568 |
7569 DCHECK(last_handle_before_deferred_block_ == NULL || | 7569 DCHECK(last_handle_before_deferred_block_ == NULL || |
7570 found_block_before_deferred); | 7570 found_block_before_deferred); |
7571 | 7571 |
7572 // Iterate over live handles in the last block (if any). | 7572 // Iterate over live handles in the last block (if any). |
7573 if (!blocks()->is_empty()) { | 7573 if (!blocks()->is_empty()) { |
7574 v->VisitPointers(blocks()->last(), handle_scope_data_.next); | 7574 v->VisitPointers(blocks()->last(), handle_scope_data_.next); |
7575 } | 7575 } |
7576 | 7576 |
7577 List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; | 7577 List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; |
7578 for (unsigned i = 0; i < ARRAY_SIZE(context_lists); i++) { | 7578 for (unsigned i = 0; i < arraysize(context_lists); i++) { |
7579 if (context_lists[i]->is_empty()) continue; | 7579 if (context_lists[i]->is_empty()) continue; |
7580 Object** start = reinterpret_cast<Object**>(&context_lists[i]->first()); | 7580 Object** start = reinterpret_cast<Object**>(&context_lists[i]->first()); |
7581 v->VisitPointers(start, start + context_lists[i]->length()); | 7581 v->VisitPointers(start, start + context_lists[i]->length()); |
7582 } | 7582 } |
7583 } | 7583 } |
7584 | 7584 |
7585 | 7585 |
7586 void HandleScopeImplementer::Iterate(ObjectVisitor* v) { | 7586 void HandleScopeImplementer::Iterate(ObjectVisitor* v) { |
7587 HandleScopeData* current = isolate_->handle_scope_data(); | 7587 HandleScopeData* current = isolate_->handle_scope_data(); |
7588 handle_scope_data_ = *current; | 7588 handle_scope_data_ = *current; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7677 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7677 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7678 Address callback_address = | 7678 Address callback_address = |
7679 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7679 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7680 VMState<EXTERNAL> state(isolate); | 7680 VMState<EXTERNAL> state(isolate); |
7681 ExternalCallbackScope call_scope(isolate, callback_address); | 7681 ExternalCallbackScope call_scope(isolate, callback_address); |
7682 callback(info); | 7682 callback(info); |
7683 } | 7683 } |
7684 | 7684 |
7685 | 7685 |
7686 } } // namespace v8::internal | 7686 } } // namespace v8::internal |
OLD | NEW |