Ignore:
Timestamp:
Dec 27, 2005, 12:02:01 PM (19 years ago)
Author:
andersca
Message:

2005-12-27 Anders Carlsson <[email protected]>

Reviewed by Darin.

  • kjs/array_object.cpp: (ArrayProtoFunc::callAsFunction): Implement filter and map. Also, make the existing array iteration functions not invoke the callback for non-existing properties, just as Mozilla does now.
  • kjs/array_object.h: (KJS::ArrayProtoFunc::): Add filter and map.
  • tests/mozilla/expected.html: Update, two 1.6 tests now pass.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/array_object.cpp

    r11775 r11785  
    390390  splice         ArrayProtoFunc::Splice         DontEnum|Function 2
    391391  unshift        ArrayProtoFunc::UnShift        DontEnum|Function 1
    392   every          ArrayProtoFunc::Every          DontEnum|Function 5
    393   forEach        ArrayProtoFunc::ForEach        DontEnum|Function 5
    394   some           ArrayProtoFunc::Some           DontEnum|Function 5
    395   indexOf        ArrayProtoFunc::IndexOf       DontEnum|Function 1
     392  every          ArrayProtoFunc::Every          DontEnum|Function 1
     393  forEach        ArrayProtoFunc::ForEach        DontEnum|Function 1
     394  some           ArrayProtoFunc::Some           DontEnum|Function 1
     395  indexOf        ArrayProtoFunc::IndexOf        DontEnum|Function 1
     396  filter         ArrayProtoFunc::Filter         DontEnum|Function 1
     397  map            ArrayProtoFunc::Map            DontEnum|Function 1
    396398@end
    397399*/
     
    771773    break;
    772774  }
     775  case Filter:
     776  case Map: {
     777    JSObject *eachFunction = args[0]->toObject(exec);
     778   
     779    if (!eachFunction->implementsCall())
     780      return throwError(exec, TypeError);
     781   
     782    JSObject *applyThis = args[1]->isUndefinedOrNull() ? exec->dynamicInterpreter()->globalObject() :  args[1]->toObject(exec);
     783    JSObject *resultArray;
     784   
     785    if (id == Filter)
     786      resultArray = static_cast<JSObject *>(exec->lexicalInterpreter()->builtinArray()->construct(exec, List::empty()));
     787    else
     788 {
     789      List args;
     790      args.append(jsNumber(length));
     791      resultArray = static_cast<JSObject *>(exec->lexicalInterpreter()->builtinArray()->construct(exec, args));
     792    }
     793   
     794    unsigned filterIndex = 0;
     795    for (unsigned k = 0; k < length && !exec->hadException(); ++k) {
     796      PropertySlot slot;
     797
     798      if (!thisObj->getPropertySlot(exec, k, slot))
     799         continue;
     800       
     801      JSValue *v = slot.getValue(exec, thisObj, k);
     802     
     803      List eachArguments;
     804     
     805      eachArguments.append(v);
     806      eachArguments.append(jsNumber(k));
     807      eachArguments.append(thisObj);
     808     
     809      JSValue *result = eachFunction->call(exec, applyThis, eachArguments);
     810     
     811      if (id == Map)
     812        resultArray->put(exec, k, result);
     813      else if (result->toBoolean(exec))
     814        resultArray->put(exec, filterIndex++, v);
     815    }
     816   
     817    return resultArray;
     818  }
    773819  case Every:
    774820  case ForEach:
     
    792838   
    793839    for (unsigned k = 0; k < length && !exec->hadException(); ++k) {
     840      PropertySlot slot;
     841       
     842      if (!thisObj->getPropertySlot(exec, k, slot))
     843        continue;
    794844     
    795845      List eachArguments;
    796846     
    797       eachArguments.append(thisObj->get(exec, k));
     847      eachArguments.append(slot.getValue(exec, thisObj, k));
    798848      eachArguments.append(jsNumber(k));
    799849      eachArguments.append(thisObj);
Note: See TracChangeset for help on using the changeset viewer.