Title: [189160] trunk/Source/_javascript_Core
Revision
189160
Author
[email protected]
Date
2015-08-30 15:33:23 -0700 (Sun, 30 Aug 2015)

Log Message

JSC property attributes should fit in a byte
https://bugs.webkit.org/show_bug.cgi?id=148611

Reviewed by Sam Weinig.

I want to make room in PropertyMapEntry for more things to support property type inference (see
https://bugs.webkit.org/show_bug.cgi?id=148610). The most obvious candidate for a size reduction is
attributes, since we only have a small number of attribute bits. Even without complex changes, it
would have been possible to reduce the attribute field from 32 bits to 16 bits. Specifically, prior
to this change, the attributes field needed 9 bits. This made it very tempting to trim it so that
it could fit in a byte.

Luckily, many of the attributes bits are for the static lookup hashtables that we use for lazily
building objects in the standard library. Those bits don't need to stay around after the property
has been created, since they are just for telling the code in Lookup how to create the property.
So, this change separates the attributes bits into those that are interesting for Structure and
those that aren't. The ones used by Structure sit in the low 8 bits, allowing for the attributes
field in PropertyMapEntry to be a uint8_t. The attributes bits used only by Lookup use the higher
bits. In production, the conversion from the Lookup attributes to the Structure attributes is just
a cast to uint8_t. In debug, we assert that those bits are not dropped by accident. Code that
intentionally drops those bits calls attributesForStructure().

It turned out that there was a lot of code that was using the Function bit even in code that didn't
involve Lookup. This change removes those uses of Function. Structure does not need to know if we
think that a property points to a function.

* jsc.cpp:
(GlobalObject::finishCreation):
* runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::init):
* runtime/JSObject.h:
* runtime/Lookup.cpp:
(JSC::setUpStaticFunctionSlot):
* runtime/Lookup.h:
(JSC::getStaticPropertySlot):
(JSC::getStaticValueSlot):
(JSC::reifyStaticProperties):
* runtime/MathObject.cpp:
(JSC::MathObject::finishCreation):
* runtime/NumberConstructor.cpp:
(JSC::NumberConstructor::finishCreation):
* runtime/PropertySlot.h:
(JSC::attributesForStructure):
(JSC::PropertySlot::setValue):
(JSC::PropertySlot::setCustom):
(JSC::PropertySlot::setCacheableCustom):
(JSC::PropertySlot::setGetterSlot):
(JSC::PropertySlot::setCacheableGetterSlot):
* runtime/Structure.h:
(JSC::PropertyMapEntry::PropertyMapEntry):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (189159 => 189160)


--- trunk/Source/_javascript_Core/ChangeLog	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-08-30 22:33:23 UTC (rev 189160)
@@ -1,3 +1,56 @@
+2015-08-30  Filip Pizlo  <[email protected]>
+
+        JSC property attributes should fit in a byte
+        https://bugs.webkit.org/show_bug.cgi?id=148611
+
+        Reviewed by Sam Weinig.
+
+        I want to make room in PropertyMapEntry for more things to support property type inference (see
+        https://bugs.webkit.org/show_bug.cgi?id=148610). The most obvious candidate for a size reduction is
+        attributes, since we only have a small number of attribute bits. Even without complex changes, it
+        would have been possible to reduce the attribute field from 32 bits to 16 bits. Specifically, prior
+        to this change, the attributes field needed 9 bits. This made it very tempting to trim it so that
+        it could fit in a byte.
+
+        Luckily, many of the attributes bits are for the static lookup hashtables that we use for lazily
+        building objects in the standard library. Those bits don't need to stay around after the property
+        has been created, since they are just for telling the code in Lookup how to create the property.
+        So, this change separates the attributes bits into those that are interesting for Structure and
+        those that aren't. The ones used by Structure sit in the low 8 bits, allowing for the attributes
+        field in PropertyMapEntry to be a uint8_t. The attributes bits used only by Lookup use the higher
+        bits. In production, the conversion from the Lookup attributes to the Structure attributes is just
+        a cast to uint8_t. In debug, we assert that those bits are not dropped by accident. Code that
+        intentionally drops those bits calls attributesForStructure().
+
+        It turned out that there was a lot of code that was using the Function bit even in code that didn't
+        involve Lookup. This change removes those uses of Function. Structure does not need to know if we
+        think that a property points to a function.
+
+        * jsc.cpp:
+        (GlobalObject::finishCreation):
+        * runtime/JSGlobalObject.cpp:
+        (JSC::JSGlobalObject::init):
+        * runtime/JSObject.h:
+        * runtime/Lookup.cpp:
+        (JSC::setUpStaticFunctionSlot):
+        * runtime/Lookup.h:
+        (JSC::getStaticPropertySlot):
+        (JSC::getStaticValueSlot):
+        (JSC::reifyStaticProperties):
+        * runtime/MathObject.cpp:
+        (JSC::MathObject::finishCreation):
+        * runtime/NumberConstructor.cpp:
+        (JSC::NumberConstructor::finishCreation):
+        * runtime/PropertySlot.h:
+        (JSC::attributesForStructure):
+        (JSC::PropertySlot::setValue):
+        (JSC::PropertySlot::setCustom):
+        (JSC::PropertySlot::setCacheableCustom):
+        (JSC::PropertySlot::setGetterSlot):
+        (JSC::PropertySlot::setCacheableGetterSlot):
+        * runtime/Structure.h:
+        (JSC::PropertyMapEntry::PropertyMapEntry):
+
 2015-08-29  Chris Dumez  <[email protected]>
 
         Unreviewed, fix PropertyName::isNull() that was introduced in r188994.

Modified: trunk/Source/_javascript_Core/jsc.cpp (189159 => 189160)


--- trunk/Source/_javascript_Core/jsc.cpp	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/jsc.cpp	2015-08-30 22:33:23 UTC (rev 189160)
@@ -647,12 +647,12 @@
         addFunction(vm, "getElement", functionGetElement, 1);
         addFunction(vm, "setElementRoot", functionSetElementRoot, 2);
         
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "DFGTrue"), 0, functionFalse1, DFGTrueIntrinsic, DontEnum | JSC::Function);
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "OSRExit"), 0, functionUndefined1, OSRExitIntrinsic, DontEnum | JSC::Function);
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isFinalTier"), 0, functionFalse2, IsFinalTierIntrinsic, DontEnum | JSC::Function);
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "predictInt32"), 0, functionUndefined2, SetInt32HeapPredictionIntrinsic, DontEnum | JSC::Function);
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isInt32"), 0, functionIsInt32, CheckInt32Intrinsic, DontEnum | JSC::Function);
-        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "fiatInt52"), 0, functionIdentity, FiatInt52Intrinsic, DontEnum | JSC::Function);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "DFGTrue"), 0, functionFalse1, DFGTrueIntrinsic, DontEnum);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "OSRExit"), 0, functionUndefined1, OSRExitIntrinsic, DontEnum);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isFinalTier"), 0, functionFalse2, IsFinalTierIntrinsic, DontEnum);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "predictInt32"), 0, functionUndefined2, SetInt32HeapPredictionIntrinsic, DontEnum);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isInt32"), 0, functionIsInt32, CheckInt32Intrinsic, DontEnum);
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "fiatInt52"), 0, functionIdentity, FiatInt52Intrinsic, DontEnum);
         
         addFunction(vm, "effectful42", functionEffectful42, 0);
         addFunction(vm, "makeMasquerader", functionMakeMasquerader, 0);

Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp	2015-08-30 22:33:23 UTC (rev 189160)
@@ -354,7 +354,7 @@
 #endif
 
     m_parseIntFunction.set(vm, this, JSFunction::create(vm, this, 2, vm.propertyNames->parseInt.string(), globalFuncParseInt, NoIntrinsic));
-    putDirectWithoutTransition(vm, vm.propertyNames->parseInt, m_parseIntFunction.get(), DontEnum | Function);
+    putDirectWithoutTransition(vm, vm.propertyNames->parseInt, m_parseIntFunction.get(), DontEnum);
 
 #define CREATE_PROTOTYPE_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
 m_ ## lowerName ## Prototype.set(vm, this, capitalName##Prototype::create(vm, this, capitalName##Prototype::createStructure(vm, this, m_objectPrototype.get()))); \

Modified: trunk/Source/_javascript_Core/runtime/JSObject.h (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/JSObject.h	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/JSObject.h	2015-08-30 22:33:23 UTC (rev 189160)
@@ -75,7 +75,6 @@
 COMPILE_ASSERT(ReadOnly < FirstInternalAttribute, ReadOnly_is_below_FirstInternalAttribute);
 COMPILE_ASSERT(DontEnum < FirstInternalAttribute, DontEnum_is_below_FirstInternalAttribute);
 COMPILE_ASSERT(DontDelete < FirstInternalAttribute, DontDelete_is_below_FirstInternalAttribute);
-COMPILE_ASSERT(Function < FirstInternalAttribute, Function_is_below_FirstInternalAttribute);
 COMPILE_ASSERT(Accessor < FirstInternalAttribute, Accessor_is_below_FirstInternalAttribute);
 
 class JSFinalObject;

Modified: trunk/Source/_javascript_Core/runtime/Lookup.cpp (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/Lookup.cpp	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/Lookup.cpp	2015-08-30 22:33:23 UTC (rev 189160)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ *  Copyright (C) 2008, 2012, 2015 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -56,11 +56,11 @@
             return false;
 
         if (entry->attributes() & Builtin)
-            thisObj->putDirectBuiltinFunction(vm, thisObj->globalObject(), propertyName, entry->builtinGenerator()(vm), entry->attributes());
+            thisObj->putDirectBuiltinFunction(vm, thisObj->globalObject(), propertyName, entry->builtinGenerator()(vm), attributesForStructure(entry->attributes()));
         else if (entry->attributes() & Function) {
             thisObj->putDirectNativeFunction(
                 vm, thisObj->globalObject(), propertyName, entry->functionLength(),
-                entry->function(), entry->intrinsic(), entry->attributes());
+                entry->function(), entry->intrinsic(), attributesForStructure(entry->attributes()));
         } else {
             ASSERT(isAccessor);
             reifyStaticAccessor(vm, *entry, *thisObj, propertyName);

Modified: trunk/Source/_javascript_Core/runtime/Lookup.h (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/Lookup.h	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/Lookup.h	2015-08-30 22:33:23 UTC (rev 189160)
@@ -188,11 +188,11 @@
         return setUpStaticFunctionSlot(exec, entry, thisObj, propertyName, slot);
 
     if (entry->attributes() & ConstantInteger) {
-        slot.setValue(thisObj, entry->attributes(), jsNumber(entry->constantInteger()));
+        slot.setValue(thisObj, attributesForStructure(entry->attributes()), jsNumber(entry->constantInteger()));
         return true;
     }
 
-    slot.setCacheableCustom(thisObj, entry->attributes(), entry->propertyGetter());
+    slot.setCacheableCustom(thisObj, attributesForStructure(entry->attributes()), entry->propertyGetter());
     return true;
 }
 
@@ -229,11 +229,11 @@
     ASSERT(!(entry->attributes() & BuiltinOrFunctionOrAccessor));
 
     if (entry->attributes() & ConstantInteger) {
-        slot.setValue(thisObj, entry->attributes(), jsNumber(entry->constantInteger()));
+        slot.setValue(thisObj, attributesForStructure(entry->attributes()), jsNumber(entry->constantInteger()));
         return true;
     }
 
-    slot.setCacheableCustom(thisObj, entry->attributes(), entry->propertyGetter());
+    slot.setCacheableCustom(thisObj, attributesForStructure(entry->attributes()), entry->propertyGetter());
     return true;
 }
 
@@ -279,18 +279,19 @@
 
         Identifier propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>(value.m_key), strlen(value.m_key));
         if (value.attributes() & Builtin) {
-            thisObj.putDirectBuiltinFunction(vm, thisObj.globalObject(), propertyName, value.builtinGenerator()(vm), value.attributes());
+            thisObj.putDirectBuiltinFunction(vm, thisObj.globalObject(), propertyName, value.builtinGenerator()(vm), attributesForStructure(value.attributes()));
             continue;
         }
 
         if (value.attributes() & Function) {
-            thisObj.putDirectNativeFunction(vm, thisObj.globalObject(), propertyName, value.functionLength(),
-                value.function(), value.intrinsic(), value.attributes());
+            thisObj.putDirectNativeFunction(
+                vm, thisObj.globalObject(), propertyName, value.functionLength(),
+                value.function(), value.intrinsic(), attributesForStructure(value.attributes()));
             continue;
         }
 
         if (value.attributes() & ConstantInteger) {
-            thisObj.putDirect(vm, propertyName, jsNumber(value.constantInteger()), value.attributes());
+            thisObj.putDirect(vm, propertyName, jsNumber(value.constantInteger()), attributesForStructure(value.attributes()));
             continue;
         }
 
@@ -300,7 +301,7 @@
         }
 
         CustomGetterSetter* customGetterSetter = CustomGetterSetter::create(vm, value.propertyGetter(), value.propertyPutter());
-        thisObj.putDirectCustomAccessor(vm, propertyName, customGetterSetter, value.attributes());
+        thisObj.putDirectCustomAccessor(vm, propertyName, customGetterSetter, attributesForStructure(value.attributes()));
     }
 }
 

Modified: trunk/Source/_javascript_Core/runtime/MathObject.cpp (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/MathObject.cpp	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/MathObject.cpp	2015-08-30 22:33:23 UTC (rev 189160)
@@ -1,6 +1,6 @@
 /*
  *  Copyright (C) 1999-2000 Harri Porten ([email protected])
- *  Copyright (C) 2007, 2008, 2013 Apple Inc. All Rights Reserved.
+ *  Copyright (C) 2007, 2008, 2013, 2015 Apple Inc. All Rights Reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -95,41 +95,41 @@
     putDirectWithoutTransition(vm, Identifier::fromString(&vm, "SQRT1_2"), jsNumber(sqrt(0.5)), DontDelete | DontEnum | ReadOnly);
     putDirectWithoutTransition(vm, Identifier::fromString(&vm, "SQRT2"), jsNumber(sqrt(2.0)), DontDelete | DontEnum | ReadOnly);
 
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "abs"), 1, mathProtoFuncAbs, AbsIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "acos"), 1, mathProtoFuncACos, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "asin"), 1, mathProtoFuncASin, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atan"), 1, mathProtoFuncATan, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "acosh"), 1, mathProtoFuncACosh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "asinh"), 1, mathProtoFuncASinh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atanh"), 1, mathProtoFuncATanh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atan2"), 2, mathProtoFuncATan2, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cbrt"), 1, mathProtoFuncCbrt, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "ceil"), 1, mathProtoFuncCeil, CeilIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "clz32"), 1, mathProtoFuncClz32, Clz32Intrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cos"), 1, mathProtoFuncCos, CosIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cosh"), 1, mathProtoFuncCosh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "exp"), 1, mathProtoFuncExp, ExpIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "expm1"), 1, mathProtoFuncExpm1, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "floor"), 1, mathProtoFuncFloor, FloorIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "fround"), 1, mathProtoFuncFround, FRoundIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "hypot"), 2, mathProtoFuncHypot, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log"), 1, mathProtoFuncLog, LogIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log10"), 1, mathProtoFuncLog10, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log1p"), 1, mathProtoFuncLog1p, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log2"), 1, mathProtoFuncLog2, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "max"), 2, mathProtoFuncMax, MaxIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "min"), 2, mathProtoFuncMin, MinIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "pow"), 2, mathProtoFuncPow, PowIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "random"), 0, mathProtoFuncRandom, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "round"), 1, mathProtoFuncRound, RoundIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sign"), 1, mathProtoFuncSign, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sin"), 1, mathProtoFuncSin, SinIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sinh"), 1, mathProtoFuncSinh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sqrt"), 1, mathProtoFuncSqrt, SqrtIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "tan"), 1, mathProtoFuncTan, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "tanh"), 1, mathProtoFuncTanh, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "trunc"), 1, mathProtoFuncTrunc, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "imul"), 2, mathProtoFuncIMul, IMulIntrinsic, DontEnum | Function);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "abs"), 1, mathProtoFuncAbs, AbsIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "acos"), 1, mathProtoFuncACos, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "asin"), 1, mathProtoFuncASin, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atan"), 1, mathProtoFuncATan, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "acosh"), 1, mathProtoFuncACosh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "asinh"), 1, mathProtoFuncASinh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atanh"), 1, mathProtoFuncATanh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "atan2"), 2, mathProtoFuncATan2, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cbrt"), 1, mathProtoFuncCbrt, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "ceil"), 1, mathProtoFuncCeil, CeilIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "clz32"), 1, mathProtoFuncClz32, Clz32Intrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cos"), 1, mathProtoFuncCos, CosIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "cosh"), 1, mathProtoFuncCosh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "exp"), 1, mathProtoFuncExp, ExpIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "expm1"), 1, mathProtoFuncExpm1, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "floor"), 1, mathProtoFuncFloor, FloorIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "fround"), 1, mathProtoFuncFround, FRoundIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "hypot"), 2, mathProtoFuncHypot, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log"), 1, mathProtoFuncLog, LogIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log10"), 1, mathProtoFuncLog10, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log1p"), 1, mathProtoFuncLog1p, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "log2"), 1, mathProtoFuncLog2, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "max"), 2, mathProtoFuncMax, MaxIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "min"), 2, mathProtoFuncMin, MinIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "pow"), 2, mathProtoFuncPow, PowIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "random"), 0, mathProtoFuncRandom, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "round"), 1, mathProtoFuncRound, RoundIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sign"), 1, mathProtoFuncSign, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sin"), 1, mathProtoFuncSin, SinIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sinh"), 1, mathProtoFuncSinh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "sqrt"), 1, mathProtoFuncSqrt, SqrtIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "tan"), 1, mathProtoFuncTan, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "tanh"), 1, mathProtoFuncTanh, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "trunc"), 1, mathProtoFuncTrunc, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, globalObject, Identifier::fromString(&vm, "imul"), 2, mathProtoFuncIMul, IMulIntrinsic, DontEnum);
 }
 
 // ------------------------------ Functions --------------------------------

Modified: trunk/Source/_javascript_Core/runtime/NumberConstructor.cpp (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/NumberConstructor.cpp	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/NumberConstructor.cpp	2015-08-30 22:33:23 UTC (rev 189160)
@@ -1,6 +1,6 @@
 /*
  *  Copyright (C) 1999-2000,2003 Harri Porten ([email protected])
- *  Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved.
+ *  Copyright (C) 2007, 2008, 2011, 2015 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -68,12 +68,12 @@
     putDirectWithoutTransition(vm, Identifier::fromString(&vm, "POSITIVE_INFINITY"), jsDoubleNumber(std::numeric_limits<double>::infinity()), DontDelete | DontEnum | ReadOnly);
     putDirectWithoutTransition(vm, Identifier::fromString(&vm, "NaN"), jsNaN(), DontDelete | DontEnum | ReadOnly);
 
-    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isFinite"), 1, numberConstructorFuncIsFinite, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isInteger"), 1, numberConstructorFuncIsInteger, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isNaN"), 1, numberConstructorFuncIsNaN, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isSafeInteger"), 1, numberConstructorFuncIsSafeInteger, NoIntrinsic, DontEnum | Function);
-    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "parseFloat"), 1, globalFuncParseFloat, NoIntrinsic, DontEnum | Function);
-    putDirectWithoutTransition(vm, Identifier::fromString(&vm, "parseInt"), numberPrototype->globalObject()->parseIntFunction(), DontEnum | Function);
+    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isFinite"), 1, numberConstructorFuncIsFinite, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isInteger"), 1, numberConstructorFuncIsInteger, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isNaN"), 1, numberConstructorFuncIsNaN, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "isSafeInteger"), 1, numberConstructorFuncIsSafeInteger, NoIntrinsic, DontEnum);
+    putDirectNativeFunctionWithoutTransition(vm, numberPrototype->globalObject(), Identifier::fromString(&vm, "parseFloat"), 1, globalFuncParseFloat, NoIntrinsic, DontEnum);
+    putDirectWithoutTransition(vm, Identifier::fromString(&vm, "parseInt"), numberPrototype->globalObject()->parseIntFunction(), DontEnum);
 }
 
 // ECMA 15.7.1

Modified: trunk/Source/_javascript_Core/runtime/PropertySlot.h (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/PropertySlot.h	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/PropertySlot.h	2015-08-30 22:33:23 UTC (rev 189160)
@@ -40,16 +40,24 @@
     ReadOnly          = 1 << 1,  // property can be only read, not written
     DontEnum          = 1 << 2,  // property doesn't appear in (for .. in ..)
     DontDelete        = 1 << 3,  // property can't be deleted
-    Function          = 1 << 4,  // property is a function - only used by static hashtables
-    Accessor          = 1 << 5,  // property is a getter/setter
-    CustomAccessor    = 1 << 6,
-    Builtin           = 1 << 7, // property is a builtin function - only used by static hashtables
-    ConstantInteger   = 1 << 8, // property is a constant integer - only used by static hashtables
+    Accessor          = 1 << 4,  // property is a getter/setter
+    CustomAccessor    = 1 << 5,
+
+    // Things that are used by static hashtables are not in the attributes byte in PropertyMapEntry.
+    Function          = 1 << 8,  // property is a function - only used by static hashtables
+    Builtin           = 1 << 9,  // property is a builtin function - only used by static hashtables
+    ConstantInteger   = 1 << 10, // property is a constant integer - only used by static hashtables
     BuiltinOrFunction = Builtin | Function, // helper only used by static hashtables
     BuiltinOrFunctionOrAccessor = Builtin | Function | Accessor, // helper only used by static hashtables
     BuiltinOrFunctionOrAccessorOrConstant = Builtin | Function | Accessor | ConstantInteger, // helper only used by static hashtables
 };
 
+inline unsigned attributesForStructure(unsigned attributes)
+{
+    // The attributes that are used just for the static hashtable are at bit 8 and higher.
+    return static_cast<uint8_t>(attributes);
+}
+
 class PropertySlot {
     enum PropertyType {
         TypeUnset,
@@ -125,6 +133,8 @@
 
     void setValue(JSObject* slotBase, unsigned attributes, JSValue value)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         m_data.value = JSValue::encode(value);
         m_attributes = attributes;
 
@@ -136,6 +146,8 @@
     
     void setValue(JSObject* slotBase, unsigned attributes, JSValue value, PropertyOffset offset)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(value);
         m_data.value = JSValue::encode(value);
         m_attributes = attributes;
@@ -148,6 +160,8 @@
 
     void setValue(JSString*, unsigned attributes, JSValue value)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(value);
         m_data.value = JSValue::encode(value);
         m_attributes = attributes;
@@ -159,6 +173,8 @@
 
     void setCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(getValue);
         m_data.custom.getValue = getValue;
         m_attributes = attributes;
@@ -171,6 +187,8 @@
     
     void setCacheableCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(getValue);
         m_data.custom.getValue = getValue;
         m_attributes = attributes;
@@ -183,6 +201,8 @@
 
     void setGetterSlot(JSObject* slotBase, unsigned attributes, GetterSetter* getterSetter)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(getterSetter);
         m_data.getter.getterSetter = getterSetter;
         m_attributes = attributes;
@@ -195,6 +215,8 @@
 
     void setCacheableGetterSlot(JSObject* slotBase, unsigned attributes, GetterSetter* getterSetter, PropertyOffset offset)
     {
+        ASSERT(attributes == attributesForStructure(attributes));
+        
         ASSERT(getterSetter);
         m_data.getter.getterSetter = getterSetter;
         m_attributes = attributes;

Modified: trunk/Source/_javascript_Core/runtime/Structure.h (189159 => 189160)


--- trunk/Source/_javascript_Core/runtime/Structure.h	2015-08-30 07:08:00 UTC (rev 189159)
+++ trunk/Source/_javascript_Core/runtime/Structure.h	2015-08-30 22:33:23 UTC (rev 189160)
@@ -80,7 +80,7 @@
 struct PropertyMapEntry {
     UniquedStringImpl* key;
     PropertyOffset offset;
-    unsigned attributes;
+    uint8_t attributes;
 
     PropertyMapEntry()
         : key(nullptr)
@@ -94,6 +94,7 @@
         , offset(offset)
         , attributes(attributes)
     {
+        ASSERT(this->attributes == attributes);
     }
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to