Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions Jint.Tests.Test262/Test262Harness.settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"SuiteGitSha": "b0f03cb22d8b9233347782d166e7793d4d4c757f",
"SuiteGitSha": "a073f479f80b336256b7fc4e04700c827293e2fe",
//"SuiteDirectory": "//mnt/c/work/test262",
"TargetPath": "./Generated",
"Namespace": "Jint.Tests.Test262",
Expand All @@ -22,7 +22,8 @@
"source-phase-imports",
"tail-call-optimization",
"Temporal",
"u180e"
"u180e",
"upsert"
],
"ExcludedFlags": [
],
Expand All @@ -35,6 +36,10 @@
// requires rewrite of destructing towards spec
"language/destructuring/binding/keyed-destructuring-property-reference-target-evaluation-order-with-bindings.js",
"language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order-with-bindings.js",
"language/expressions/assignment/destructuring/default-expr-throws-iterator-return-get-throws.js",
"language/expressions/assignment/destructuring/default-expr-throws-iterator-return-is-not-callable.js",
"language/expressions/assignment/destructuring/target-assign-throws-iterator-return-get-throws.js",
"language/expressions/assignment/destructuring/target-assign-throws-iterator-return-is-not-callable.js",

// Acornima doesn't implement unicode 15/16 yet
"language/identifiers/*-unicode-15.*.js",
Expand All @@ -52,6 +57,19 @@
"built-ins/RegExp/quantifier-integer-limit.js",
"language/literals/regexp/named-groups/forward-reference.js",

"built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-positive-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-positive-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-positive-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-positive-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-positive-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-negative-cases.js",
"built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-positive-cases.js",

// RegExp handling problems
"built-ins/RegExp/nullable-quantifier.js",
"built-ins/RegExp/prototype/exec/S15.10.6.2_A1_T6.js",
Expand Down
2 changes: 1 addition & 1 deletion Jint.Tests/Jint.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="MongoDB.Bson.signed" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="System.Text.Json" />
<PackageReference Include="System.Text.Json" Condition="'$(TargetFramework)' == 'net472'" />
<PackageReference Include="xunit" />
<PackageReference Include="xunit.runner.visualstudio" />
</ItemGroup>
Expand Down
50 changes: 50 additions & 0 deletions Jint/Native/Global/GlobalObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ private JsValue EncodeUriComponent(JsValue thisObject, JsCallArguments arguments
return Encode(uriString, UriUnescaped);
}

[MethodImpl(512)]
private JsValue Encode(string uriString, SearchValues<char> allowedCharacters)
{
var strLen = uriString.Length;
Expand Down Expand Up @@ -408,6 +409,7 @@ private JsValue DecodeUriComponent(JsValue thisObject, JsCallArguments arguments
return Decode(componentString, null);
}

[MethodImpl(512)]
private JsValue Decode(string uriString, SearchValues<char>? reservedSet)
{
var strLen = uriString.Length;
Expand Down Expand Up @@ -507,6 +509,54 @@ private JsValue Decode(string uriString, SearchValues<char>? reservedSet)
octets[j] = B;
}

switch (n)
{
case 2:
{
// Overlong encoding check for 2-byte sequences
var x = octets[0] & 0x1F; // 0x00
var y = octets[1] & 0x3F; // 0x2F
var codepoint = (x << 6) | y; // 0x2F

if (codepoint < 0x80) // 2-byte should be ≥ 0x80
{
goto uriError;
}

break;
}
case 3:
{
// Reserved surrogate pair (U+D800-DFFF)
var x = octets[0] & 0x0F;
var y = octets[1] & 0x3F;
var z = octets[2] & 0x3F;
var codepoint = (x << 12) | (y << 6) | z;

if (codepoint is >= 0xD800 and <= 0xDFFF)
{
goto uriError;
}

break;
}
case 4:
{
var x = octets[0] & 0x07;
var y = octets[1] & 0x3F;
var z = octets[2] & 0x3F;
var w = octets[3] & 0x3F;
var codepoint = (x << 18) | (y << 12) | (z << 6) | w;

if (codepoint > 0x10FFFF)
{
goto uriError;
}

break;
}
}

#if SUPPORTS_SPAN_PARSE
_stringBuilder.Append(Encoding.UTF8.GetString(octets.Slice(0, n)));
#else
Expand Down
19 changes: 5 additions & 14 deletions Jint/Native/Iterator/IteratorInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,29 +77,20 @@ private ObjectInstance IteratorNext()

public override void Close(CompletionType completion)
{
if (!_target.TryGetValue(CommonProperties.Return, out var func)
|| func.IsNullOrUndefined())
{
return;
}

var callable = func as ICallable;
var callable = _target.GetMethod(CommonProperties.Return);
if (callable is null)
{
ExceptionHelper.ThrowTypeError(_target.Engine.Realm, func + " is not a function");
return;
}

var innerResult = Undefined;
JsValue innerResult;
try
{
innerResult = callable.Call(_target, Arguments.Empty);
}
catch
catch (JavaScriptException) when (completion == CompletionType.Throw)
{
if (completion != CompletionType.Throw)
{
throw;
}
return;
}

if (completion != CompletionType.Throw && !innerResult.IsObject())
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Object/ObjectInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1391,7 +1391,7 @@ internal static JsObject OrdinaryObjectCreate(Engine engine, ObjectInstance? pro
var callable = jsValue as ICallable;
if (callable is null)
{
ExceptionHelper.ThrowTypeError(realm, "Value returned for property '" + p + "' of object is not a function");
ExceptionHelper.ThrowTypeError(realm, $"Value returned for property '{p}' of object is not a function");
}
return callable;
}
Expand Down
5 changes: 5 additions & 0 deletions Jint/Native/Object/ObjectPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ protected override void Initialize()
SetProperties(properties);
}

internal override bool SetPrototypeOf(JsValue value)
{
return SameValue(value, _prototype ?? Null);
}

public override bool DefineOwnProperty(JsValue property, PropertyDescriptor desc)
{
TrackChanges(property);
Expand Down
39 changes: 32 additions & 7 deletions Jint/Native/Promise/PromiseConstructor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,14 @@ void ResolveIfFinished()
}
catch (JavaScriptException e)
{
iterator.Close(CompletionType.Throw);
try
{
iterator.Close(CompletionType.Throw);
}
catch (JavaScriptException)
{
// ignore any errors from closing the iterator
}
capability.Reject.Call(Undefined, e.Error);
return capability.PromiseInstance;
}
Expand Down Expand Up @@ -449,7 +456,14 @@ void ResolveIfFinished()
}
catch (JavaScriptException e)
{
iterator.Close(CompletionType.Throw);
try
{
iterator.Close(CompletionType.Throw);
}
catch (JavaScriptException)
{
// ignore any errors from closing the iterator
}
capability.Reject.Call(Undefined, e.Error);
return capability.PromiseInstance;
}
Expand Down Expand Up @@ -551,7 +565,14 @@ void RejectIfAllRejected()
}
catch (JavaScriptException e)
{
iterator.Close(CompletionType.Throw);
try
{
iterator.Close(CompletionType.Throw);
}
catch (JavaScriptException)
{
// ignore any errors from closing the iterator
}
capability.Reject.Call(Undefined, e.Error);
return capability.PromiseInstance;
}
Expand Down Expand Up @@ -597,10 +618,14 @@ private JsValue Race(JsValue thisObject, JsCallArguments arguments)
}
catch (JavaScriptException e)
{
// 8. If result is an abrupt completion, then
// a. If iteratorRecord.[[Done]] is false, set result to IteratorClose(iteratorRecord, result).
// b. IfAbruptRejectPromise(result, promiseCapability).
iterator.Close(CompletionType.Throw);
try
{
iterator.Close(CompletionType.Throw);
}
catch (JavaScriptException)
{
// ignore any errors from closing the iterator
}
capability.Reject.Call(Undefined, e.Error);
return capability.PromiseInstance;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,12 +240,7 @@ private static JsValue HandleArrayPattern(
if (value.IsUndefined())
{
var jintExpression = Build(assignmentPattern.Right);
var completion = jintExpression.GetValue(context);
if (context.IsAbrupt())
{
return completion;
}
value = completion;
value = jintExpression.GetValue(context);
}

if (assignmentPattern.Left is Identifier leftIdentifier)
Expand Down Expand Up @@ -278,9 +273,9 @@ private static JsValue HandleArrayPattern(
}
finally
{
if (close && !done)
if (close && !done && iterator is not null)
{
iterator?.Close(completionType);
iterator.Close(completionType);
}
}

Expand Down