JavaScriptCore:

2009-05-02  Sam Weinig  <sam@webkit.org>

        Roll JSC API number marshaling back in one last time (I hope).

WebCore:

2009-05-03  Sam Weinig  <sam@webkit.org>

        Roll JSC API number marshaling back in one last time (I hope).



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@43160 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/runtime/JSNumberCell.cpp b/JavaScriptCore/runtime/JSNumberCell.cpp
index 94a256e..79bd9f1 100644
--- a/JavaScriptCore/runtime/JSNumberCell.cpp
+++ b/JavaScriptCore/runtime/JSNumberCell.cpp
@@ -113,6 +113,11 @@
     return new (globalData) JSNumberCell(globalData, d);
 }
 
+JSValue jsAPIMangledNumber(ExecState* exec, double d)
+{
+    return new (exec) JSNumberCell(JSNumberCell::APIMangled, d);
+}
+
 #else
 
 JSValue jsNumberCell(ExecState*, double)
diff --git a/JavaScriptCore/runtime/JSNumberCell.h b/JavaScriptCore/runtime/JSNumberCell.h
index 079d98e..5683398 100644
--- a/JavaScriptCore/runtime/JSNumberCell.h
+++ b/JavaScriptCore/runtime/JSNumberCell.h
@@ -52,6 +52,7 @@
         friend class JIT;
         friend JSValue jsNumberCell(JSGlobalData*, double);
         friend JSValue jsNumberCell(ExecState*, double);
+        friend JSValue jsAPIMangledNumber(ExecState*, double);
     public:
         double value() const { return m_value; }
 
@@ -66,6 +67,9 @@
         virtual JSObject* toThisObject(ExecState*) const;
         virtual JSValue getJSNumber();
 
+        static const uintptr_t JSAPIMangledMagicNumber = 0xbbadbeef;
+        bool isAPIMangledNumber() const { return m_structure == reinterpret_cast<Structure*>(JSAPIMangledMagicNumber); }
+
         void* operator new(size_t size, ExecState* exec)
         {
     #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
@@ -99,6 +103,13 @@
         {
         }
 
+        enum APIMangledTag { APIMangled };
+        JSNumberCell(APIMangledTag, double value)
+            : JSCell(reinterpret_cast<Structure*>(JSAPIMangledMagicNumber))
+            , m_value(value)
+        {
+        }
+
         virtual bool getUInt32(uint32_t&) const;
         virtual bool getTruncatedInt32(int32_t&) const;
         virtual bool getTruncatedUInt32(uint32_t&) const;
@@ -225,6 +236,14 @@
         return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : getDoubleNumber();
     }
 
+    JSValue jsAPIMangledNumber(ExecState* exec, double);
+
+    inline bool JSValue::isAPIMangledNumber()
+    {
+        ASSERT(isNumber());
+        return JSImmediate::isImmediate(asValue()) ? false : asNumberCell(asValue())->isAPIMangledNumber();
+    }
+
 #else
 
     inline JSValue::JSValue(ExecState*, double d)
diff --git a/JavaScriptCore/runtime/JSValue.h b/JavaScriptCore/runtime/JSValue.h
index e61baaf..391425c 100644
--- a/JavaScriptCore/runtime/JSValue.h
+++ b/JavaScriptCore/runtime/JSValue.h
@@ -176,6 +176,9 @@
         // signle precision float is not a representation used in JS or JSC).
         float toFloat(ExecState* exec) const { return static_cast<float>(toNumber(exec)); }
 
+        // API Mangled Numbers
+        bool isAPIMangledNumber();
+
         // Garbage collection.
         void mark();
         bool marked() const;