https://bugs.webkit.org/show_bug.cgi?id=75789
defineOwnProperty not implemented for Array objects

Reviewed by Sam Weinig.

Source/JavaScriptCore: 

Implements support for getter/setter & non-default attribute properties on arrays,
by forcing them into a dictionary-like 'SparseMode'. This fixes ~300 test-262
test failures.

* JavaScriptCore.exp:
    - Updated exports.
* dfg/DFGOperations.cpp:
    - JSArray::pop now requires an exec state.
* runtime/ArrayPrototype.cpp:
(JSC::arrayProtoFuncPop):
    - JSArray::pop now requires an exec state.
* runtime/JSArray.cpp:
(JSC::SparseArrayValueMap::add):
    - Add a potentially empty entry into the map.
(JSC::SparseArrayValueMap::put):
    - Changed to call setter.
(JSC::SparseArrayEntry::get):
    - calls getters.
(JSC::SparseArrayEntry::getNonSparseMode):
    - does not call getters.
(JSC::JSArray::enterSparseMode):
    - Convert into 'SparseMode' - removes the vectors, don't allow it to be recreated.
(JSC::JSArray::putDescriptor):
    - Create a numeric property based on a descriptor.
(JSC::sameValue):
    - See ES5.1 9.12.
(JSC::reject):
    - Helper for the [[DefineOwnProperty]] algorithm.
(JSC::JSArray::defineOwnNumericProperty):
    - Define an indexed property on an array object.
(JSC::JSArray::setLengthWritable):
    - Marks the length read-only, enters SparseMode as necessary.
(JSC::JSArray::defineOwnProperty):
    - Defines either an indexed property or 'length' on an array object.
(JSC::JSArray::getOwnPropertySlotByIndex):
    - Updated to correctly handle accessor descriptors & attributes.
(JSC::JSArray::getOwnPropertyDescriptor):
    - Updated to correctly handle accessor descriptors & attributes.
(JSC::JSArray::put):
    - Pass strict mode flag to setLength.
(JSC::JSArray::putByIndex):
    - putByIndexBeyondVectorLength requires an ExecState* rather than a JSGloablData&.
(JSC::JSArray::putByIndexBeyondVectorLength):
    - Pass exec to SparseArrayValueMap::put.
(JSC::JSArray::deletePropertyByIndex):
    - Do not allow deletion of non-configurable properties.
(JSC::compareKeysForQSort):
    - used in implementation of getOwnPropertyNames.
(JSC::JSArray::getOwnPropertyNames):
    - Properties in the sparse map should be iterated in order.
(JSC::JSArray::setLength):
    - Updated to take a 'shouldThrow' flag, return a result indicating error.
(JSC::JSArray::pop):
    - pop should throw an error if length is not writable, even if the array is empty.
(JSC::JSArray::push):
    - putByIndexBeyondVectorLength requires an ExecState* rather than a JSGloablData&.
(JSC::JSArray::sort):
    - Changed 'get' to 'getNonSparseMode' (can't be getters to call).
(JSC::JSArray::compactForSorting):
    - Changed 'get' to 'getNonSparseMode' (can't be getters to call).
* runtime/JSArray.h:
(JSC::SparseArrayValueMap::lengthIsReadOnly):
    - Check if the length is read only.
(JSC::SparseArrayValueMap::setLengthIsReadOnly):
    - Mark the length as read only.
(JSC::SparseArrayValueMap::find):
    - Moved into header.
(JSC::JSArray::isLengthWritable):
    - Wraps SparseArrayValueMap::lengthIsReadOnly.
* runtime/JSObject.cpp:
(JSC::JSObject::defineOwnProperty):
    - Should be returning the result of putDescriptor.
* runtime/PropertyDescriptor.cpp:
(JSC::PropertyDescriptor::attributesOverridingCurrent):
    - Added attributesOverridingCurrent - this should probably be merged with attributesWithOverride.
* runtime/PropertyDescriptor.h:
    - Added attributesOverridingCurrent.

LayoutTests: 

* fast/js/array-defineOwnProperty-expected.txt: Added.
* fast/js/array-defineOwnProperty.html: Added.
* fast/js/script-tests/array-defineOwnProperty.js: Added.
    - Added tests for array properties with accessors & non-defulat attributes.
* fast/js/mozilla/strict/15.4.4.6-expected.txt:
* fast/js/mozilla/strict/8.12.5-expected.txt:
* ietestcenter/Javascript/15.4.4.14-9-a-12-expected.txt:
* ietestcenter/Javascript/15.4.4.15-8-a-12-expected.txt:
    - Check in passing results.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@104488 268f45cc-cd09-0410-ab3c-d52691b4dbfc
17 files changed