void FunctionImp::addParameter(const Identifier &n)
{
- parameters.append(Parameter(n));
+ if (!parameters)
+ parameters.set(new Vector<Parameter>);
+
+ parameters->append(Parameter(n));
}
UString FunctionImp::parameterString() const
{
- UString s;
+ UString s;
+
+ if (!parameters)
+ return s;
- Vector<Parameter>::const_iterator end = parameters.end();
- for(Vector<Parameter>::const_iterator it = parameters.begin(); it < end; it++) {
+ for (size_t i = 0; i < parameters->size(); ++i) {
if (!s.isEmpty())
s += ", ";
- s += it->name.ustring();
+ s += parameters->at(i).name.ustring();
}
- return s;
+ return s;
}
// ECMA 10.1.3q
void FunctionImp::processParameters(ExecState *exec, const List &args)
{
- JSObject* variable = exec->context()->variableObject();
+ if (!parameters)
+ return;
+
+ JSObject* variable = exec->context()->variableObject();
#ifdef KJS_VERBOSE
- fprintf(stderr, "---------------------------------------------------\n"
+ fprintf(stderr, "---------------------------------------------------\n"
"processing parameters for %s call\n",
name().isEmpty() ? "(internal)" : name().ascii());
#endif
ListIterator it = args.begin();
JSValue *v = *it;
- Vector<Parameter>::const_iterator end = parameters.end();
- for(Vector<Parameter>::iterator pit = parameters.begin(); pit < end; pit++) {
+ for (size_t i = 0; i < parameters->size(); ++i) {
if (it != args.end()) {
#ifdef KJS_VERBOSE
- fprintf(stderr, "setting parameter %s ", p->name.ascii());
- printInfo(exec,"to", *it);
+ fprintf(stderr, "setting parameter %s ", parameters->at(i).name.ascii());
+ printInfo(exec, "to", *it);
#endif
- variable->put(exec, pit->name, v);
+ variable->put(exec, parameters->at(i).name, v);
v = ++it;
} else
- variable->put(exec, pit->name, jsUndefined());
+ variable->put(exec, parameters->at(i).name, jsUndefined());
}
#ifdef KJS_VERBOSE
else {
- for (int i = 0; i < args.size(); i++)
+ for (int i = 0; i < args.size(); ++i)
printInfo(exec,"setting argument", args[i]);
}
#endif
JSValue *FunctionImp::lengthGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot)
{
FunctionImp *thisObj = static_cast<FunctionImp *>(slot.slotBase());
- return jsNumber(thisObj->parameters.size());
+ return jsNumber(thisObj->parameters ? thisObj->parameters->size() : 0);
}
bool FunctionImp::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
*/
Identifier FunctionImp::getParameterName(int index)
{
- if (static_cast<size_t>(index) > parameters.size())
+ if (!parameters)
+ return Identifier::null();
+
+ if (static_cast<size_t>(index) >= parameters->size())
return Identifier::null();
- Identifier name = parameters[index].name;
+ Identifier name = parameters->at(index).name;
// Are there any subsequent parameters with the same name?
- Vector<Parameter>::const_iterator end = parameters.end();
- for (Vector<Parameter>::iterator it = &(parameters[index+1]); it < end; it++)
- if (it->name == name)
+ for (size_t i = index + 1; i < parameters->size(); ++i)
+ if (parameters->at(i).name == name)
return Identifier::null();
return name;