Ignore:
Timestamp:
Aug 12, 2002, 1:14:02 PM (23 years ago)
Author:
darin
Message:

top level:

  • Tests/WebFoundation-Misc/ifnsurlextensions-test.m: (TestURLCommon): Add tests for the new WebNSURLExtras methods.
  • Tests/libiftest/IFCheckLeaks.c: (IFCheckLeaksAtExit): Remove workaround for CFPreferences race condition; it's now in WebFoundation.

JavaScriptCore:

Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.

Use global string objects for length and other common property names rather
than constantly making and destroying them. Use integer versions of get() and
other related calls rather than always making a string.

Also get rid of many unneeded constructors, destructors, copy constructors, and
assignment operators. And make some functions non-virtual.

  • kjs/internal.h:
  • kjs/internal.cpp: (NumberImp::toUInt32): Implement. (ReferenceImp::ReferenceImp): Special case for numeric property names. (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case. (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case. (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case. (ReferenceImp::deleteValue): Added. Handle numeric case.
  • kjs/array_object.h:
  • kjs/array_object.cpp: All-new array implementation that stores the elements in a C++ array rather than in a property map. (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array. (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array. (ArrayInstanceImp::get): Implement both the old version and the new overload that takes an unsigned index for speed. (ArrayInstanceImp::put): Implement both the old version and the new overload that takes an unsigned index for speed. (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that takes an unsigned index for speed. (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that takes an unsigned index for speed. (ArrayInstanceImp::setLength): Added. Used by the above to resize the array. (ArrayInstanceImp::mark): Mark the elements of the array too. (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
  • kjs/bool_object.cpp:
  • kjs/date_object.cpp:
  • kjs/error_object.cpp:
  • kjs/function.cpp:
  • kjs/function_object.cpp:
  • kjs/math_object.cpp:
  • kjs/nodes.cpp:
  • kjs/nodes.h:
  • kjs/number_object.cpp:
  • kjs/object_object.cpp:
  • kjs/regexp_object.cpp:
  • kjs/string_object.cpp:
  • kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that you can't create a UString from a char implicitly.
  • kjs/object.h:
  • kjs/object.cpp: (ObjectImp::get): Call through to the string version if the numeric version is not implemented. (ObjectImp::put): Call through to the string version if the numeric version is not implemented. (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented. (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
  • kjs/types.h:
  • kjs/types.cpp: (Reference::Reference): Added constructors for the numeric property name case.
  • kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we don't get numbers that turn themselves into strings.
  • kjs/ustring.cpp: (UString::UString): Detect the empty string case, and use a shared empty string. (UString::find): Add an overload for single character finds. (UString::rfind): Add an overload for single character finds. (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null. Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char just in case.
  • kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
  • kjs/value.cpp: (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn them into strings and back. (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement. (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement. (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement. (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now. (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now. (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now. (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now. (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.

WebFoundation:

  • CacheLoader.subproj/WebHTTPResourceLoader.m: (-[WebHTTPProtocolHandler createWFLoadRequest]): Fix handling of paths with queries and some other subtle path and port number handling issues by using _web_hostWithPort and _web_pathWithQuery.
  • Misc.subproj/WebNSURLExtras.h:
  • Misc.subproj/WebNSURLExtras.m: (-[NSURL _web_hostWithPort]): Added. (-[NSURL _web_pathWithQuery]): Added.
  • CacheLoader.subproj/WebResourceLoad.m: (initLoader): Get some random preference before creating threads. This makes it impossible to run into the CFPreferences race condition.

WebCore:

  • force-clean-timestamp: Need a full build because of KJS changes.
  • khtml/ecma/kjs_window.h: Need to store an Object, not an ObjectImp, because there's no way to copy an ObjectImp. KJS changes caught this mistake.
File:
1 edited

Legend:

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

    r1623 r1799  
    9090  Value protect(this);
    9191  // The constructor will be added later, after StringObjectImp has been built
    92   put(exec,"length",Number(0),DontDelete|ReadOnly|DontEnum);
     92  put(exec,lengthPropertyName,Number(0),DontDelete|ReadOnly|DontEnum);
    9393
    9494}
     
    107107{
    108108  Value protect(this);
    109   put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
     109  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
    110110}
    111111
     
    343343      if (u.isEmpty() && !reg.match(u, 0).isNull()) {
    344344        // empty string matched by regexp -> empty array
    345         res.put(exec,"length", Number(0));
     345        res.put(exec,lengthPropertyName, Number(0));
    346346        break;
    347347      }
     
    357357        pos = mpos + (mstr.isEmpty() ? 1 : mstr.size());
    358358        if (mpos != p0 || !mstr.isEmpty()) {
    359           res.put(exec,UString::from(i), String(u.substr(p0, mpos-p0)));
     359          res.put(exec,i, String(u.substr(p0, mpos-p0)));
    360360          p0 = mpos + mstr.size();
    361361          i++;
     
    367367        if (u.isEmpty()) {
    368368          // empty separator matches empty string -> empty array
    369           put(exec,"length", Number(0));
     369          put(exec,lengthPropertyName, Number(0));
    370370          break;
    371371        } else {
    372372          while (i != d && i < u.size()-1)
    373             res.put(exec,UString::from(i++), String(u.substr(p0++, 1)));
     373            res.put(exec, i++, String(u.substr(p0++, 1)));
    374374        }
    375375      } else {
    376376        while (i != d && (pos = u.find(u2, p0)) >= 0) {
    377           res.put(exec,UString::from(i), String(u.substr(p0, pos-p0)));
     377          res.put(exec, i, String(u.substr(p0, pos-p0)));
    378378          p0 = pos + u2.size();
    379379          i++;
     
    383383    // add remaining string, if any
    384384    if (i != d)
    385       res.put(exec,UString::from(i++), String(u.substr(p0)));
    386     res.put(exec,"length", Number(i));
     385      res.put(exec, i++, String(u.substr(p0)));
     386    res.put(exec,lengthPropertyName, Number(i));
    387387    }
    388388    break;
     
    498498  Value protect(this);
    499499  // ECMA 15.5.3.1 String.prototype
    500   put(exec,"prototype", Object(stringProto), DontEnum|DontDelete|ReadOnly);
    501 
    502   put(exec,"fromCharCode", Object(new StringObjectFuncImp(exec,funcProto)), DontEnum);
     500  put(exec,prototypePropertyName, Object(stringProto), DontEnum|DontDelete|ReadOnly);
     501
     502  static UString fromCharCode("fromCharCode");
     503  put(exec,fromCharCode, Object(new StringObjectFuncImp(exec,funcProto)), DontEnum);
    503504
    504505  // no. of arguments for constructor
    505   put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
     506  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
    506507}
    507508
     
    525526
    526527  obj.setInternalValue(String(s));
    527   obj.put(exec, "length", Number(s.size()), ReadOnly|DontEnum|DontDelete);
     528  obj.put(exec, lengthPropertyName, Number(s.size()), ReadOnly|DontEnum|DontDelete);
    528529
    529530  return obj;
     
    553554{
    554555  Value protect(this);
    555   put(exec,"length",Number(1),DontDelete|ReadOnly|DontEnum);
     556  put(exec,lengthPropertyName,Number(1),DontDelete|ReadOnly|DontEnum);
    556557}
    557558
Note: See TracChangeset for help on using the changeset viewer.