|
@@ -58,93 +58,97 @@ namespace Jint.Native.Function
|
|
|
public override object Call(object thisArg, object[] arguments)
|
|
|
{
|
|
|
object thisBinding;
|
|
|
-
|
|
|
- // setup new execution context http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.3
|
|
|
- if (this.Strict || Engine.Options.IsStrict())
|
|
|
- {
|
|
|
- thisBinding = thisArg;
|
|
|
- }
|
|
|
- else if (thisArg == Undefined.Instance || thisArg == Null.Instance)
|
|
|
+ using (new StrictModeScope(Strict))
|
|
|
{
|
|
|
- thisBinding = Engine.Global;
|
|
|
- }
|
|
|
- else if (TypeConverter.GetType(thisArg) != Types.Object)
|
|
|
- {
|
|
|
- thisBinding = TypeConverter.ToObject(Engine, thisArg);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- thisBinding = thisArg;
|
|
|
- }
|
|
|
-
|
|
|
- var localEnv = LexicalEnvironment.NewDeclarativeEnvironment(Engine, Scope);
|
|
|
-
|
|
|
- Engine.EnterExecutionContext(localEnv, localEnv, thisBinding);
|
|
|
-
|
|
|
- // Declaration Binding Instantiation http://www.ecma-international.org/ecma-262/5.1/#sec-10.5
|
|
|
- var env = localEnv.Record;
|
|
|
- var configurableBindings = false;
|
|
|
-
|
|
|
- //if (/* todo: if code is eval code */)
|
|
|
- //{
|
|
|
- // configurableBindings = true;
|
|
|
- //}
|
|
|
-
|
|
|
- var argCount = arguments.Length;
|
|
|
- var n = 0;
|
|
|
- foreach (var argName in FormalParameters)
|
|
|
- {
|
|
|
- n++;
|
|
|
- var v = n > argCount ? Undefined.Instance : arguments[n-1];
|
|
|
- var argAlreadyDeclared = env.HasBinding(argName);
|
|
|
- if (!argAlreadyDeclared)
|
|
|
+ // setup new execution context http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.3
|
|
|
+ if (StrictModeScope.IsStrictModeCode)
|
|
|
+ {
|
|
|
+ thisBinding = thisArg;
|
|
|
+ }
|
|
|
+ else if (thisArg == Undefined.Instance || thisArg == Null.Instance)
|
|
|
+ {
|
|
|
+ thisBinding = Engine.Global;
|
|
|
+ }
|
|
|
+ else if (TypeConverter.GetType(thisArg) != Types.Object)
|
|
|
+ {
|
|
|
+ thisBinding = TypeConverter.ToObject(Engine, thisArg);
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- env.CreateMutableBinding(argName);
|
|
|
+ thisBinding = thisArg;
|
|
|
}
|
|
|
|
|
|
- env.SetMutableBinding(argName, v, Strict);
|
|
|
- }
|
|
|
+ var localEnv = LexicalEnvironment.NewDeclarativeEnvironment(Engine, Scope);
|
|
|
|
|
|
- Engine.FunctionDeclarationBindings(_functionDeclaration, localEnv, true, Strict);
|
|
|
+ Engine.EnterExecutionContext(localEnv, localEnv, thisBinding);
|
|
|
|
|
|
- var argumentsAlreadyDeclared = env.HasBinding("arguments");
|
|
|
+ // Declaration Binding Instantiation http://www.ecma-international.org/ecma-262/5.1/#sec-10.5
|
|
|
+ var env = localEnv.Record;
|
|
|
+ var configurableBindings = false;
|
|
|
|
|
|
- if (!argumentsAlreadyDeclared)
|
|
|
- {
|
|
|
- var argsObj = ArgumentsInstance.CreateArgumentsObject(Engine, this, FormalParameters, arguments, env, Strict);
|
|
|
+ //if (/* todo: if code is eval code */)
|
|
|
+ //{
|
|
|
+ // configurableBindings = true;
|
|
|
+ //}
|
|
|
|
|
|
- if (Strict)
|
|
|
+ var argCount = arguments.Length;
|
|
|
+ var n = 0;
|
|
|
+ foreach (var argName in FormalParameters)
|
|
|
{
|
|
|
- var declEnv = env as DeclarativeEnvironmentRecord;
|
|
|
-
|
|
|
- if (declEnv == null)
|
|
|
+ n++;
|
|
|
+ var v = n > argCount ? Undefined.Instance : arguments[n - 1];
|
|
|
+ var argAlreadyDeclared = env.HasBinding(argName);
|
|
|
+ if (!argAlreadyDeclared)
|
|
|
{
|
|
|
- throw new ArgumentException();
|
|
|
+ env.CreateMutableBinding(argName);
|
|
|
}
|
|
|
|
|
|
- declEnv.CreateImmutableBinding("arguments");
|
|
|
- declEnv.InitializeImmutableBinding("arguments", argsObj);
|
|
|
+ env.SetMutableBinding(argName, v, Strict);
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ Engine.FunctionDeclarationBindings(_functionDeclaration, localEnv, true, Strict);
|
|
|
+
|
|
|
+ var argumentsAlreadyDeclared = env.HasBinding("arguments");
|
|
|
+
|
|
|
+ if (!argumentsAlreadyDeclared)
|
|
|
{
|
|
|
- env.CreateMutableBinding("arguments");
|
|
|
- env.SetMutableBinding("arguments", argsObj, false);
|
|
|
+ var argsObj = ArgumentsInstance.CreateArgumentsObject(Engine, this, FormalParameters, arguments, env,
|
|
|
+ Strict);
|
|
|
+
|
|
|
+ if (Strict)
|
|
|
+ {
|
|
|
+ var declEnv = env as DeclarativeEnvironmentRecord;
|
|
|
+
|
|
|
+ if (declEnv == null)
|
|
|
+ {
|
|
|
+ throw new ArgumentException();
|
|
|
+ }
|
|
|
+
|
|
|
+ declEnv.CreateImmutableBinding("arguments");
|
|
|
+ declEnv.InitializeImmutableBinding("arguments", argsObj);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ env.CreateMutableBinding("arguments");
|
|
|
+ env.SetMutableBinding("arguments", argsObj, false);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // process all variable declarations in the current parser scope
|
|
|
- Engine.VariableDeclarationBinding(_functionDeclaration.VariableDeclarations, env, configurableBindings, Strict);
|
|
|
+ // process all variable declarations in the current parser scope
|
|
|
+ Engine.VariableDeclarationBinding(_functionDeclaration.VariableDeclarations, env, configurableBindings,
|
|
|
+ Strict);
|
|
|
|
|
|
- var result = Engine.ExecuteStatement(_functionDeclaration.Body);
|
|
|
-
|
|
|
- Engine.LeaveExecutionContext();
|
|
|
+ var result = Engine.ExecuteStatement(_functionDeclaration.Body);
|
|
|
|
|
|
- if (result.Type == Completion.Throw)
|
|
|
- {
|
|
|
- throw new JavaScriptException(result.Value);
|
|
|
- }
|
|
|
+ Engine.LeaveExecutionContext();
|
|
|
|
|
|
- return result.Value ?? Undefined.Instance;
|
|
|
+ if (result.Type == Completion.Throw)
|
|
|
+ {
|
|
|
+ throw new JavaScriptException(result.Value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result.Value ?? Undefined.Instance;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|