Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Side by Side Diff: src/api.cc

Issue 977893002: convert remaining object functions to maybes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 #define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \ 90 #define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \
91 EXCEPTION_BAILOUT_CHECK_GENERIC( \ 91 EXCEPTION_BAILOUT_CHECK_GENERIC( \
92 isolate, value, isolate->FireCallCompletedCallback();) 92 isolate, value, isolate->FireCallCompletedCallback();)
93 93
94 94
95 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \ 95 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \
96 EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;) 96 EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;)
97 97
98 98
99 #define PREPARE_FOR_EXECUTION_GENERIC(context, function_name, bailout_value, \ 99 #define PREPARE_FOR_EXECUTION_GENERIC(context, function_name, bailout_value, \
100 HandleScopeClass) \ 100 HandleScopeClass, do_callback) \
101 auto isolate = context.IsEmpty() \ 101 auto isolate = context.IsEmpty() \
102 ? i::Isolate::Current() \ 102 ? i::Isolate::Current() \
103 : reinterpret_cast<i::Isolate*>(context->GetIsolate()); \ 103 : reinterpret_cast<i::Isolate*>(context->GetIsolate()); \
104 if (IsExecutionTerminatingCheck(isolate)) { \ 104 if (IsExecutionTerminatingCheck(isolate)) { \
105 return bailout_value; \ 105 return bailout_value; \
106 } \ 106 } \
107 HandleScopeClass handle_scope(isolate); \ 107 HandleScopeClass handle_scope(isolate); \
108 CallDepthScope call_depth_scope(isolate, context, false); \ 108 CallDepthScope call_depth_scope(isolate, context, do_callback); \
109 LOG_API(isolate, function_name); \ 109 LOG_API(isolate, function_name); \
110 ENTER_V8(isolate); \ 110 ENTER_V8(isolate); \
111 bool has_pending_exception = false 111 bool has_pending_exception = false
112 112
113 113
114 #define PREPARE_FOR_EXECUTION(context, function_name, T) \ 114 #define PREPARE_FOR_EXECUTION(context, function_name, T) \
115 PREPARE_FOR_EXECUTION_GENERIC(context, function_name, MaybeLocal<T>(), \ 115 PREPARE_FOR_EXECUTION_GENERIC(context, function_name, MaybeLocal<T>(), \
116 InternalEscapableScope) 116 InternalEscapableScope, false)
117
118
119 #define PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, function_name, T) \
120 PREPARE_FOR_EXECUTION_GENERIC(context, function_name, MaybeLocal<T>(), \
121 InternalEscapableScope, true)
117 122
118 123
119 #define PREPARE_FOR_EXECUTION_PRIMITIVE(context, function_name, T) \ 124 #define PREPARE_FOR_EXECUTION_PRIMITIVE(context, function_name, T) \
120 PREPARE_FOR_EXECUTION_GENERIC(context, function_name, Nothing<T>(), \ 125 PREPARE_FOR_EXECUTION_GENERIC(context, function_name, Nothing<T>(), \
121 i::HandleScope) 126 i::HandleScope, false)
122 127
123 128
124 #define EXCEPTION_BAILOUT_CHECK_SCOPED(isolate, value) \ 129 #define EXCEPTION_BAILOUT_CHECK_SCOPED(isolate, value) \
125 do { \ 130 do { \
126 if (has_pending_exception) { \ 131 if (has_pending_exception) { \
127 call_depth_scope.Escape(); \ 132 call_depth_scope.Escape(); \
128 return value; \ 133 return value; \
129 } \ 134 } \
130 } while (false) 135 } while (false)
131 136
(...skipping 3435 matching lines...) Expand 10 before | Expand all | Expand 10 after
3567 RETURN_ESCAPED(Utils::ToLocal(result)); 3572 RETURN_ESCAPED(Utils::ToLocal(result));
3568 } 3573 }
3569 3574
3570 3575
3571 Local<Array> v8::Object::GetOwnPropertyNames() { 3576 Local<Array> v8::Object::GetOwnPropertyNames() {
3572 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); 3577 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3573 RETURN_TO_LOCAL_UNCHECKED(GetOwnPropertyNames(context), Array); 3578 RETURN_TO_LOCAL_UNCHECKED(GetOwnPropertyNames(context), Array);
3574 } 3579 }
3575 3580
3576 3581
3577 Local<String> v8::Object::ObjectProtoToString() { 3582 MaybeLocal<String> v8::Object::ObjectProtoToString(Local<Context> context) {
3578 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); 3583 auto self = Utils::OpenHandle(this);
3579 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); 3584 auto isolate = self->GetIsolate();
3580 ON_BAILOUT(i_isolate, "v8::Object::ObjectProtoToString()", 3585 auto v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
3581 return Local<v8::String>()); 3586 i::Handle<i::Object> name(self->class_name(), isolate);
3582 ENTER_V8(i_isolate);
3583 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
3584
3585 i::Handle<i::Object> name(self->class_name(), i_isolate);
3586 i::Handle<i::Object> tag; 3587 i::Handle<i::Object> tag;
3587 3588
3588 // Native implementation of Object.prototype.toString (v8natives.js): 3589 // Native implementation of Object.prototype.toString (v8natives.js):
3589 // var c = %_ClassOf(this); 3590 // var c = %_ClassOf(this);
3590 // if (c === 'Arguments') c = 'Object'; 3591 // if (c === 'Arguments') c = 'Object';
3591 // return "[object " + c + "]"; 3592 // return "[object " + c + "]";
3592 3593
3593 if (!name->IsString()) { 3594 if (!name->IsString()) {
3594 return v8::String::NewFromUtf8(isolate, "[object ]"); 3595 return v8::String::NewFromUtf8(v8_isolate, "[object ]");
3595 } else { 3596 }
3596 i::Handle<i::String> class_name = i::Handle<i::String>::cast(name); 3597 auto class_name = i::Handle<i::String>::cast(name);
3597 if (i::String::Equals(class_name, 3598 if (i::String::Equals(class_name, isolate->factory()->Arguments_string())) {
3598 i_isolate->factory()->Arguments_string())) { 3599 return v8::String::NewFromUtf8(v8_isolate, "[object Object]");
3599 return v8::String::NewFromUtf8(isolate, "[object Object]"); 3600 }
3600 } else { 3601 if (internal::FLAG_harmony_tostring) {
3601 if (internal::FLAG_harmony_tostring) { 3602 PREPARE_FOR_EXECUTION(context, "v8::Object::ObjectProtoToString()", String);
3602 i::Handle<i::Symbol> toStringTag = 3603 auto toStringTag = isolate->factory()->to_string_tag_symbol();
3603 Utils::OpenHandle(*Symbol::GetToStringTag(isolate)); 3604 has_pending_exception = !i::Runtime::GetObjectProperty(
3604 EXCEPTION_PREAMBLE(i_isolate); 3605 isolate, self, toStringTag).ToHandle(&tag);
3605 has_pending_exception = 3606 RETURN_ON_FAILED_EXECUTION(String);
3606 !i::Runtime::GetObjectProperty(i_isolate, self, toStringTag) 3607 if (tag->IsString()) {
3607 .ToHandle(&tag); 3608 class_name = i::Handle<i::String>::cast(tag).EscapeFrom(&handle_scope);
3608 EXCEPTION_BAILOUT_CHECK(i_isolate, Local<v8::String>());
3609
3610 if (tag->IsString()) {
3611 class_name = i::Handle<i::String>::cast(tag);
3612 }
3613 }
3614 const char* prefix = "[object ";
3615 Local<String> str = Utils::ToLocal(class_name);
3616 const char* postfix = "]";
3617
3618 int prefix_len = i::StrLength(prefix);
3619 int str_len = str->Utf8Length();
3620 int postfix_len = i::StrLength(postfix);
3621
3622 int buf_len = prefix_len + str_len + postfix_len;
3623 i::ScopedVector<char> buf(buf_len);
3624
3625 // Write prefix.
3626 char* ptr = buf.start();
3627 i::MemCopy(ptr, prefix, prefix_len * v8::internal::kCharSize);
3628 ptr += prefix_len;
3629
3630 // Write real content.
3631 str->WriteUtf8(ptr, str_len);
3632 ptr += str_len;
3633
3634 // Write postfix.
3635 i::MemCopy(ptr, postfix, postfix_len * v8::internal::kCharSize);
3636
3637 // Copy the buffer into a heap-allocated string and return it.
3638 Local<String> result = v8::String::NewFromUtf8(
3639 isolate, buf.start(), String::kNormalString, buf_len);
3640 return result;
3641 } 3609 }
3642 } 3610 }
3611 const char* prefix = "[object ";
3612 Local<String> str = Utils::ToLocal(class_name);
3613 const char* postfix = "]";
3614
3615 int prefix_len = i::StrLength(prefix);
3616 int str_len = str->Utf8Length();
3617 int postfix_len = i::StrLength(postfix);
3618
3619 int buf_len = prefix_len + str_len + postfix_len;
3620 i::ScopedVector<char> buf(buf_len);
3621
3622 // Write prefix.
3623 char* ptr = buf.start();
3624 i::MemCopy(ptr, prefix, prefix_len * v8::internal::kCharSize);
3625 ptr += prefix_len;
3626
3627 // Write real content.
3628 str->WriteUtf8(ptr, str_len);
3629 ptr += str_len;
3630
3631 // Write postfix.
3632 i::MemCopy(ptr, postfix, postfix_len * v8::internal::kCharSize);
3633
3634 // Copy the buffer into a heap-allocated string and return it.
3635 return v8::String::NewFromUtf8(v8_isolate, buf.start(), String::kNormalString,
3636 buf_len);
3643 } 3637 }
3644 3638
3645 3639
3640 Local<String> v8::Object::ObjectProtoToString() {
3641 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3642 RETURN_TO_LOCAL_UNCHECKED(ObjectProtoToString(context), String);
3643 }
3644
3645
3646 Local<String> v8::Object::GetConstructorName() { 3646 Local<String> v8::Object::GetConstructorName() {
3647 auto self = Utils::OpenHandle(this); 3647 auto self = Utils::OpenHandle(this);
3648 i::Handle<i::String> name(self->constructor_name()); 3648 i::Handle<i::String> name(self->constructor_name());
3649 return Utils::ToLocal(name); 3649 return Utils::ToLocal(name);
3650 } 3650 }
3651 3651
3652 3652
3653 Maybe<bool> v8::Object::Delete(Local<Context> context, Local<Value> key) { 3653 Maybe<bool> v8::Object::Delete(Local<Context> context, Local<Value> key) {
3654 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Delete()", bool); 3654 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Delete()", bool);
3655 auto self = Utils::OpenHandle(this); 3655 auto self = Utils::OpenHandle(this);
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
4030 i::Deoptimizer::DeoptimizeGlobalObject(*obj); 4030 i::Deoptimizer::DeoptimizeGlobalObject(*obj);
4031 4031
4032 i::Handle<i::Map> new_map = 4032 i::Handle<i::Map> new_map =
4033 i::Map::Copy(i::Handle<i::Map>(obj->map()), "APITurnOnAccessCheck"); 4033 i::Map::Copy(i::Handle<i::Map>(obj->map()), "APITurnOnAccessCheck");
4034 new_map->set_is_access_check_needed(true); 4034 new_map->set_is_access_check_needed(true);
4035 i::JSObject::MigrateToMap(obj, new_map); 4035 i::JSObject::MigrateToMap(obj, new_map);
4036 } 4036 }
4037 4037
4038 4038
4039 Local<v8::Object> v8::Object::Clone() { 4039 Local<v8::Object> v8::Object::Clone() {
4040 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4040 auto self = Utils::OpenHandle(this);
4041 ON_BAILOUT(isolate, "v8::Object::Clone()", return Local<Object>()); 4041 auto isolate = self->GetIsolate();
4042 ENTER_V8(isolate); 4042 ENTER_V8(isolate);
4043 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4043 auto result = isolate->factory()->CopyJSObject(self);
4044 EXCEPTION_PREAMBLE(isolate); 4044 CHECK(!result.is_null());
4045 i::Handle<i::JSObject> result = isolate->factory()->CopyJSObject(self);
4046 has_pending_exception = result.is_null();
4047 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>());
4048 return Utils::ToLocal(result); 4045 return Utils::ToLocal(result);
4049 } 4046 }
4050 4047
4051 4048
4052 Local<v8::Context> v8::Object::CreationContext() { 4049 Local<v8::Context> v8::Object::CreationContext() {
4053 auto self = Utils::OpenHandle(this); 4050 auto self = Utils::OpenHandle(this);
4054 auto context = handle(self->GetCreationContext()); 4051 auto context = handle(self->GetCreationContext());
4055 return Utils::ToLocal(context); 4052 return Utils::ToLocal(context);
4056 } 4053 }
4057 4054
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
4137 object, 4134 object,
4138 GetElementsKindFromExternalArrayType(array_type)); 4135 GetElementsKindFromExternalArrayType(array_type));
4139 4136
4140 i::JSObject::SetMapAndElements(object, external_array_map, array); 4137 i::JSObject::SetMapAndElements(object, external_array_map, array);
4141 } 4138 }
4142 4139
4143 } // namespace 4140 } // namespace
4144 4141
4145 4142
4146 void v8::Object::SetIndexedPropertiesToPixelData(uint8_t* data, int length) { 4143 void v8::Object::SetIndexedPropertiesToPixelData(uint8_t* data, int length) {
4147 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4144 auto self = Utils::OpenHandle(this);
4148 ON_BAILOUT(isolate, "v8::SetElementsToPixelData()", return); 4145 auto isolate = self->GetIsolate();
4149 ENTER_V8(isolate); 4146 ENTER_V8(isolate);
4150 i::HandleScope scope(isolate); 4147 i::HandleScope scope(isolate);
4151 if (!Utils::ApiCheck(length >= 0 && 4148 if (!Utils::ApiCheck(length >= 0 &&
4152 length <= i::ExternalUint8ClampedArray::kMaxLength, 4149 length <= i::ExternalUint8ClampedArray::kMaxLength,
4153 "v8::Object::SetIndexedPropertiesToPixelData()", 4150 "v8::Object::SetIndexedPropertiesToPixelData()",
4154 "length exceeds max acceptable value")) { 4151 "length exceeds max acceptable value")) {
4155 return; 4152 return;
4156 } 4153 }
4157 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4158 if (!Utils::ApiCheck(!self->IsJSArray(), 4154 if (!Utils::ApiCheck(!self->IsJSArray(),
4159 "v8::Object::SetIndexedPropertiesToPixelData()", 4155 "v8::Object::SetIndexedPropertiesToPixelData()",
4160 "JSArray is not supported")) { 4156 "JSArray is not supported")) {
4161 return; 4157 return;
4162 } 4158 }
4163 PrepareExternalArrayElements(self, data, kExternalUint8ClampedArray, length); 4159 PrepareExternalArrayElements(self, data, kExternalUint8ClampedArray, length);
4164 } 4160 }
4165 4161
4166 4162
4167 bool v8::Object::HasIndexedPropertiesInPixelData() { 4163 bool v8::Object::HasIndexedPropertiesInPixelData() {
4168 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4164 auto self = Utils::OpenHandle(this);
4169 ON_BAILOUT(self->GetIsolate(), "v8::HasIndexedPropertiesInPixelData()",
4170 return false);
4171 return self->HasExternalUint8ClampedElements(); 4165 return self->HasExternalUint8ClampedElements();
4172 } 4166 }
4173 4167
4174 4168
4175 uint8_t* v8::Object::GetIndexedPropertiesPixelData() { 4169 uint8_t* v8::Object::GetIndexedPropertiesPixelData() {
4176 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4170 auto self = Utils::OpenHandle(this);
4177 ON_BAILOUT(self->GetIsolate(), "v8::GetIndexedPropertiesPixelData()",
4178 return NULL);
4179 if (self->HasExternalUint8ClampedElements()) { 4171 if (self->HasExternalUint8ClampedElements()) {
4180 return i::ExternalUint8ClampedArray::cast(self->elements())-> 4172 return i::ExternalUint8ClampedArray::cast(self->elements())->
4181 external_uint8_clamped_pointer(); 4173 external_uint8_clamped_pointer();
4182 } else {
4183 return NULL;
4184 } 4174 }
4175 return nullptr;
4185 } 4176 }
4186 4177
4187 4178
4188 int v8::Object::GetIndexedPropertiesPixelDataLength() { 4179 int v8::Object::GetIndexedPropertiesPixelDataLength() {
4189 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4180 auto self = Utils::OpenHandle(this);
4190 ON_BAILOUT(self->GetIsolate(), "v8::GetIndexedPropertiesPixelDataLength()",
4191 return -1);
4192 if (self->HasExternalUint8ClampedElements()) { 4181 if (self->HasExternalUint8ClampedElements()) {
4193 return i::ExternalUint8ClampedArray::cast(self->elements())->length(); 4182 return i::ExternalUint8ClampedArray::cast(self->elements())->length();
4194 } else {
4195 return -1;
4196 } 4183 }
4184 return -1;
4197 } 4185 }
4198 4186
4199 4187
4200 void v8::Object::SetIndexedPropertiesToExternalArrayData( 4188 void v8::Object::SetIndexedPropertiesToExternalArrayData(
4201 void* data, 4189 void* data,
4202 ExternalArrayType array_type, 4190 ExternalArrayType array_type,
4203 int length) { 4191 int length) {
4204 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4192 auto self = Utils::OpenHandle(this);
4205 ON_BAILOUT(isolate, "v8::SetIndexedPropertiesToExternalArrayData()", return); 4193 auto isolate = self->GetIsolate();
4206 ENTER_V8(isolate); 4194 ENTER_V8(isolate);
4207 i::HandleScope scope(isolate); 4195 i::HandleScope scope(isolate);
4208 if (!Utils::ApiCheck(length >= 0 && length <= i::ExternalArray::kMaxLength, 4196 if (!Utils::ApiCheck(length >= 0 && length <= i::ExternalArray::kMaxLength,
4209 "v8::Object::SetIndexedPropertiesToExternalArrayData()", 4197 "v8::Object::SetIndexedPropertiesToExternalArrayData()",
4210 "length exceeds max acceptable value")) { 4198 "length exceeds max acceptable value")) {
4211 return; 4199 return;
4212 } 4200 }
4213 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4214 if (!Utils::ApiCheck(!self->IsJSArray(), 4201 if (!Utils::ApiCheck(!self->IsJSArray(),
4215 "v8::Object::SetIndexedPropertiesToExternalArrayData()", 4202 "v8::Object::SetIndexedPropertiesToExternalArrayData()",
4216 "JSArray is not supported")) { 4203 "JSArray is not supported")) {
4217 return; 4204 return;
4218 } 4205 }
4219 PrepareExternalArrayElements(self, data, array_type, length); 4206 PrepareExternalArrayElements(self, data, array_type, length);
4220 } 4207 }
4221 4208
4222 4209
4223 bool v8::Object::HasIndexedPropertiesInExternalArrayData() { 4210 bool v8::Object::HasIndexedPropertiesInExternalArrayData() {
4224 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4211 auto self = Utils::OpenHandle(this);
4225 ON_BAILOUT(self->GetIsolate(),
4226 "v8::HasIndexedPropertiesInExternalArrayData()",
4227 return false);
4228 return self->HasExternalArrayElements(); 4212 return self->HasExternalArrayElements();
4229 } 4213 }
4230 4214
4231 4215
4232 void* v8::Object::GetIndexedPropertiesExternalArrayData() { 4216 void* v8::Object::GetIndexedPropertiesExternalArrayData() {
4233 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4217 auto self = Utils::OpenHandle(this);
4234 ON_BAILOUT(self->GetIsolate(),
4235 "v8::GetIndexedPropertiesExternalArrayData()",
4236 return NULL);
4237 if (self->HasExternalArrayElements()) { 4218 if (self->HasExternalArrayElements()) {
4238 return i::ExternalArray::cast(self->elements())->external_pointer(); 4219 return i::ExternalArray::cast(self->elements())->external_pointer();
4239 } else {
4240 return NULL;
4241 } 4220 }
4221 return nullptr;
4242 } 4222 }
4243 4223
4244 4224
4245 ExternalArrayType v8::Object::GetIndexedPropertiesExternalArrayDataType() { 4225 ExternalArrayType v8::Object::GetIndexedPropertiesExternalArrayDataType() {
4246 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4226 auto self = Utils::OpenHandle(this);
4247 ON_BAILOUT(self->GetIsolate(),
4248 "v8::GetIndexedPropertiesExternalArrayDataType()",
4249 return static_cast<ExternalArrayType>(-1));
4250 switch (self->elements()->map()->instance_type()) { 4227 switch (self->elements()->map()->instance_type()) {
4251 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ 4228 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \
4252 case i::EXTERNAL_##TYPE##_ARRAY_TYPE: \ 4229 case i::EXTERNAL_##TYPE##_ARRAY_TYPE: \
4253 return kExternal##Type##Array; 4230 return kExternal##Type##Array;
4254 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE) 4231 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE)
4255 #undef INSTANCE_TYPE_TO_ARRAY_TYPE 4232 #undef INSTANCE_TYPE_TO_ARRAY_TYPE
4256 default: 4233 default:
4257 return static_cast<ExternalArrayType>(-1); 4234 return static_cast<ExternalArrayType>(-1);
4258 } 4235 }
4259 } 4236 }
4260 4237
4261 4238
4262 int v8::Object::GetIndexedPropertiesExternalArrayDataLength() { 4239 int v8::Object::GetIndexedPropertiesExternalArrayDataLength() {
4263 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4240 auto self = Utils::OpenHandle(this);
4264 ON_BAILOUT(self->GetIsolate(),
4265 "v8::GetIndexedPropertiesExternalArrayDataLength()",
4266 return 0);
4267 if (self->HasExternalArrayElements()) { 4241 if (self->HasExternalArrayElements()) {
4268 return i::ExternalArray::cast(self->elements())->length(); 4242 return i::ExternalArray::cast(self->elements())->length();
4269 } else {
4270 return -1;
4271 } 4243 }
4244 return -1;
4272 } 4245 }
4273 4246
4274 4247
4275 bool v8::Object::IsCallable() { 4248 bool v8::Object::IsCallable() {
4276 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4249 auto self = Utils::OpenHandle(this);
4277 ON_BAILOUT(isolate, "v8::Object::IsCallable()", return false); 4250 return self->IsCallable();
4278 ENTER_V8(isolate);
4279 i::HandleScope scope(isolate);
4280 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
4281 return obj->IsCallable();
4282 } 4251 }
4283 4252
4284 4253
4285 Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Value> recv, 4254 MaybeLocal<Value> Object::CallAsFunction(Local<Context> context,
4286 int argc, 4255 Handle<Value> recv, int argc,
4287 v8::Handle<v8::Value> argv[]) { 4256 Handle<Value> argv[]) {
4288 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4257 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()",
4289 ON_BAILOUT(isolate, "v8::Object::CallAsFunction()", 4258 Value);
4290 return Local<v8::Value>());
4291 LOG_API(isolate, "Object::CallAsFunction");
4292 ENTER_V8(isolate);
4293 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 4259 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4294 i::HandleScope scope(isolate); 4260 auto self = Utils::OpenHandle(this);
4295 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 4261 auto recv_obj = Utils::OpenHandle(*recv);
4296 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
4297 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 4262 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4298 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 4263 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4299 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>(); 4264 i::Handle<i::JSFunction> fun;
4300 if (obj->IsJSFunction()) { 4265 if (self->IsJSFunction()) {
4301 fun = i::Handle<i::JSFunction>::cast(obj); 4266 fun = i::Handle<i::JSFunction>::cast(self);
4302 } else { 4267 } else {
4303 EXCEPTION_PREAMBLE(isolate);
4304 i::Handle<i::Object> delegate; 4268 i::Handle<i::Object> delegate;
4305 has_pending_exception = !i::Execution::TryGetFunctionDelegate( 4269 has_pending_exception = !i::Execution::TryGetFunctionDelegate(isolate, self)
4306 isolate, obj).ToHandle(&delegate); 4270 .ToHandle(&delegate);
4307 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 4271 RETURN_ON_FAILED_EXECUTION(Value);
4308 fun = i::Handle<i::JSFunction>::cast(delegate); 4272 fun = i::Handle<i::JSFunction>::cast(delegate);
4309 recv_obj = obj; 4273 recv_obj = self;
4310 } 4274 }
4311 EXCEPTION_PREAMBLE(isolate); 4275 Local<Value> result;
4312 i::Handle<i::Object> returned; 4276 has_pending_exception =
4313 has_pending_exception = !i::Execution::Call( 4277 !ToLocal<Value>(
4314 isolate, fun, recv_obj, argc, args, true).ToHandle(&returned); 4278 i::Execution::Call(isolate, fun, recv_obj, argc, args, true),
4315 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); 4279 &result);
4316 return Utils::ToLocal(scope.CloseAndEscape(returned)); 4280 RETURN_ON_FAILED_EXECUTION(Value);
4281 RETURN_ESCAPED(result);
4282 }
4283
4284
4285 Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Value> recv, int argc,
4286 v8::Handle<v8::Value> argv[]) {
4287 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
4288 Local<Value>* argv_cast = reinterpret_cast<Local<Value>*>(argv);
4289 RETURN_TO_LOCAL_UNCHECKED(CallAsFunction(context, recv, argc, argv_cast),
4290 Value);
4291 }
4292
4293
4294 MaybeLocal<Value> Object::CallAsConstructor(Local<Context> context, int argc,
4295 Local<Value> argv[]) {
4296 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context,
4297 "v8::Object::CallAsConstructor()", Value);
4298 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4299 auto self = Utils::OpenHandle(this);
4300 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4301 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4302 if (self->IsJSFunction()) {
4303 auto fun = i::Handle<i::JSFunction>::cast(self);
4304 Local<Value> result;
4305 has_pending_exception =
4306 !ToLocal<Value>(i::Execution::New(fun, argc, args), &result);
4307 RETURN_ON_FAILED_EXECUTION(Value);
4308 RETURN_ESCAPED(result);
4309 }
4310 i::Handle<i::Object> delegate;
4311 has_pending_exception = !i::Execution::TryGetConstructorDelegate(
4312 isolate, self).ToHandle(&delegate);
4313 RETURN_ON_FAILED_EXECUTION(Value);
4314 if (!delegate->IsUndefined()) {
4315 auto fun = i::Handle<i::JSFunction>::cast(delegate);
4316 Local<Value> result;
4317 has_pending_exception =
4318 !ToLocal<Value>(i::Execution::Call(isolate, fun, self, argc, args),
4319 &result);
4320 RETURN_ON_FAILED_EXECUTION(Value);
4321 DCHECK(!delegate->IsUndefined());
4322 RETURN_ESCAPED(result);
4323 }
4324 return MaybeLocal<Value>();
4317 } 4325 }
4318 4326
4319 4327
4320 Local<v8::Value> Object::CallAsConstructor(int argc, 4328 Local<v8::Value> Object::CallAsConstructor(int argc,
4321 v8::Handle<v8::Value> argv[]) { 4329 v8::Handle<v8::Value> argv[]) {
4322 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4330 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
4323 ON_BAILOUT(isolate, "v8::Object::CallAsConstructor()", 4331 Local<Value>* argv_cast = reinterpret_cast<Local<Value>*>(argv);
4324 return Local<v8::Object>()); 4332 RETURN_TO_LOCAL_UNCHECKED(CallAsConstructor(context, argc, argv_cast), Value);
4325 LOG_API(isolate, "Object::CallAsConstructor");
4326 ENTER_V8(isolate);
4327 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4328 i::HandleScope scope(isolate);
4329 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
4330 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4331 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4332 if (obj->IsJSFunction()) {
4333 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj);
4334 EXCEPTION_PREAMBLE(isolate);
4335 i::Handle<i::Object> returned;
4336 has_pending_exception = !i::Execution::New(
4337 fun, argc, args).ToHandle(&returned);
4338 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
4339 return Utils::ToLocal(scope.CloseAndEscape(
4340 i::Handle<i::JSObject>::cast(returned)));
4341 }
4342 EXCEPTION_PREAMBLE(isolate);
4343 i::Handle<i::Object> delegate;
4344 has_pending_exception = !i::Execution::TryGetConstructorDelegate(
4345 isolate, obj).ToHandle(&delegate);
4346 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>());
4347 if (!delegate->IsUndefined()) {
4348 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate);
4349 EXCEPTION_PREAMBLE(isolate);
4350 i::Handle<i::Object> returned;
4351 has_pending_exception = !i::Execution::Call(
4352 isolate, fun, obj, argc, args).ToHandle(&returned);
4353 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
4354 DCHECK(!delegate->IsUndefined());
4355 return Utils::ToLocal(scope.CloseAndEscape(returned));
4356 }
4357 return Local<v8::Object>();
4358 } 4333 }
4359 4334
4360 4335
4361 Local<Function> Function::New(Isolate* v8_isolate, 4336 Local<Function> Function::New(Isolate* v8_isolate,
4362 FunctionCallback callback, 4337 FunctionCallback callback,
4363 Local<Value> data, 4338 Local<Value> data,
4364 int length) { 4339 int length) {
4365 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 4340 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
4366 LOG_API(isolate, "Function::New"); 4341 LOG_API(isolate, "Function::New");
4367 ENTER_V8(isolate); 4342 ENTER_V8(isolate);
(...skipping 3638 matching lines...) Expand 10 before | Expand all | Expand 10 after
8006 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7981 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
8007 Address callback_address = 7982 Address callback_address =
8008 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 7983 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8009 VMState<EXTERNAL> state(isolate); 7984 VMState<EXTERNAL> state(isolate);
8010 ExternalCallbackScope call_scope(isolate, callback_address); 7985 ExternalCallbackScope call_scope(isolate, callback_address);
8011 callback(info); 7986 callback(info);
8012 } 7987 }
8013 7988
8014 7989
8015 } } // namespace v8::internal 7990 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698