| 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 3005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3016 EXCEPTION_BAILOUT_CHECK(isolate, 0); | 3016 EXCEPTION_BAILOUT_CHECK(isolate, 0); |
| 3017 if (num->IsSmi()) { | 3017 if (num->IsSmi()) { |
| 3018 return i::Smi::cast(*num)->value(); | 3018 return i::Smi::cast(*num)->value(); |
| 3019 } else { | 3019 } else { |
| 3020 return static_cast<uint32_t>(num->Number()); | 3020 return static_cast<uint32_t>(num->Number()); |
| 3021 } | 3021 } |
| 3022 } | 3022 } |
| 3023 } | 3023 } |
| 3024 | 3024 |
| 3025 | 3025 |
| 3026 // TODO(verwaest): Remove the attribs argument, since it doesn't make sense for | 3026 bool v8::Object::Set(v8::Handle<Value> key, v8::Handle<Value> value) { |
| 3027 // existing properties. Use ForceSet instead to define or redefine properties | |
| 3028 // with specific attributes. | |
| 3029 bool v8::Object::Set(v8::Handle<Value> key, v8::Handle<Value> value, | |
| 3030 v8::PropertyAttribute attribs) { | |
| 3031 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3027 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3032 ON_BAILOUT(isolate, "v8::Object::Set()", return false); | 3028 ON_BAILOUT(isolate, "v8::Object::Set()", return false); |
| 3033 ENTER_V8(isolate); | 3029 ENTER_V8(isolate); |
| 3034 i::HandleScope scope(isolate); | 3030 i::HandleScope scope(isolate); |
| 3035 i::Handle<i::Object> self = Utils::OpenHandle(this); | 3031 i::Handle<i::Object> self = Utils::OpenHandle(this); |
| 3036 i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); | 3032 i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); |
| 3037 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); | 3033 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); |
| 3038 EXCEPTION_PREAMBLE(isolate); | 3034 EXCEPTION_PREAMBLE(isolate); |
| 3039 has_pending_exception = i::Runtime::SetObjectProperty( | 3035 has_pending_exception = |
| 3040 isolate, self, key_obj, value_obj, i::SLOPPY, | 3036 i::Runtime::SetObjectProperty(isolate, self, key_obj, value_obj, |
| 3041 static_cast<PropertyAttributes>(attribs)).is_null(); | 3037 i::SLOPPY).is_null(); |
| 3042 EXCEPTION_BAILOUT_CHECK(isolate, false); | 3038 EXCEPTION_BAILOUT_CHECK(isolate, false); |
| 3043 return true; | 3039 return true; |
| 3044 } | 3040 } |
| 3045 | 3041 |
| 3046 | 3042 |
| 3047 bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { | 3043 bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { |
| 3048 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3044 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3049 ON_BAILOUT(isolate, "v8::Object::Set()", return false); | 3045 ON_BAILOUT(isolate, "v8::Object::Set()", return false); |
| 3050 ENTER_V8(isolate); | 3046 ENTER_V8(isolate); |
| 3051 i::HandleScope scope(isolate); | 3047 i::HandleScope scope(isolate); |
| (...skipping 3114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6166 i::Handle<i::String> part = i_isolate->factory()->for_string(); | 6162 i::Handle<i::String> part = i_isolate->factory()->for_string(); |
| 6167 i::Handle<i::JSObject> symbols = | 6163 i::Handle<i::JSObject> symbols = |
| 6168 i::Handle<i::JSObject>::cast( | 6164 i::Handle<i::JSObject>::cast( |
| 6169 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6165 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
| 6170 i::Handle<i::Object> symbol = | 6166 i::Handle<i::Object> symbol = |
| 6171 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); | 6167 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); |
| 6172 if (!symbol->IsSymbol()) { | 6168 if (!symbol->IsSymbol()) { |
| 6173 ASSERT(symbol->IsUndefined()); | 6169 ASSERT(symbol->IsUndefined()); |
| 6174 symbol = i_isolate->factory()->NewSymbol(); | 6170 symbol = i_isolate->factory()->NewSymbol(); |
| 6175 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6171 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
| 6176 i::JSObject::SetProperty( | 6172 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); |
| 6177 symbols, i_name, symbol, NONE, i::STRICT).Assert(); | |
| 6178 } | 6173 } |
| 6179 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6174 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
| 6180 } | 6175 } |
| 6181 | 6176 |
| 6182 | 6177 |
| 6183 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { | 6178 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { |
| 6184 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6179 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 6185 i::Handle<i::String> i_name = Utils::OpenHandle(*name); | 6180 i::Handle<i::String> i_name = Utils::OpenHandle(*name); |
| 6186 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); | 6181 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); |
| 6187 i::Handle<i::String> part = i_isolate->factory()->for_api_string(); | 6182 i::Handle<i::String> part = i_isolate->factory()->for_api_string(); |
| 6188 i::Handle<i::JSObject> symbols = | 6183 i::Handle<i::JSObject> symbols = |
| 6189 i::Handle<i::JSObject>::cast( | 6184 i::Handle<i::JSObject>::cast( |
| 6190 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6185 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
| 6191 i::Handle<i::Object> symbol = | 6186 i::Handle<i::Object> symbol = |
| 6192 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); | 6187 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); |
| 6193 if (!symbol->IsSymbol()) { | 6188 if (!symbol->IsSymbol()) { |
| 6194 ASSERT(symbol->IsUndefined()); | 6189 ASSERT(symbol->IsUndefined()); |
| 6195 symbol = i_isolate->factory()->NewSymbol(); | 6190 symbol = i_isolate->factory()->NewSymbol(); |
| 6196 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6191 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
| 6197 i::JSObject::SetProperty( | 6192 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); |
| 6198 symbols, i_name, symbol, NONE, i::STRICT).Assert(); | |
| 6199 } | 6193 } |
| 6200 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6194 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
| 6201 } | 6195 } |
| 6202 | 6196 |
| 6203 | 6197 |
| 6204 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { | 6198 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { |
| 6205 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6199 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 6206 EnsureInitializedForIsolate(i_isolate, "v8::Private::New()"); | 6200 EnsureInitializedForIsolate(i_isolate, "v8::Private::New()"); |
| 6207 LOG_API(i_isolate, "Private::New()"); | 6201 LOG_API(i_isolate, "Private::New()"); |
| 6208 ENTER_V8(i_isolate); | 6202 ENTER_V8(i_isolate); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 6220 i::Handle<i::String> part = i_isolate->factory()->private_api_string(); | 6214 i::Handle<i::String> part = i_isolate->factory()->private_api_string(); |
| 6221 i::Handle<i::JSObject> privates = | 6215 i::Handle<i::JSObject> privates = |
| 6222 i::Handle<i::JSObject>::cast( | 6216 i::Handle<i::JSObject>::cast( |
| 6223 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6217 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
| 6224 i::Handle<i::Object> symbol = | 6218 i::Handle<i::Object> symbol = |
| 6225 i::Object::GetPropertyOrElement(privates, i_name).ToHandleChecked(); | 6219 i::Object::GetPropertyOrElement(privates, i_name).ToHandleChecked(); |
| 6226 if (!symbol->IsSymbol()) { | 6220 if (!symbol->IsSymbol()) { |
| 6227 ASSERT(symbol->IsUndefined()); | 6221 ASSERT(symbol->IsUndefined()); |
| 6228 symbol = i_isolate->factory()->NewPrivateSymbol(); | 6222 symbol = i_isolate->factory()->NewPrivateSymbol(); |
| 6229 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6223 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
| 6230 i::JSObject::SetProperty( | 6224 i::JSObject::SetProperty(privates, i_name, symbol, i::STRICT).Assert(); |
| 6231 privates, i_name, symbol, NONE, i::STRICT).Assert(); | |
| 6232 } | 6225 } |
| 6233 Local<Symbol> result = Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6226 Local<Symbol> result = Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
| 6234 return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); | 6227 return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); |
| 6235 } | 6228 } |
| 6236 | 6229 |
| 6237 | 6230 |
| 6238 Local<Number> v8::Number::New(Isolate* isolate, double value) { | 6231 Local<Number> v8::Number::New(Isolate* isolate, double value) { |
| 6239 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6232 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 6240 ASSERT(internal_isolate->IsInitialized()); | 6233 ASSERT(internal_isolate->IsInitialized()); |
| 6241 if (std::isnan(value)) { | 6234 if (std::isnan(value)) { |
| (...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7630 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7623 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
| 7631 Address callback_address = | 7624 Address callback_address = |
| 7632 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7625 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 7633 VMState<EXTERNAL> state(isolate); | 7626 VMState<EXTERNAL> state(isolate); |
| 7634 ExternalCallbackScope call_scope(isolate, callback_address); | 7627 ExternalCallbackScope call_scope(isolate, callback_address); |
| 7635 callback(info); | 7628 callback(info); |
| 7636 } | 7629 } |
| 7637 | 7630 |
| 7638 | 7631 |
| 7639 } } // namespace v8::internal | 7632 } } // namespace v8::internal |
| OLD | NEW |