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 2562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2573 i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast(obj); | 2573 i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast(obj); |
2574 return func->shared()->is_generator(); | 2574 return func->shared()->is_generator(); |
2575 } | 2575 } |
2576 | 2576 |
2577 | 2577 |
2578 bool Value::IsGeneratorObject() const { | 2578 bool Value::IsGeneratorObject() const { |
2579 return Utils::OpenHandle(this)->IsJSGeneratorObject(); | 2579 return Utils::OpenHandle(this)->IsJSGeneratorObject(); |
2580 } | 2580 } |
2581 | 2581 |
2582 | 2582 |
2583 Local<String> Value::ToString() const { | 2583 Local<String> Value::ToString(Isolate* v8_isolate) const { |
2584 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2584 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2585 i::Handle<i::Object> str; | 2585 i::Handle<i::Object> str; |
2586 if (obj->IsString()) { | 2586 if (obj->IsString()) { |
2587 str = obj; | 2587 str = obj; |
2588 } else { | 2588 } else { |
2589 i::Isolate* isolate = i::Isolate::Current(); | 2589 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2590 LOG_API(isolate, "ToString"); | 2590 LOG_API(isolate, "ToString"); |
2591 ENTER_V8(isolate); | 2591 ENTER_V8(isolate); |
2592 EXCEPTION_PREAMBLE(isolate); | 2592 EXCEPTION_PREAMBLE(isolate); |
2593 has_pending_exception = !i::Execution::ToString( | 2593 has_pending_exception = !i::Execution::ToString( |
2594 isolate, obj).ToHandle(&str); | 2594 isolate, obj).ToHandle(&str); |
2595 EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); | 2595 EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); |
2596 } | 2596 } |
2597 return ToApiHandle<String>(str); | 2597 return ToApiHandle<String>(str); |
2598 } | 2598 } |
2599 | 2599 |
2600 | 2600 |
2601 Local<String> Value::ToDetailString() const { | 2601 Local<String> Value::ToDetailString(Isolate* v8_isolate) const { |
2602 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2602 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2603 i::Handle<i::Object> str; | 2603 i::Handle<i::Object> str; |
2604 if (obj->IsString()) { | 2604 if (obj->IsString()) { |
2605 str = obj; | 2605 str = obj; |
2606 } else { | 2606 } else { |
2607 i::Isolate* isolate = i::Isolate::Current(); | 2607 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2608 LOG_API(isolate, "ToDetailString"); | 2608 LOG_API(isolate, "ToDetailString"); |
2609 ENTER_V8(isolate); | 2609 ENTER_V8(isolate); |
2610 EXCEPTION_PREAMBLE(isolate); | 2610 EXCEPTION_PREAMBLE(isolate); |
2611 has_pending_exception = !i::Execution::ToDetailString( | 2611 has_pending_exception = !i::Execution::ToDetailString( |
2612 isolate, obj).ToHandle(&str); | 2612 isolate, obj).ToHandle(&str); |
2613 EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); | 2613 EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); |
2614 } | 2614 } |
2615 return ToApiHandle<String>(str); | 2615 return ToApiHandle<String>(str); |
2616 } | 2616 } |
2617 | 2617 |
2618 | 2618 |
2619 Local<v8::Object> Value::ToObject() const { | 2619 Local<v8::Object> Value::ToObject(Isolate* v8_isolate) const { |
2620 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2620 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2621 i::Handle<i::Object> val; | 2621 i::Handle<i::Object> val; |
2622 if (obj->IsJSObject()) { | 2622 if (obj->IsJSObject()) { |
2623 val = obj; | 2623 val = obj; |
2624 } else { | 2624 } else { |
2625 i::Isolate* isolate = i::Isolate::Current(); | 2625 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2626 LOG_API(isolate, "ToObject"); | 2626 LOG_API(isolate, "ToObject"); |
2627 ENTER_V8(isolate); | 2627 ENTER_V8(isolate); |
2628 EXCEPTION_PREAMBLE(isolate); | 2628 EXCEPTION_PREAMBLE(isolate); |
2629 has_pending_exception = !i::Execution::ToObject( | 2629 has_pending_exception = !i::Execution::ToObject( |
2630 isolate, obj).ToHandle(&val); | 2630 isolate, obj).ToHandle(&val); |
2631 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); | 2631 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); |
2632 } | 2632 } |
2633 return ToApiHandle<Object>(val); | 2633 return ToApiHandle<Object>(val); |
2634 } | 2634 } |
2635 | 2635 |
2636 | 2636 |
2637 Local<Boolean> Value::ToBoolean() const { | 2637 Local<Boolean> Value::ToBoolean(Isolate* v8_isolate) const { |
2638 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2638 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2639 if (obj->IsBoolean()) { | 2639 if (obj->IsBoolean()) { |
2640 return ToApiHandle<Boolean>(obj); | 2640 return ToApiHandle<Boolean>(obj); |
2641 } else { | 2641 } else { |
2642 i::Isolate* isolate = i::Isolate::Current(); | 2642 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2643 LOG_API(isolate, "ToBoolean"); | 2643 LOG_API(isolate, "ToBoolean"); |
2644 ENTER_V8(isolate); | 2644 ENTER_V8(isolate); |
2645 i::Handle<i::Object> val = | 2645 i::Handle<i::Object> val = |
2646 isolate->factory()->ToBoolean(obj->BooleanValue()); | 2646 isolate->factory()->ToBoolean(obj->BooleanValue()); |
2647 return ToApiHandle<Boolean>(val); | 2647 return ToApiHandle<Boolean>(val); |
2648 } | 2648 } |
2649 } | 2649 } |
2650 | 2650 |
2651 | 2651 |
2652 Local<Number> Value::ToNumber() const { | 2652 Local<Number> Value::ToNumber(Isolate* v8_isolate) const { |
2653 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2653 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2654 i::Handle<i::Object> num; | 2654 i::Handle<i::Object> num; |
2655 if (obj->IsNumber()) { | 2655 if (obj->IsNumber()) { |
2656 num = obj; | 2656 num = obj; |
2657 } else { | 2657 } else { |
2658 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 2658 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2659 LOG_API(isolate, "ToNumber"); | 2659 LOG_API(isolate, "ToNumber"); |
2660 ENTER_V8(isolate); | 2660 ENTER_V8(isolate); |
2661 EXCEPTION_PREAMBLE(isolate); | 2661 EXCEPTION_PREAMBLE(isolate); |
2662 has_pending_exception = !i::Execution::ToNumber( | 2662 has_pending_exception = !i::Execution::ToNumber( |
2663 isolate, obj).ToHandle(&num); | 2663 isolate, obj).ToHandle(&num); |
2664 EXCEPTION_BAILOUT_CHECK(isolate, Local<Number>()); | 2664 EXCEPTION_BAILOUT_CHECK(isolate, Local<Number>()); |
2665 } | 2665 } |
2666 return ToApiHandle<Number>(num); | 2666 return ToApiHandle<Number>(num); |
2667 } | 2667 } |
2668 | 2668 |
2669 | 2669 |
2670 Local<Integer> Value::ToInteger() const { | 2670 Local<Integer> Value::ToInteger(Isolate* v8_isolate) const { |
2671 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2671 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2672 i::Handle<i::Object> num; | 2672 i::Handle<i::Object> num; |
2673 if (obj->IsSmi()) { | 2673 if (obj->IsSmi()) { |
2674 num = obj; | 2674 num = obj; |
2675 } else { | 2675 } else { |
2676 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 2676 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2677 LOG_API(isolate, "ToInteger"); | 2677 LOG_API(isolate, "ToInteger"); |
2678 ENTER_V8(isolate); | 2678 ENTER_V8(isolate); |
2679 EXCEPTION_PREAMBLE(isolate); | 2679 EXCEPTION_PREAMBLE(isolate); |
2680 has_pending_exception = !i::Execution::ToInteger( | 2680 has_pending_exception = !i::Execution::ToInteger( |
2681 isolate, obj).ToHandle(&num); | 2681 isolate, obj).ToHandle(&num); |
2682 EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); | 2682 EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); |
2683 } | 2683 } |
2684 return ToApiHandle<Integer>(num); | 2684 return ToApiHandle<Integer>(num); |
2685 } | 2685 } |
2686 | 2686 |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2928 EXCEPTION_BAILOUT_CHECK(isolate, 0); | 2928 EXCEPTION_BAILOUT_CHECK(isolate, 0); |
2929 } | 2929 } |
2930 if (num->IsSmi()) { | 2930 if (num->IsSmi()) { |
2931 return i::Smi::cast(*num)->value(); | 2931 return i::Smi::cast(*num)->value(); |
2932 } else { | 2932 } else { |
2933 return static_cast<int64_t>(num->Number()); | 2933 return static_cast<int64_t>(num->Number()); |
2934 } | 2934 } |
2935 } | 2935 } |
2936 | 2936 |
2937 | 2937 |
2938 Local<Int32> Value::ToInt32() const { | 2938 Local<Int32> Value::ToInt32(Isolate* v8_isolate) const { |
2939 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2939 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2940 i::Handle<i::Object> num; | 2940 i::Handle<i::Object> num; |
2941 if (obj->IsSmi()) { | 2941 if (obj->IsSmi()) { |
2942 num = obj; | 2942 num = obj; |
2943 } else { | 2943 } else { |
2944 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 2944 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2945 LOG_API(isolate, "ToInt32"); | 2945 LOG_API(isolate, "ToInt32"); |
2946 ENTER_V8(isolate); | 2946 ENTER_V8(isolate); |
2947 EXCEPTION_PREAMBLE(isolate); | 2947 EXCEPTION_PREAMBLE(isolate); |
2948 has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); | 2948 has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); |
2949 EXCEPTION_BAILOUT_CHECK(isolate, Local<Int32>()); | 2949 EXCEPTION_BAILOUT_CHECK(isolate, Local<Int32>()); |
2950 } | 2950 } |
2951 return ToApiHandle<Int32>(num); | 2951 return ToApiHandle<Int32>(num); |
2952 } | 2952 } |
2953 | 2953 |
2954 | 2954 |
2955 Local<Uint32> Value::ToUint32() const { | 2955 Local<Uint32> Value::ToUint32(Isolate* v8_isolate) const { |
2956 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 2956 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
2957 i::Handle<i::Object> num; | 2957 i::Handle<i::Object> num; |
2958 if (obj->IsSmi()) { | 2958 if (obj->IsSmi()) { |
2959 num = obj; | 2959 num = obj; |
2960 } else { | 2960 } else { |
2961 i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 2961 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
2962 LOG_API(isolate, "ToUInt32"); | 2962 LOG_API(isolate, "ToUInt32"); |
2963 ENTER_V8(isolate); | 2963 ENTER_V8(isolate); |
2964 EXCEPTION_PREAMBLE(isolate); | 2964 EXCEPTION_PREAMBLE(isolate); |
2965 has_pending_exception = !i::Execution::ToUint32( | 2965 has_pending_exception = !i::Execution::ToUint32( |
2966 isolate, obj).ToHandle(&num); | 2966 isolate, obj).ToHandle(&num); |
2967 EXCEPTION_BAILOUT_CHECK(isolate, Local<Uint32>()); | 2967 EXCEPTION_BAILOUT_CHECK(isolate, Local<Uint32>()); |
2968 } | 2968 } |
2969 return ToApiHandle<Uint32>(num); | 2969 return ToApiHandle<Uint32>(num); |
2970 } | 2970 } |
2971 | 2971 |
(...skipping 3937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6909 } | 6909 } |
6910 | 6910 |
6911 | 6911 |
6912 String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) | 6912 String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) |
6913 : str_(NULL), length_(0) { | 6913 : str_(NULL), length_(0) { |
6914 i::Isolate* isolate = i::Isolate::Current(); | 6914 i::Isolate* isolate = i::Isolate::Current(); |
6915 if (obj.IsEmpty()) return; | 6915 if (obj.IsEmpty()) return; |
6916 ENTER_V8(isolate); | 6916 ENTER_V8(isolate); |
6917 i::HandleScope scope(isolate); | 6917 i::HandleScope scope(isolate); |
6918 TryCatch try_catch; | 6918 TryCatch try_catch; |
6919 Handle<String> str = obj->ToString(); | 6919 Handle<String> str = obj->ToString(reinterpret_cast<v8::Isolate*>(isolate)); |
6920 if (str.IsEmpty()) return; | 6920 if (str.IsEmpty()) return; |
6921 i::Handle<i::String> i_str = Utils::OpenHandle(*str); | 6921 i::Handle<i::String> i_str = Utils::OpenHandle(*str); |
6922 length_ = v8::Utf8Length(*i_str, isolate); | 6922 length_ = v8::Utf8Length(*i_str, isolate); |
6923 str_ = i::NewArray<char>(length_ + 1); | 6923 str_ = i::NewArray<char>(length_ + 1); |
6924 str->WriteUtf8(str_); | 6924 str->WriteUtf8(str_); |
6925 } | 6925 } |
6926 | 6926 |
6927 | 6927 |
6928 String::Utf8Value::~Utf8Value() { | 6928 String::Utf8Value::~Utf8Value() { |
6929 i::DeleteArray(str_); | 6929 i::DeleteArray(str_); |
6930 } | 6930 } |
6931 | 6931 |
6932 | 6932 |
6933 String::Value::Value(v8::Handle<v8::Value> obj) | 6933 String::Value::Value(v8::Handle<v8::Value> obj) |
6934 : str_(NULL), length_(0) { | 6934 : str_(NULL), length_(0) { |
6935 i::Isolate* isolate = i::Isolate::Current(); | 6935 i::Isolate* isolate = i::Isolate::Current(); |
6936 if (obj.IsEmpty()) return; | 6936 if (obj.IsEmpty()) return; |
6937 ENTER_V8(isolate); | 6937 ENTER_V8(isolate); |
6938 i::HandleScope scope(isolate); | 6938 i::HandleScope scope(isolate); |
6939 TryCatch try_catch; | 6939 TryCatch try_catch; |
6940 Handle<String> str = obj->ToString(); | 6940 Handle<String> str = obj->ToString(reinterpret_cast<v8::Isolate*>(isolate)); |
6941 if (str.IsEmpty()) return; | 6941 if (str.IsEmpty()) return; |
6942 length_ = str->Length(); | 6942 length_ = str->Length(); |
6943 str_ = i::NewArray<uint16_t>(length_ + 1); | 6943 str_ = i::NewArray<uint16_t>(length_ + 1); |
6944 str->Write(str_); | 6944 str->Write(str_); |
6945 } | 6945 } |
6946 | 6946 |
6947 | 6947 |
6948 String::Value::~Value() { | 6948 String::Value::~Value() { |
6949 i::DeleteArray(str_); | 6949 i::DeleteArray(str_); |
6950 } | 6950 } |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7765 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7765 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7766 Address callback_address = | 7766 Address callback_address = |
7767 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7767 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7768 VMState<EXTERNAL> state(isolate); | 7768 VMState<EXTERNAL> state(isolate); |
7769 ExternalCallbackScope call_scope(isolate, callback_address); | 7769 ExternalCallbackScope call_scope(isolate, callback_address); |
7770 callback(info); | 7770 callback(info); |
7771 } | 7771 } |
7772 | 7772 |
7773 | 7773 |
7774 } } // namespace v8::internal | 7774 } } // namespace v8::internal |
OLD | NEW |