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

Side by Side Diff: src/api.cc

Issue 52021: Add a new C++ pointer wrapping API to External to not dilute the... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 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 | Annotate | Revision Log
« no previous file with comments | « src/api.h ('k') | test/cctest/test-api.cc » ('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 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 num = i::Execution::ToInteger(obj, &has_pending_exception); 1440 num = i::Execution::ToInteger(obj, &has_pending_exception);
1441 EXCEPTION_BAILOUT_CHECK(Local<Integer>()); 1441 EXCEPTION_BAILOUT_CHECK(Local<Integer>());
1442 } 1442 }
1443 return Local<Integer>(ToApi<Integer>(num)); 1443 return Local<Integer>(ToApi<Integer>(num));
1444 } 1444 }
1445 1445
1446 1446
1447 External* External::Cast(v8::Value* that) { 1447 External* External::Cast(v8::Value* that) {
1448 if (IsDeadCheck("v8::External::Cast()")) return 0; 1448 if (IsDeadCheck("v8::External::Cast()")) return 0;
1449 i::Handle<i::Object> obj = Utils::OpenHandle(that); 1449 i::Handle<i::Object> obj = Utils::OpenHandle(that);
1450 ApiCheck(obj->IsProxy() || obj->IsSmi(), 1450 ApiCheck(obj->IsProxy(),
1451 "v8::External::Cast()", 1451 "v8::External::Cast()",
1452 "Could not convert to external"); 1452 "Could not convert to external");
1453 return static_cast<External*>(that); 1453 return static_cast<External*>(that);
1454 } 1454 }
1455 1455
1456 1456
1457 v8::Object* v8::Object::Cast(Value* that) { 1457 v8::Object* v8::Object::Cast(Value* that) {
1458 if (IsDeadCheck("v8::Object::Cast()")) return 0; 1458 if (IsDeadCheck("v8::Object::Cast()")) return 0;
1459 i::Handle<i::Object> obj = Utils::OpenHandle(that); 1459 i::Handle<i::Object> obj = Utils::OpenHandle(that);
1460 ApiCheck(obj->IsJSObject(), 1460 ApiCheck(obj->IsJSObject(),
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
2219 if (IsDeadCheck("v8::Int32::Value()")) return 0; 2219 if (IsDeadCheck("v8::Int32::Value()")) return 0;
2220 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2220 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2221 if (obj->IsSmi()) { 2221 if (obj->IsSmi()) {
2222 return i::Smi::cast(*obj)->value(); 2222 return i::Smi::cast(*obj)->value();
2223 } else { 2223 } else {
2224 return static_cast<int32_t>(obj->Number()); 2224 return static_cast<int32_t>(obj->Number());
2225 } 2225 }
2226 } 2226 }
2227 2227
2228 2228
2229 void* External::Value() const {
2230 if (IsDeadCheck("v8::External::Value()")) return 0;
2231 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2232 if (obj->IsSmi()) {
2233 // The external value was an aligned pointer.
2234 return reinterpret_cast<void*>(
2235 i::Smi::cast(*obj)->value() << kAlignedPointerShift);
2236 }
2237 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy());
2238 }
2239
2240
2241 int v8::Object::InternalFieldCount() { 2229 int v8::Object::InternalFieldCount() {
2242 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0; 2230 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0;
2243 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 2231 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
2244 return obj->GetInternalFieldCount(); 2232 return obj->GetInternalFieldCount();
2245 } 2233 }
2246 2234
2247 2235
2248 Local<Value> v8::Object::GetInternalField(int index) { 2236 Local<Value> v8::Object::GetInternalField(int index) {
2249 if (IsDeadCheck("v8::Object::GetInternalField()")) return Local<Value>(); 2237 if (IsDeadCheck("v8::Object::GetInternalField()")) return Local<Value>();
2250 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 2238 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 } 2449 }
2462 2450
2463 2451
2464 bool FunctionTemplate::HasInstance(v8::Handle<v8::Value> value) { 2452 bool FunctionTemplate::HasInstance(v8::Handle<v8::Value> value) {
2465 ON_BAILOUT("v8::FunctionTemplate::HasInstanceOf()", return false); 2453 ON_BAILOUT("v8::FunctionTemplate::HasInstanceOf()", return false);
2466 i::Object* obj = *Utils::OpenHandle(*value); 2454 i::Object* obj = *Utils::OpenHandle(*value);
2467 return obj->IsInstanceOf(*Utils::OpenHandle(this)); 2455 return obj->IsInstanceOf(*Utils::OpenHandle(this));
2468 } 2456 }
2469 2457
2470 2458
2459 static Local<External> ExternalNewImpl(void* data) {
2460 return Utils::ToLocal(i::Factory::NewProxy(static_cast<i::Address>(data)));
2461 }
2462
2463 static void* ExternalValueImpl(i::Handle<i::Object> obj) {
2464 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy());
2465 }
2466
2467
2468 static const intptr_t kAlignedPointerMask = 3;
2469 static const int kAlignedPointerShift = 2;
2470
2471
2472 Local<Value> v8::External::Wrap(void* data) {
2473 STATIC_ASSERT(sizeof(data) == sizeof(i::Address));
2474 LOG_API("External::Wrap");
2475 EnsureInitialized("v8::External::Wrap()");
2476 if ((reinterpret_cast<intptr_t>(data) & kAlignedPointerMask) == 0) {
2477 uintptr_t data_ptr = reinterpret_cast<uintptr_t>(data);
2478 int data_value = static_cast<int>(data_ptr >> kAlignedPointerShift);
2479 STATIC_ASSERT(sizeof(data_ptr) == sizeof(data_value));
2480 i::Handle<i::Object> obj(i::Smi::FromInt(data_value));
2481 return Utils::ToLocal(obj);
2482 }
2483 return ExternalNewImpl(data);
2484 }
2485
2486
2487 void* v8::External::Unwrap(v8::Handle<v8::Value> value) {
2488 if (IsDeadCheck("v8::External::Unwrap()")) return 0;
2489 i::Handle<i::Object> obj = Utils::OpenHandle(*value);
2490 if (obj->IsSmi()) {
2491 // The external value was an aligned pointer.
2492 uintptr_t result = i::Smi::cast(*obj)->value() << kAlignedPointerShift;
2493 return reinterpret_cast<void*>(result);
2494 }
2495 return ExternalValueImpl(obj);
2496 }
2497
2498
2471 Local<External> v8::External::New(void* data) { 2499 Local<External> v8::External::New(void* data) {
2472 STATIC_ASSERT(sizeof(data) == sizeof(i::Address)); 2500 STATIC_ASSERT(sizeof(data) == sizeof(i::Address));
2473 LOG_API("External::New"); 2501 LOG_API("External::New");
2474 EnsureInitialized("v8::External::New()"); 2502 EnsureInitialized("v8::External::New()");
2475 if ((reinterpret_cast<intptr_t>(data) & kAlignedPointerMask) == 0) { 2503 return ExternalNewImpl(data);
2476 uintptr_t data_ptr = reinterpret_cast<uintptr_t>(data); 2504 }
2477 int data_value = static_cast<int>(data_ptr >> kAlignedPointerShift); 2505
2478 STATIC_ASSERT(sizeof(data_ptr) == sizeof(data_value)); 2506
2479 i::Handle<i::Smi> obj(i::Smi::FromInt(data_value)); 2507 void* External::Value() const {
2480 return Utils::ToLocal(obj); 2508 if (IsDeadCheck("v8::External::Value()")) return 0;
2481 } 2509 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2482 return Utils::ToLocal(i::Factory::NewProxy(static_cast<i::Address>(data))); 2510 return ExternalValueImpl(obj);
2483 } 2511 }
2484 2512
2485 2513
2486 Local<String> v8::String::Empty() { 2514 Local<String> v8::String::Empty() {
2487 EnsureInitialized("v8::String::Empty()"); 2515 EnsureInitialized("v8::String::Empty()");
2488 LOG_API("String::Empty()"); 2516 LOG_API("String::Empty()");
2489 return Utils::ToLocal(i::Factory::empty_symbol()); 2517 return Utils::ToLocal(i::Factory::empty_symbol());
2490 } 2518 }
2491 2519
2492 2520
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
3164 reinterpret_cast<HandleScopeImplementer*>(storage); 3192 reinterpret_cast<HandleScopeImplementer*>(storage);
3165 List<void**>* blocks_of_archived_thread = thread_local->Blocks(); 3193 List<void**>* blocks_of_archived_thread = thread_local->Blocks();
3166 v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread = 3194 v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread =
3167 &thread_local->handle_scope_data_; 3195 &thread_local->handle_scope_data_;
3168 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread); 3196 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread);
3169 3197
3170 return storage + ArchiveSpacePerThread(); 3198 return storage + ArchiveSpacePerThread();
3171 } 3199 }
3172 3200
3173 } } // namespace v8::internal 3201 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/api.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698