Changeset 16613 in webkit for trunk/JavaScriptCore/kjs


Ignore:
Timestamp:
Sep 28, 2006, 2:11:30 AM (19 years ago)
Author:
mjs
Message:

Reviewed by Mitz.

  • fixed REGRESSION (r16606): javascriptCore Crash on website load


Plus style fixes.


  • fixed some possible off-by-one bugs
  • use indexing, not iterators, for Vectors
  • store Vector by pointer instead of by value to avoid blowing out FunctionImp size


  • kjs/function.cpp: (KJS::FunctionImp::addParameter): (KJS::FunctionImp::parameterString): (KJS::FunctionImp::processParameters): (KJS::FunctionImp::lengthGetter): (KJS::FunctionImp::getParameterName):
  • kjs/function.h:
Location:
trunk/JavaScriptCore/kjs
Files:
2 edited

Legend:

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

    r16608 r16613  
    152152void FunctionImp::addParameter(const Identifier &n)
    153153{
    154     parameters.append(Parameter(n));
     154    if (!parameters)
     155        parameters.set(new Vector<Parameter>);
     156
     157    parameters->append(Parameter(n));
    155158}
    156159
    157160UString FunctionImp::parameterString() const
    158161{
    159   UString s;
    160 
    161     Vector<Parameter>::const_iterator end = parameters.end();
    162     for(Vector<Parameter>::const_iterator it = parameters.begin(); it < end; it++) {
     162    UString s;
     163
     164    if (!parameters)
     165        return s;
     166
     167    for (size_t i = 0; i < parameters->size(); ++i) {
    163168        if (!s.isEmpty())
    164169            s += ", ";
    165         s += it->name.ustring();
    166     }
    167 
    168   return s;
     170        s += parameters->at(i).name.ustring();
     171    }
     172
     173    return s;
    169174}
    170175
     
    173178void FunctionImp::processParameters(ExecState *exec, const List &args)
    174179{
    175   JSObject* variable = exec->context()->variableObject();
     180    if (!parameters)
     181        return;
     182
     183    JSObject* variable = exec->context()->variableObject();
    176184
    177185#ifdef KJS_VERBOSE
    178   fprintf(stderr, "---------------------------------------------------\n"
     186    fprintf(stderr, "---------------------------------------------------\n"
    179187          "processing parameters for %s call\n",
    180188          name().isEmpty() ? "(internal)" : name().ascii());
     
    184192
    185193    JSValue  *v = *it;
    186     Vector<Parameter>::const_iterator end = parameters.end();
    187     for(Vector<Parameter>::iterator pit = parameters.begin(); pit < end; pit++) {
     194    for (size_t i = 0; i < parameters->size(); ++i) {
    188195      if (it != args.end()) {
    189196#ifdef KJS_VERBOSE
    190         fprintf(stderr, "setting parameter %s ", p->name.ascii());
    191         printInfo(exec,"to", *it);
     197        fprintf(stderr, "setting parameter %s ", parameters->at(i).name.ascii());
     198        printInfo(exec, "to", *it);
    192199#endif
    193         variable->put(exec, pit->name, v);
     200        variable->put(exec, parameters->at(i).name, v);
    194201        v = ++it;
    195202      } else
    196         variable->put(exec, pit->name, jsUndefined());
     203        variable->put(exec, parameters->at(i).name, jsUndefined());
    197204  }
    198205#ifdef KJS_VERBOSE
    199206  else {
    200     for (int i = 0; i < args.size(); i++)
     207    for (int i = 0; i < args.size(); ++i)
    201208      printInfo(exec,"setting argument", args[i]);
    202209  }
     
    224231{
    225232    FunctionImp *thisObj = static_cast<FunctionImp *>(slot.slotBase());
    226     return jsNumber(thisObj->parameters.size());
     233    return jsNumber(thisObj->parameters ? thisObj->parameters->size() : 0);
    227234}
    228235
     
    267274Identifier FunctionImp::getParameterName(int index)
    268275{
    269     if (static_cast<size_t>(index) > parameters.size())
     276    if (!parameters)
     277        return Identifier::null();
     278
     279    if (static_cast<size_t>(index) >= parameters->size())
    270280        return Identifier::null();
    271281 
    272     Identifier name = parameters[index].name;
     282    Identifier name = parameters->at(index).name;
    273283
    274284    // Are there any subsequent parameters with the same name?
    275     Vector<Parameter>::const_iterator end = parameters.end();
    276     for (Vector<Parameter>::iterator it = &(parameters[index+1]); it < end; it++)
    277         if (it->name == name)
     285    for (size_t i = index + 1; i < parameters->size(); ++i)
     286        if (parameters->at(i).name == name)
    278287            return Identifier::null();
    279288
  • trunk/JavaScriptCore/kjs/function.h

    r16607 r16613  
    9494    virtual void mark();
    9595  protected:
    96     Vector<Parameter> parameters;
     96    OwnPtr<Vector<Parameter> > parameters;
    9797
    9898  private:
Note: See TracChangeset for help on using the changeset viewer.