internal NativeCall(NativeFunction function, Scriptable scope, object[] args) { this.function = function; SetParentScope(scope); // leave prototype null this.originalArgs = (args == null) ? ScriptRuntime.emptyArgs : args; // initialize values of arguments int paramAndVarCount = function.GetParamAndVarCount(); int paramCount = function.GetParamCount(); if (paramAndVarCount != 0) { for (int i = 0; i < paramCount; ++i) { string name = function.GetParamOrVarName(i); object val = i < args.Length ? args[i] : Undefined.instance; DefineProperty(name, val, PERMANENT); } } // initialize "arguments" property but only if it was not overridden by // the parameter with the same name if (!base.Has("arguments", this)) { DefineProperty("arguments", new Arguments(this), PERMANENT); } if (paramAndVarCount != 0) { for (int i = paramCount; i < paramAndVarCount; ++i) { string name = function.GetParamOrVarName(i); if (!base.Has(name, this)) { if (function.GetParamOrVarConst(i)) { DefineProperty(name, Undefined.instance, CONST); } else { DefineProperty(name, Undefined.instance, PERMANENT); } } } } }