Reviewers: Kasper Lund,

Description:
Introduce faster utilty methods for storing and retrieving native
pointers
in internal fields.

Please review this at http://codereview.chromium.org/155635

Affected files:
   M include/v8.h
   M src/api.cc


Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index  
8f22c81b651ef6a07c8e2e87c0b1a0e7743a9e39..4d4e0554e47b95a36faf6c6b602e83e2580b7588
  
100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -1110,8 +1110,12 @@ class V8EXPORT Object : public Value {
    int InternalFieldCount();
    /** Gets the value in an internal field. */
    Local<Value> GetInternalField(int index);
+  /** Gets a native pointer from an internal field. */
+  void* GetPointerFromInternalField(int index);
    /** Sets the value in an internal field. */
    void SetInternalField(int index, Handle<Value> value);
+  /** Sets a native pointer in an internal field. */
+  void SetPointerInInternalField(int index, void* ptr);

    // Testers for local properties.
    bool HasRealNamedProperty(Handle<String> key);
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index  
145fa9d9b82760a62072278e3cd643344f37021c..13849c2b361d6f506a695242b986a42c0ee7c838
  
100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -2451,6 +2451,13 @@ Local<Value> v8::Object::GetInternalField(int index)  
{
  }


+void* v8::Object::GetPointerFromInternalField(int index) {
+  i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
+  int value = i::Smi::cast(obj->GetInternalField(index))->value();
+  return reinterpret_cast<void*>(value << 1);
+}
+
+
  void v8::Object::SetInternalField(int index, v8::Handle<Value> value) {
    if (IsDeadCheck("v8::Object::SetInternalField()")) return;
    i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
@@ -2465,6 +2472,14 @@ void v8::Object::SetInternalField(int index,  
v8::Handle<Value> value) {
  }


+void v8::Object::SetPointerInInternalField(int index, void* ptr) {
+  i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
+  int value = reinterpret_cast<int>(ptr);
+  ASSERT(value & 0x1 == 0);
+  obj->SetInternalField(index, i::Smi::FromInt(value >> 1));
+}
+
+
  // --- E n v i r o n m e n t ---

  bool v8::V8::Initialize() {



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to