mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-22 10:01:50 +00:00
Implement Array.prototype.slice
This commit is contained in:
parent
33aa83093c
commit
ee1f78f348
1 changed files with 30 additions and 0 deletions
|
|
@ -191,6 +191,34 @@ static Value builtinArrayConcat(ExecutionState& state, Value thisValue, size_t a
|
|||
return array;
|
||||
}
|
||||
|
||||
static Value builtinArraySlice(ExecutionState& state, Value thisValue, size_t argc, Value* argv, bool isNewExpression)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_OBJECT(thisObject, Array, concat);
|
||||
uint32_t len = thisObject->length(state);
|
||||
double relativeStart = argv[0].toInteger(state);
|
||||
uint32_t k = (relativeStart < 0) ? std::max((double)len + relativeStart, 0.0) : std::min(relativeStart, (double)len);
|
||||
double relativeEnd = (argv[1].isUndefined()) ? len : argv[1].toInteger(state);
|
||||
uint32_t finalEnd = (relativeEnd < 0) ? std::max((double)len + relativeEnd, 0.0) : std::min(relativeEnd, (double)len);
|
||||
|
||||
uint32_t n = 0;
|
||||
ArrayObject* array = new ArrayObject(state);
|
||||
while (k < finalEnd) {
|
||||
ObjectGetResult exists = thisObject->get(state, ObjectPropertyName(state, Value(k)));
|
||||
if (exists.hasValue()) {
|
||||
array->defineOwnPropertyThrowsException(state, ObjectPropertyName(state, Value(n)),
|
||||
ObjectPropertyDescriptorForDefineOwnProperty(exists.value(), ObjectPropertyDescriptorForDefineOwnProperty::AllPresent));
|
||||
k++;
|
||||
n++;
|
||||
} else {
|
||||
double tmp = Object::nextIndexForward(state, thisObject, k, len, false);
|
||||
n += tmp - k;
|
||||
k = tmp;
|
||||
}
|
||||
}
|
||||
array->setLength(state, n);
|
||||
return array;
|
||||
}
|
||||
|
||||
void GlobalObject::installArray(ExecutionState& state)
|
||||
{
|
||||
m_array = new FunctionObject(state, NativeFunctionInfo(state.context()->staticStrings().Array, builtinArrayConstructor, 1, [](ExecutionState& state, size_t argc, Value* argv) -> Object* {
|
||||
|
|
@ -209,6 +237,8 @@ void GlobalObject::installArray(ExecutionState& state)
|
|||
ObjectPropertyDescriptorForDefineOwnProperty(new FunctionObject(state, NativeFunctionInfo(state.context()->staticStrings().join, builtinArrayJoin, 1, nullptr, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptorForDefineOwnProperty::PresentAttribute)(ObjectPropertyDescriptorForDefineOwnProperty::WritablePresent | ObjectPropertyDescriptorForDefineOwnProperty::ConfigurablePresent)));
|
||||
m_arrayPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->staticStrings().sort),
|
||||
ObjectPropertyDescriptorForDefineOwnProperty(new FunctionObject(state, NativeFunctionInfo(state.context()->staticStrings().sort, builtinArraySort, 1, nullptr, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptorForDefineOwnProperty::PresentAttribute)(ObjectPropertyDescriptorForDefineOwnProperty::WritablePresent | ObjectPropertyDescriptorForDefineOwnProperty::ConfigurablePresent)));
|
||||
m_arrayPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->staticStrings().slice),
|
||||
ObjectPropertyDescriptorForDefineOwnProperty(new FunctionObject(state, NativeFunctionInfo(state.context()->staticStrings().slice, builtinArraySlice, 2, nullptr, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptorForDefineOwnProperty::PresentAttribute)(ObjectPropertyDescriptorForDefineOwnProperty::WritablePresent | ObjectPropertyDescriptorForDefineOwnProperty::ConfigurablePresent)));
|
||||
m_arrayPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->staticStrings().toString),
|
||||
ObjectPropertyDescriptorForDefineOwnProperty(new FunctionObject(state, NativeFunctionInfo(state.context()->staticStrings().toString, builtinArrayToString, 0, nullptr, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptorForDefineOwnProperty::PresentAttribute)(ObjectPropertyDescriptorForDefineOwnProperty::WritablePresent | ObjectPropertyDescriptorForDefineOwnProperty::ConfigurablePresent)));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue