Skip to content

Commit

Permalink
tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
lahma committed Jan 14, 2021
1 parent 552bf83 commit 3bdcf22
Show file tree
Hide file tree
Showing 19 changed files with 132 additions and 85 deletions.
8 changes: 4 additions & 4 deletions Jint/Engine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ internal Engine Execute(Script script, bool resetState)
script,
GlobalEnvironment);

var list = new JintStatementList(this, null, script.Body);
var list = new JintStatementList(this, script);

var result = list.Execute();
if (result.Type == CompletionType.Throw)
Expand Down Expand Up @@ -870,12 +870,12 @@ private void GlobalDeclarationInstantiation(
/// </summary>
internal ArgumentsInstance FunctionDeclarationInstantiation(
FunctionInstance functionInstance,
JsValue[] argumentsList,
EnvironmentRecord env)
JsValue[] argumentsList)
{
var env = ExecutionContext.LexicalEnvironment;
var envRec = (FunctionEnvironmentRecord) env;
var func = functionInstance._functionDefinition;

var envRec = (FunctionEnvironmentRecord) env;
var strict = StrictModeScope.IsStrictModeCode;

var configuration = func.Initialize(this, functionInstance);
Expand Down
9 changes: 2 additions & 7 deletions Jint/Native/Function/FunctionInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -308,14 +308,9 @@ protected void OrdinaryCallBindThis(ExecutionContext calleeContext, JsValue this
localEnv.BindThisValue(thisValue);
}

protected Completion OrdinaryCallEvaluateBody(
JsValue[] arguments,
ExecutionContext calleeContext)
protected internal Completion OrdinaryCallEvaluateBody(JsValue[] arguments)
{
var argumentsInstance = _engine.FunctionDeclarationInstantiation(
functionInstance: this,
arguments,
calleeContext.LexicalEnvironment);
var argumentsInstance = _engine.FunctionDeclarationInstantiation(functionInstance: this, arguments);

var result = _functionDefinition.Execute();
var value = result.GetValueOrDefault().Clone();
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Function/ScriptFunctionInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public override JsValue Call(JsValue thisArgument, JsValue[] arguments)
{
try
{
var result = OrdinaryCallEvaluateBody(arguments, calleeContext);
var result = OrdinaryCallEvaluateBody(arguments);

if (result.Type == CompletionType.Throw)
{
Expand Down Expand Up @@ -117,7 +117,7 @@ public ObjectInstance Construct(JsValue[] arguments, JsValue newTarget)
{
try
{
var result = OrdinaryCallEvaluateBody(arguments, calleeContext);
var result = OrdinaryCallEvaluateBody(arguments);

if (result.Type == CompletionType.Return)
{
Expand Down
21 changes: 10 additions & 11 deletions Jint/Native/Generator/Generator.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using Esprima.Ast;
using Jint.Native.Function;
using Jint.Native.Iterator;
using Jint.Native.Object;
using Jint.Runtime;
using Jint.Runtime.Environments;
using Jint.Runtime.Interpreter;

namespace Jint.Native.Generator
{
Expand All @@ -14,7 +14,7 @@ internal sealed class Generator : ObjectInstance
internal GeneratorState _generatorState;
private ExecutionContext _generatorContext;
private readonly object _generatorBrand = null;
private JintStatementList _generatorBody;
private FunctionInstance _generatorBody;

public Generator(Engine engine) : base(engine)
{
Expand All @@ -24,11 +24,10 @@ public Generator(Engine engine) : base(engine)
/// <summary>
/// https://tc39.es/ecma262/#sec-generatorstart
/// </summary>
public JsValue GeneratorStart(IFunction generatorBody)
public JsValue GeneratorStart(FunctionInstance generatorBody)
{
var genContext = _engine.UpdateGenerator(this);
var blockStatement = (BlockStatement) generatorBody.Body;
_generatorBody ??= new JintStatementList(_engine, blockStatement, blockStatement.Body);
_generatorBody = generatorBody;

/*
*Set the code evaluation state of genContext such that when evaluation is resumed for that execution context the following steps will be performed:
Expand Down Expand Up @@ -63,7 +62,7 @@ public JsValue GeneratorResume(JsValue value, object generatorBrand)
var state = GeneratorValidate(generatorBrand);
if (state == GeneratorState.Completed)
{
return CreateIterResultObject(Undefined, true);
return new IteratorResult(_engine, Undefined, JsBoolean.True);
}

var genContext = _generatorContext;
Expand All @@ -75,10 +74,10 @@ public JsValue GeneratorResume(JsValue value, object generatorBrand)
_engine.EnterExecutionContext(genContext);

// TODO
var result = _generatorBody.Execute();
var result = _generatorBody._functionDefinition.Execute();

return result.Value.IsUndefined()
? CreateIterResultObject(Undefined, done: true)
? new IteratorResult(_engine, Undefined, JsBoolean.True)
: result.Value;
}

Expand All @@ -98,7 +97,7 @@ public JsValue GeneratorResumeAbrupt(in Completion abruptCompletion, object gene
{
if (abruptCompletion.Type == CompletionType.Return)
{
return CreateIterResultObject(abruptCompletion.Value, true);
return new IteratorResult(_engine, abruptCompletion.Value, JsBoolean.True);
}

return abruptCompletion.Value;
Expand All @@ -114,7 +113,7 @@ public JsValue GeneratorResumeAbrupt(in Completion abruptCompletion, object gene
_engine.EnterExecutionContext(genContext);

// Resume the suspended evaluation of genContext using abruptCompletion as the result of the operation that suspended it. Let result be the completion record returned by the resumed computation.
var result = _generatorBody.Execute();
var result = _generatorBody.OrdinaryCallEvaluateBody(Arguments.Empty);

return result.Value;
}
Expand Down
18 changes: 11 additions & 7 deletions Jint/Native/Generator/GeneratorFunctionInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ namespace Jint.Native.Generator
/// </summary>
internal sealed class GeneratorFunctionInstance : FunctionInstance
{
private readonly FunctionInstance _functionInstance;
private readonly FunctionInstance _functionBody;

public GeneratorFunctionInstance(Engine engine, FunctionInstance functionInstance) : base(engine, JsString.Empty)
public GeneratorFunctionInstance(Engine engine, FunctionInstance functionBody) : base(engine, JsString.Empty)
{
_functionInstance = functionInstance;
_functionBody = functionBody;
_prototype = _engine.GeneratorFunction.PrototypeObject;
var prototype = new ObjectInstance(_engine)
{
Expand All @@ -22,11 +22,15 @@ public GeneratorFunctionInstance(Engine engine, FunctionInstance functionInstanc
_prototypeDescriptor = new PropertyDescriptor(prototype, PropertyFlag.Writable);
}

public override JsValue Call(JsValue thisObject, JsValue[] arguments)
/// <summary>
/// https://tc39.es/ecma262/#sec-generator-function-definitions-runtime-semantics-evaluatebody
/// </summary>
public override JsValue Call(JsValue functionObject, JsValue[] arguments)
{
var generator = new Generator(_engine);
generator.GeneratorStart(_functionInstance.FunctionDeclaration);
return generator;
_engine.FunctionDeclarationInstantiation(_functionBody, arguments);
var G = OrdinaryCreateFromConstructor(functionObject, _engine.GeneratorFunction.PrototypeObject.Prototype, (engine, _) => new Generator(engine));
G.GeneratorStart(_functionBody);
return G;
}
}
}
2 changes: 1 addition & 1 deletion Jint/Native/Iterator/IIterator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Jint.Native.Iterator
{
internal interface IIterator
{
bool IteratorStep(out ObjectInstance nextItem);
bool TryIteratorStep(out ObjectInstance nextItem);
void Close(CompletionType completion);
}
}
28 changes: 14 additions & 14 deletions Jint/Native/Iterator/IteratorInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public override bool Equals(JsValue other)
return false;
}

public virtual bool IteratorStep(out ObjectInstance nextItem)
public virtual bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_enumerable.MoveNext())
{
Expand Down Expand Up @@ -99,7 +99,7 @@ public MapIterator(Engine engine, MapInstance map) : base(engine)
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_position < _map.GetSize())
{
Expand Down Expand Up @@ -134,7 +134,7 @@ public ArrayLikeIterator(Engine engine, JsValue target) : base(engine)
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_end == null)
{
Expand Down Expand Up @@ -164,7 +164,7 @@ public SetIterator(Engine engine, SetInstance set) : base(engine)
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_position < _set._set._list.Count)
{
Expand All @@ -190,7 +190,7 @@ public SetEntryIterator(Engine engine, SetInstance set) : base(engine)
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_position < _set._set._list.Count)
{
Expand All @@ -217,7 +217,7 @@ public ListIterator(Engine engine, List<JsValue> values) : base(engine)
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (!_closed && _position < _values.Count)
{
Expand Down Expand Up @@ -245,7 +245,7 @@ public ArrayLikeKeyIterator(Engine engine, ObjectInstance objectInstance) : base
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
var length = _operations.GetLength();
if (!_closed && _position < length)
Expand All @@ -272,7 +272,7 @@ public ArrayLikeValueIterator(Engine engine, ObjectInstance objectInstance) : ba
_position = 0;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
var length = _operations.GetLength();
if (!_closed && _position < length)
Expand Down Expand Up @@ -300,7 +300,7 @@ public ObjectIterator(ObjectInstance target)
?? ExceptionHelper.ThrowTypeError<ICallable>(target.Engine);
}

public bool IteratorStep(out ObjectInstance result)
public bool TryIteratorStep(out ObjectInstance result)
{
result = IteratorNext();

Expand Down Expand Up @@ -357,7 +357,7 @@ public StringIterator(Engine engine, string str) : base(engine)
_iterator = StringInfo.GetTextElementEnumerator(str);
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_iterator.MoveNext())
{
Expand Down Expand Up @@ -393,19 +393,19 @@ public RegExpStringIterator(Engine engine, ObjectInstance iteratingRegExp, strin
_unicode = unicode;
}

public override bool IteratorStep(out ObjectInstance nextItem)
public override bool TryIteratorStep(out ObjectInstance nextItem)
{
if (_done)
{
nextItem = CreateIterResultObject(Undefined, true);
nextItem = new IteratorResult(_engine, Undefined, JsBoolean.True);
return false;
}

var match = RegExpPrototype.RegExpExec(_iteratingRegExp, _s);
if (match.IsNull())
{
_done = true;
nextItem = CreateIterResultObject(Undefined, true);
nextItem = new IteratorResult(_engine, Undefined, JsBoolean.True);
return false;
}

Expand All @@ -424,7 +424,7 @@ public override bool IteratorStep(out ObjectInstance nextItem)
_done = true;
}

nextItem = CreateIterResultObject(match, false);
nextItem = new IteratorResult(_engine, match, JsBoolean.False);
return false;
}
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Iterator/IteratorProtocol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ internal bool Execute()
{
do
{
if (!_iterator.IteratorStep(out var item))
if (!_iterator.TryIteratorStep(out var item))
{
done = true;
break;
Expand Down Expand Up @@ -101,7 +101,7 @@ internal static void AddEntriesFromIterable(ObjectInstance target, IIterator ite
{
do
{
if (!iterable.IteratorStep(out var nextItem))
if (!iterable.TryIteratorStep(out var nextItem))
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Iterator/IteratorPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ private JsValue Next(JsValue thisObj, JsValue[] arguments)
return ExceptionHelper.ThrowTypeError<JsValue>(_engine);
}

iterator.IteratorStep(out var result);
iterator.TryIteratorStep(out var result);
return result;
}
}
Expand Down
45 changes: 45 additions & 0 deletions Jint/Native/Iterator/IteratorResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using Jint.Native.Object;
using Jint.Runtime;

namespace Jint.Native.Iterator
{
/// <summary>
/// https://tc39.es/ecma262/#sec-createiterresultobject
/// </summary>
internal class IteratorResult : ObjectInstance
{
private readonly JsValue _value;
private readonly JsBoolean _done;

public IteratorResult(Engine engine, JsValue value, JsBoolean done) : base(engine)
{
_value = value;
_done = done;
}

public override JsValue Get(JsValue property, JsValue receiver)
{
if (property == CommonProperties.Value)
{
return _value;
}

if (property == CommonProperties.Done)
{
return _done;
}

return base.Get(property, receiver);
}

public override object ToObject()
{
return this;
}

public override bool Equals(JsValue other)
{
return ReferenceEquals(this, other);
}
}
}
Loading

0 comments on commit 3bdcf22

Please sign in to comment.