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;