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

Side by Side Diff: src/api.cc

Issue 483173002: Expose well-known Symbols to C++ API. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: Created 6 years, 4 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') | src/heap/heap.h » ('j') | 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 6134 matching lines...) Expand 10 before | Expand all | Expand 10 after
6145 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6145 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6146 EnsureInitializedForIsolate(i_isolate, "v8::Symbol::New()"); 6146 EnsureInitializedForIsolate(i_isolate, "v8::Symbol::New()");
6147 LOG_API(i_isolate, "Symbol::New()"); 6147 LOG_API(i_isolate, "Symbol::New()");
6148 ENTER_V8(i_isolate); 6148 ENTER_V8(i_isolate);
6149 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); 6149 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol();
6150 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name)); 6150 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name));
6151 return Utils::ToLocal(result); 6151 return Utils::ToLocal(result);
6152 } 6152 }
6153 6153
6154 6154
6155 static i::Handle<i::Symbol> SymbolFor(i::Isolate* isolate,
6156 i::Handle<i::String> name,
6157 i::Handle<i::String> part) {
6158 i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry();
6159 i::Handle<i::JSObject> symbols =
6160 i::Handle<i::JSObject>::cast(
6161 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked());
6162 i::Handle<i::Object> symbol =
6163 i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked();
6164 if (!symbol->IsSymbol()) {
6165 DCHECK(symbol->IsUndefined());
6166 symbol = isolate->factory()->NewSymbol();
6167 i::Handle<i::Symbol>::cast(symbol)->set_name(*name);
6168 i::JSObject::SetProperty(symbols, name, symbol, i::STRICT).Assert();
6169 }
6170 return i::Handle<i::Symbol>::cast(symbol);
6171 }
6172
6173
6155 Local<Symbol> v8::Symbol::For(Isolate* isolate, Local<String> name) { 6174 Local<Symbol> v8::Symbol::For(Isolate* isolate, Local<String> name) {
6156 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6175 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6157 i::Handle<i::String> i_name = Utils::OpenHandle(*name); 6176 i::Handle<i::String> i_name = Utils::OpenHandle(*name);
6158 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry();
6159 i::Handle<i::String> part = i_isolate->factory()->for_string(); 6177 i::Handle<i::String> part = i_isolate->factory()->for_string();
6160 i::Handle<i::JSObject> symbols = 6178 return Utils::ToLocal(SymbolFor(i_isolate, i_name, part));
6161 i::Handle<i::JSObject>::cast(
6162 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked());
6163 i::Handle<i::Object> symbol =
6164 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked();
6165 if (!symbol->IsSymbol()) {
6166 DCHECK(symbol->IsUndefined());
6167 symbol = i_isolate->factory()->NewSymbol();
6168 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name);
6169 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert();
6170 }
6171 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol));
6172 } 6179 }
6173 6180
6174 6181
6175 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { 6182 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) {
6176 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6183 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6177 i::Handle<i::String> i_name = Utils::OpenHandle(*name); 6184 i::Handle<i::String> i_name = Utils::OpenHandle(*name);
6178 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry();
6179 i::Handle<i::String> part = i_isolate->factory()->for_api_string(); 6185 i::Handle<i::String> part = i_isolate->factory()->for_api_string();
6180 i::Handle<i::JSObject> symbols = 6186 return Utils::ToLocal(SymbolFor(i_isolate, i_name, part));
6181 i::Handle<i::JSObject>::cast(
6182 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked());
6183 i::Handle<i::Object> symbol =
6184 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked();
6185 if (!symbol->IsSymbol()) {
6186 DCHECK(symbol->IsUndefined());
6187 symbol = i_isolate->factory()->NewSymbol();
6188 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name);
6189 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert();
6190 }
6191 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol));
6192 } 6187 }
6193 6188
6194 6189
6190 static Local<Symbol> GetWellKnownSymbol(Isolate* isolate, const char* name) {
6191 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6192 i::Handle<i::String> i_name =
6193 Utils::OpenHandle(*String::NewFromUtf8(isolate, name));
6194 i::Handle<i::String> part = i_isolate->factory()->for_intern_string();
6195 return Utils::ToLocal(SymbolFor(i_isolate, i_name, part));
6196 }
6197
6198
6199 Local<Symbol> v8::Symbol::GetIterator(Isolate* isolate) {
6200 return GetWellKnownSymbol(isolate, "Symbol.iterator");
6201 }
6202
6203
6204 Local<Symbol> v8::Symbol::GetUnscopables(Isolate* isolate) {
6205 return GetWellKnownSymbol(isolate, "Symbol.unscopables");
6206 }
6207
6208
6195 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { 6209 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) {
6196 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6210 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6197 EnsureInitializedForIsolate(i_isolate, "v8::Private::New()"); 6211 EnsureInitializedForIsolate(i_isolate, "v8::Private::New()");
6198 LOG_API(i_isolate, "Private::New()"); 6212 LOG_API(i_isolate, "Private::New()");
6199 ENTER_V8(i_isolate); 6213 ENTER_V8(i_isolate);
6200 i::Handle<i::Symbol> symbol = i_isolate->factory()->NewPrivateSymbol(); 6214 i::Handle<i::Symbol> symbol = i_isolate->factory()->NewPrivateSymbol();
6201 if (!name.IsEmpty()) symbol->set_name(*Utils::OpenHandle(*name)); 6215 if (!name.IsEmpty()) symbol->set_name(*Utils::OpenHandle(*name));
6202 Local<Symbol> result = Utils::ToLocal(symbol); 6216 Local<Symbol> result = Utils::ToLocal(symbol);
6203 return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); 6217 return v8::Handle<Private>(reinterpret_cast<Private*>(*result));
6204 } 6218 }
(...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after
7645 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7659 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
7646 Address callback_address = 7660 Address callback_address =
7647 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 7661 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
7648 VMState<EXTERNAL> state(isolate); 7662 VMState<EXTERNAL> state(isolate);
7649 ExternalCallbackScope call_scope(isolate, callback_address); 7663 ExternalCallbackScope call_scope(isolate, callback_address);
7650 callback(info); 7664 callback(info);
7651 } 7665 }
7652 7666
7653 7667
7654 } } // namespace v8::internal 7668 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/heap/heap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698