]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/Operations.cpp
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / runtime / Operations.cpp
index 4cb9de505e79660e34eded7ff2af01aeed3e7a5c..5732cfd0c224f329579dc3d75ecb51ed56b90bc8 100644 (file)
 #include "Operations.h"
 
 #include "Error.h"
+#include "JSCInlines.h"
 #include "JSObject.h"
 #include "JSString.h"
-#include <math.h>
-#include <stdio.h>
 #include <wtf/MathExtras.h>
 
 namespace JSC {
@@ -56,44 +55,55 @@ NEVER_INLINE JSValue jsAddSlowCase(CallFrame* callFrame, JSValue v1, JSValue v2)
     return jsNumber(p1.toNumber(callFrame) + p2.toNumber(callFrame));
 }
 
-JSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v)
+JSValue jsTypeStringForValue(VM& vm, JSGlobalObject* globalObject, JSValue v)
 {
-    JSGlobalData& globalData = callFrame->globalData();
     if (v.isUndefined())
-        return globalData.smallStrings.undefinedString(&globalData);
+        return vm.smallStrings.undefinedString();
     if (v.isBoolean())
-        return globalData.smallStrings.booleanString(&globalData);
+        return vm.smallStrings.booleanString();
     if (v.isNumber())
-        return globalData.smallStrings.numberString(&globalData);
+        return vm.smallStrings.numberString();
     if (v.isString())
-        return globalData.smallStrings.stringString(&globalData);
+        return vm.smallStrings.stringString();
+    if (v.isSymbol())
+        return vm.smallStrings.symbolString();
     if (v.isObject()) {
+        JSObject* object = asObject(v);
         // Return "undefined" for objects that should be treated
         // as null when doing comparisons.
-        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
-            return globalData.smallStrings.undefinedString(&globalData);
-        CallData callData;
-        JSObject* object = asObject(v);
-        if (object->methodTable()->getCallData(object, callData) != CallTypeNone)
-            return globalData.smallStrings.functionString(&globalData);
+        if (object->structure(vm)->masqueradesAsUndefined(globalObject))
+            return vm.smallStrings.undefinedString();
+        if (object->type() == JSFunctionType)
+            return vm.smallStrings.functionString();
+        if (object->inlineTypeFlags() & TypeOfShouldCallGetCallData) {
+            CallData callData;
+            JSObject* object = asObject(v);
+            if (object->methodTable(vm)->getCallData(object, callData) != CallTypeNone)
+                return vm.smallStrings.functionString();
+        }
     }
-    return globalData.smallStrings.objectString(&globalData);
+    return vm.smallStrings.objectString();
 }
 
-bool jsIsObjectType(JSValue v)
+JSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v)
+{
+    return jsTypeStringForValue(callFrame->vm(), callFrame->lexicalGlobalObject(), v);
+}
+
+bool jsIsObjectTypeOrNull(CallFrame* callFrame, JSValue v)
 {
     if (!v.isCell())
         return v.isNull();
 
-    JSType type = v.asCell()->structure()->typeInfo().type();
-    if (type == NumberType || type == StringType)
+    JSType type = v.asCell()->type();
+    if (type == StringType || type == SymbolType)
         return false;
     if (type >= ObjectType) {
-        if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined())
+        if (asObject(v)->structure(callFrame->vm())->masqueradesAsUndefined(callFrame->lexicalGlobalObject()))
             return false;
         CallData callData;
         JSObject* object = asObject(v);
-        if (object->methodTable()->getCallData(object, callData) != CallTypeNone)
+        if (object->methodTable(callFrame->vm())->getCallData(object, callData) != CallTypeNone)
             return false;
     }
     return true;