|
@@ -50,24 +50,35 @@ namespace Jint.Runtime.Interop
|
|
|
|
|
|
private ObjectInstance Construct(JsValue[] arguments)
|
|
|
{
|
|
|
+ ObjectInstance result = null;
|
|
|
if (arguments.Length == 0 && ReferenceType.IsValueType)
|
|
|
{
|
|
|
var instance = Activator.CreateInstance(ReferenceType);
|
|
|
- var result = TypeConverter.ToObject(_realm, FromObject(Engine, instance));
|
|
|
-
|
|
|
- return result;
|
|
|
+ result = TypeConverter.ToObject(_realm, FromObject(Engine, instance));
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var constructors = _constructorCache.GetOrAdd(
|
|
|
+ ReferenceType,
|
|
|
+ t => MethodDescriptor.Build(t.GetConstructors(BindingFlags.Public | BindingFlags.Instance)));
|
|
|
|
|
|
- var constructors = _constructorCache.GetOrAdd(
|
|
|
- ReferenceType,
|
|
|
- t => MethodDescriptor.Build(t.GetConstructors(BindingFlags.Public | BindingFlags.Instance)));
|
|
|
+ foreach (var (method, _, _) in TypeConverter.FindBestMatch(_engine, constructors, _ => arguments))
|
|
|
+ {
|
|
|
+ var retVal = method.Call(Engine, null, arguments);
|
|
|
+ result = TypeConverter.ToObject(_realm, retVal);
|
|
|
|
|
|
- foreach (var (method, _, _) in TypeConverter.FindBestMatch(_engine, constructors, _ => arguments))
|
|
|
- {
|
|
|
- var retVal = method.Call(Engine, null, arguments);
|
|
|
- var result = TypeConverter.ToObject(_realm, retVal);
|
|
|
+ // todo: cache method info
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // todo: cache method info
|
|
|
+ if (result is not null)
|
|
|
+ {
|
|
|
+ if (result is ObjectWrapper objectWrapper)
|
|
|
+ {
|
|
|
+ // allow class extension
|
|
|
+ objectWrapper._allowAddingProperties = true;
|
|
|
+ }
|
|
|
|
|
|
return result;
|
|
|
}
|
|
@@ -127,11 +138,15 @@ namespace Jint.Runtime.Interop
|
|
|
if (_properties?.TryGetValue(key, out descriptor) != true)
|
|
|
{
|
|
|
descriptor = CreatePropertyDescriptor(key);
|
|
|
- _properties ??= new PropertyDictionary();
|
|
|
- _properties[key] = descriptor;
|
|
|
+ if (!ReferenceEquals(descriptor, PropertyDescriptor.Undefined))
|
|
|
+ {
|
|
|
+ _properties ??= new PropertyDictionary();
|
|
|
+ _properties[key] = descriptor;
|
|
|
+ return descriptor;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return descriptor;
|
|
|
+ return base.GetOwnProperty(property);
|
|
|
}
|
|
|
|
|
|
private PropertyDescriptor CreatePropertyDescriptor(string name)
|