Skip to content

Commit

Permalink
fixfix
Browse files Browse the repository at this point in the history
  • Loading branch information
lahma committed Dec 22, 2023
1 parent 8b0c99a commit 3a5756c
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 35 deletions.
68 changes: 40 additions & 28 deletions Jint/Native/Function/ClassDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -342,25 +342,25 @@ public ClassStaticBlockFunction(StaticBlock staticBlock) : base(Nodes.StaticBloc
/// <summary>
/// https://tc39.es/ecma262/#sec-runtime-semantics-methoddefinitionevaluation
/// </summary>
private static PrivateElement? MethodDefinitionEvaluation(
internal static PrivateElement? MethodDefinitionEvaluation<T>(
Engine engine,
ObjectInstance obj,
MethodDefinition method,
bool enumerable)
T method,
bool enumerable) where T : IProperty
{
if (method.Kind != PropertyKind.Get && method.Kind != PropertyKind.Set)
{
var methodDef = method.DefineMethod(obj);
methodDef.Closure.SetFunctionName(methodDef.Key);
return DefineMethodProperty(obj, methodDef.Key, methodDef.Closure, enumerable);
}

var function = method.Value as IFunction;
if (function is null)
{
ExceptionHelper.ThrowSyntaxError(obj.Engine.Realm);
}

if (method.Kind != PropertyKind.Get && method.Kind != PropertyKind.Set && !function.Generator)
{
var methodDef = method.DefineMethod(obj);
methodDef.Closure.SetFunctionName(methodDef.Key);
return DefineMethodProperty(obj, methodDef.Key, methodDef.Closure, enumerable);
}

var getter = method.Kind == PropertyKind.Get;

var definition = new JintFunctionDefinition(function);
Expand All @@ -371,27 +371,39 @@ public ClassStaticBlockFunction(StaticBlock staticBlock) : base(Nodes.StaticBloc
var env = engine.ExecutionContext.LexicalEnvironment;
var privateEnv = engine.ExecutionContext.PrivateEnvironment;

var closure = intrinsics.Function.OrdinaryFunctionCreate(intrinsics.Function.PrototypeObject, definition, definition.ThisMode, env, privateEnv);
closure.MakeMethod(obj);
closure.SetFunctionName(propKey, getter ? "get" : "set");

if (method.Key is PrivateIdentifier privateIdentifier)
if (function.Generator)
{
return new PrivateElement
{
Key = privateEnv!.Names[privateIdentifier],
Kind = PrivateElementKind.Accessor,
Get = getter ? closure : null,
Set = !getter ? closure : null
};
var closure = intrinsics.Function.OrdinaryFunctionCreate(intrinsics.GeneratorFunction.PrototypeObject, definition, definition.ThisMode, env, privateEnv);
closure.MakeMethod(obj);
closure.SetFunctionName(propKey);
var prototype = ObjectInstance.OrdinaryObjectCreate(engine, intrinsics.GeneratorFunction.PrototypeObject.PrototypeObject);
closure.DefinePropertyOrThrow(CommonProperties.Prototype, new PropertyDescriptor(prototype, PropertyFlag.Writable));
return DefineMethodProperty(obj, propKey, closure, enumerable);
}
else
{
var closure = intrinsics.Function.OrdinaryFunctionCreate(intrinsics.Function.PrototypeObject, definition, definition.ThisMode, env, privateEnv);
closure.MakeMethod(obj);
closure.SetFunctionName(propKey, getter ? "get" : "set");

var propDesc = new GetSetPropertyDescriptor(
getter ? closure : null,
!getter ? closure : null,
PropertyFlag.Configurable);
if (method.Key is PrivateIdentifier privateIdentifier)
{
return new PrivateElement
{
Key = privateEnv!.Names[privateIdentifier],
Kind = PrivateElementKind.Accessor,
Get = getter ? closure : null,
Set = !getter ? closure : null
};
}

obj.DefinePropertyOrThrow(propKey, propDesc);
var propDesc = new GetSetPropertyDescriptor(
getter ? closure : null,
!getter ? closure : null,
PropertyFlag.Configurable);

obj.DefinePropertyOrThrow(propKey, propDesc);
}

return null;
}
Expand All @@ -406,7 +418,7 @@ public ClassStaticBlockFunction(StaticBlock staticBlock) : base(Nodes.StaticBloc
return new PrivateElement { Key = (PrivateName) key, Kind = PrivateElementKind.Method, Value = closure };
}

var desc = new PropertyDescriptor(closure, enumerable ? PropertyFlag.Enumerable : PropertyFlag.NonEnumerable);
var desc = new PropertyDescriptor(closure, enumerable ? PropertyFlag.ConfigurableEnumerableWritable : PropertyFlag.NonEnumerable);
homeObject.DefinePropertyOrThrow(key, desc);
return null;
}
Expand Down
10 changes: 3 additions & 7 deletions Jint/Runtime/Interpreter/Expressions/JintObjectExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,7 @@ private object BuildObjectNormal(EvaluationContext context)

if (property.Method)
{
var methodDef = property.DefineMethod(obj);
methodDef.Closure.SetFunctionName(methodDef.Key);
var desc = new PropertyDescriptor(methodDef.Closure, PropertyFlag.ConfigurableEnumerableWritable);
obj.DefinePropertyOrThrow(methodDef.Key, desc);
ClassDefinition.MethodDefinitionEvaluation(engine, obj, property, enumerable: true);
continue;
}

Expand Down Expand Up @@ -221,10 +218,9 @@ private object BuildObjectNormal(EvaluationContext context)
closure.SetFunctionName(propName);
}

var propDesc = new PropertyDescriptor(propValue, PropertyFlag.ConfigurableEnumerableWritable);
obj.DefinePropertyOrThrow(propName, propDesc);
obj.CreateDataPropertyOrThrow(propName, propValue);
}
else if (property.Kind == PropertyKind.Get || property.Kind == PropertyKind.Set)
else if (property.Kind is PropertyKind.Get or PropertyKind.Set)
{
var function = objectProperty.GetFunctionDefinition(engine);
var closure = engine.Realm.Intrinsics.Function.OrdinaryFunctionCreate(
Expand Down

0 comments on commit 3a5756c

Please sign in to comment.