https://bugs.webkit.org/show_bug.cgi?id=67875
Reviewed by Geoffrey Garen.
Part of the refactoring process to un-virtualize JSCell. We move
all of the implicit functionality provided by the virtual toPrimitive method
in JSCell to be explicit in JSValue::toPrimitive and JSCell:toPrimitive while
also de-virtualizing JSCell::toPrimitive.
* JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
* runtime/JSCell.cpp:
(JSC::JSCell::toPrimitive):
* runtime/JSCell.h:
We replace JSNotAnObject::toPrimitive with defaultValue, which it overrides from
JSObject. This pushes the virtual method further down, enabling us to get rid
of the virtual call in JSCell. Eventually we'll probably have to deal with this
again, but we'll cross that bridge when we come to it.
* runtime/JSNotAnObject.cpp:
(JSC::JSNotAnObject::defaultValue):
* runtime/JSNotAnObject.h:
* runtime/JSObject.h:
* runtime/JSString.h:
(JSC::JSValue::toPrimitive):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@95466
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2011-09-19 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Remove toPrimitive from JSCell
+ https://bugs.webkit.org/show_bug.cgi?id=67875
+
+ Reviewed by Geoffrey Garen.
+
+ Part of the refactoring process to un-virtualize JSCell. We move
+ all of the implicit functionality provided by the virtual toPrimitive method
+ in JSCell to be explicit in JSValue::toPrimitive and JSCell:toPrimitive while
+ also de-virtualizing JSCell::toPrimitive.
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * runtime/JSCell.cpp:
+ (JSC::JSCell::toPrimitive):
+ * runtime/JSCell.h:
+
+ We replace JSNotAnObject::toPrimitive with defaultValue, which it overrides from
+ JSObject. This pushes the virtual method further down, enabling us to get rid
+ of the virtual call in JSCell. Eventually we'll probably have to deal with this
+ again, but we'll cross that bridge when we come to it.
+ * runtime/JSNotAnObject.cpp:
+ (JSC::JSNotAnObject::defaultValue):
+ * runtime/JSNotAnObject.h:
+ * runtime/JSObject.h:
+ * runtime/JSString.h:
+ (JSC::JSValue::toPrimitive):
+
2011-09-19 Oliver Hunt <oliver@apple.com>
Build fix.
?toObject@JSCell@JSC@@UBEPAVJSObject@2@PAVExecState@2@PAVJSGlobalObject@2@@Z
?toObject@JSObject@JSC@@UBEPAV12@PAVExecState@2@PAVJSGlobalObject@2@@Z
?toObjectSlowCase@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@PAVJSGlobalObject@2@@Z
- ?toPrimitive@JSCell@JSC@@UBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z
- ?toPrimitive@JSString@JSC@@EBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z
?toStrictThisObject@JSObject@JSC@@UBE?AVJSValue@2@PAVExecState@2@@Z
?toString@JSCell@JSC@@UBE?AVUString@2@PAVExecState@2@@Z
?toString@JSObject@JSC@@UBE?AVUString@2@PAVExecState@2@@Z
namespace JSC {
+JSValue JSCell::toPrimitive(ExecState* exec, PreferredPrimitiveType preferredType) const
+{
+ if (isString())
+ return static_cast<const JSString*>(this)->toPrimitive(exec, preferredType);
+ return static_cast<const JSObject*>(this)->toPrimitive(exec, preferredType);
+}
+
bool JSCell::getString(ExecState* exec, UString&stringValue) const
{
if (!isString())
return JSValue();
}
-JSValue JSCell::toPrimitive(ExecState*, PreferredPrimitiveType) const
-{
- ASSERT_NOT_REACHED();
- return JSValue();
-}
-
bool JSCell::getPrimitiveNumber(ExecState*, double&, JSValue&)
{
ASSERT_NOT_REACHED();
virtual ConstructType getConstructData(ConstructData&);
// Basic conversions.
- virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
+ JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue&);
virtual bool toBoolean(ExecState*) const;
virtual double toNumber(ExecState*) const;
return false;
}
- inline JSValue JSValue::toPrimitive(ExecState* exec, PreferredPrimitiveType preferredType) const
- {
- return isCell() ? asCell()->toPrimitive(exec, preferredType) : asValue();
- }
-
inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number, JSValue& value)
{
if (isInt32()) {
ASSERT_CLASS_FITS_IN_CELL(JSNotAnObject);
// JSValue methods
-JSValue JSNotAnObject::toPrimitive(ExecState* exec, PreferredPrimitiveType) const
+JSValue JSNotAnObject::defaultValue(ExecState* exec, PreferredPrimitiveType) const
{
ASSERT_UNUSED(exec, exec->hadException());
return jsNumber(0);
static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
// JSValue methods
- virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
+ virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const;
virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue&);
virtual bool toBoolean(ExecState*) const;
virtual double toNumber(ExecState*) const;
virtual void getPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
- virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType = NoPreference) const;
+ JSValue toPrimitive(ExecState*, PreferredPrimitiveType = NoPreference) const;
virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue& value);
virtual bool toBoolean(ExecState*) const;
virtual double toNumber(ExecState*) const;
}
unsigned length() { return m_length; }
+ JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
bool getStringPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
bool getStringPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
bool getStringPropertyDescriptor(ExecState*, const Identifier& propertyName, PropertyDescriptor&);
}
}
- virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue& value);
virtual bool toBoolean(ExecState*) const;
virtual double toNumber(ExecState*) const;
// --- JSValue inlines ----------------------------
+ inline JSValue JSValue::toPrimitive(ExecState* exec, PreferredPrimitiveType preferredType) const
+ {
+ if (!isCell())
+ return asValue();
+ return asCell()->toPrimitive(exec, preferredType);
+ }
+
inline UString JSValue::toString(ExecState* exec) const
{
if (isString())