WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
the patch
blah.patch (text/plain), 31.17 KB, created by
Filip Pizlo
on 2015-08-29 22:38:23 PDT
(
hide
)
Description:
the patch
Filename:
MIME Type:
Creator:
Filip Pizlo
Created:
2015-08-29 22:38:23 PDT
Size:
31.17 KB
patch
obsolete
>Index: Source/JavaScriptCore/ChangeLog >=================================================================== >--- Source/JavaScriptCore/ChangeLog (revision 189154) >+++ Source/JavaScriptCore/ChangeLog (working copy) >@@ -1,3 +1,56 @@ >+2015-08-29 Filip Pizlo <fpizlo@apple.com> >+ >+ JSC property attributes should fit in a byte >+ https://bugs.webkit.org/show_bug.cgi?id=148611 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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 <cdumez@apple.com> > > Unreviewed, fix PropertyName::isNull() that was introduced in r188994. >Index: Source/JavaScriptCore/jsc.cpp >=================================================================== >--- Source/JavaScriptCore/jsc.cpp (revision 189122) >+++ Source/JavaScriptCore/jsc.cpp (working copy) >@@ -646,12 +646,12 @@ protected: > 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); >Index: Source/JavaScriptCore/runtime/JSGlobalObject.cpp >=================================================================== >--- Source/JavaScriptCore/runtime/JSGlobalObject.cpp (revision 189122) >+++ Source/JavaScriptCore/runtime/JSGlobalObject.cpp (working copy) >@@ -352,7 +352,7 @@ void JSGlobalObject::init(VM& vm) > #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()))); \ >Index: Source/JavaScriptCore/runtime/JSObject.h >=================================================================== >--- Source/JavaScriptCore/runtime/JSObject.h (revision 189122) >+++ Source/JavaScriptCore/runtime/JSObject.h (working copy) >@@ -75,7 +75,6 @@ COMPILE_ASSERT(None < FirstInternalAttri > 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; >Index: Source/JavaScriptCore/runtime/Lookup.cpp >=================================================================== >--- Source/JavaScriptCore/runtime/Lookup.cpp (revision 189122) >+++ Source/JavaScriptCore/runtime/Lookup.cpp (working copy) >@@ -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 @@ bool setUpStaticFunctionSlot(ExecState* > 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); >Index: Source/JavaScriptCore/runtime/Lookup.h >=================================================================== >--- Source/JavaScriptCore/runtime/Lookup.h (revision 189122) >+++ Source/JavaScriptCore/runtime/Lookup.h (working copy) >@@ -188,11 +188,11 @@ inline bool getStaticPropertySlot(ExecSt > 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 @@ inline bool getStaticValueSlot(ExecState > 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 @@ inline void reifyStaticProperties(VM& vm > > 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 @@ inline void reifyStaticProperties(VM& vm > } > > CustomGetterSetter* customGetterSetter = CustomGetterSetter::create(vm, value.propertyGetter(), value.propertyPutter()); >- thisObj.putDirectCustomAccessor(vm, propertyName, customGetterSetter, value.attributes()); >+ thisObj.putDirectCustomAccessor(vm, propertyName, customGetterSetter, attributesForStructure(value.attributes())); > } > } > >Index: Source/JavaScriptCore/runtime/MathObject.cpp >=================================================================== >--- Source/JavaScriptCore/runtime/MathObject.cpp (revision 189122) >+++ Source/JavaScriptCore/runtime/MathObject.cpp (working copy) >@@ -1,6 +1,6 @@ > /* > * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) >- * 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 @@ void MathObject::finishCreation(VM& vm, > 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 -------------------------------- >Index: Source/JavaScriptCore/runtime/NumberConstructor.cpp >=================================================================== >--- Source/JavaScriptCore/runtime/NumberConstructor.cpp (revision 189122) >+++ Source/JavaScriptCore/runtime/NumberConstructor.cpp (working copy) >@@ -1,6 +1,6 @@ > /* > * Copyright (C) 1999-2000,2003 Harri Porten (porten@kde.org) >- * 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 @@ void NumberConstructor::finishCreation(V > 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 >Index: Source/JavaScriptCore/runtime/PropertySlot.h >=================================================================== >--- Source/JavaScriptCore/runtime/PropertySlot.h (revision 189122) >+++ Source/JavaScriptCore/runtime/PropertySlot.h (working copy) >@@ -40,16 +40,24 @@ enum Attribute { > 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 @@ public: > > 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 @@ public: > > 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 @@ public: > > 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 @@ public: > > 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 @@ public: > > 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 @@ public: > > 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 @@ public: > > void setCacheableGetterSlot(JSObject* slotBase, unsigned attributes, GetterSetter* getterSetter, PropertyOffset offset) > { >+ ASSERT(attributes == attributesForStructure(attributes)); >+ > ASSERT(getterSetter); > m_data.getter.getterSetter = getterSetter; > m_attributes = attributes; >Index: Source/JavaScriptCore/runtime/Structure.h >=================================================================== >--- Source/JavaScriptCore/runtime/Structure.h (revision 189122) >+++ Source/JavaScriptCore/runtime/Structure.h (working copy) >@@ -80,7 +80,7 @@ static const unsigned outOfLineGrowthFac > struct PropertyMapEntry { > UniquedStringImpl* key; > PropertyOffset offset; >- unsigned attributes; >+ uint8_t attributes; > > PropertyMapEntry() > : key(nullptr) >@@ -94,6 +94,7 @@ struct PropertyMapEntry { > , offset(offset) > , attributes(attributes) > { >+ ASSERT(this->attributes == attributes); > } > }; >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
sam
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 148611
:
260226
|
260232
|
260236
| 260237