public override void Put(string propertyName, JsValue value, bool throwOnError) { if (!CanPut(propertyName)) { if (throwOnError) { throw new JavaScriptException(Engine.TypeError); } } else { var ownProperty = GetOwnProperty(propertyName); if (ownProperty.IsDataDescriptor()) { ownProperty.Value = value; } else { PropertyDescriptor property = GetProperty(propertyName); if (property.IsAccessorDescriptor()) { property.Set.TryCast <ICallable>().Call(new JsValue(this), new JsValue[1] { value }); } else if (_indexPropertyStr != null) { var val = _converter.ConvertToObject(value, _indexPropertyStr.PropertyType); _indexPropertyStr.SetValue(Target, val, new object[] { propertyName }); } else if (_indexPropertyUlong != null && ulong.TryParse(propertyName, out var uLongIndex)) { var val = _converter.ConvertToObject(value, _indexPropertyUlong.PropertyType); _indexPropertyUlong.SetValue(Target, val, new object[] { uLongIndex }); } else if (_indexPropertyInt != null && int.TryParse(propertyName, out var intIndex)) { var val = _converter.ConvertToObject(value, _indexPropertyInt.PropertyType); _indexPropertyInt.SetValue(Target, val, new object[] { intIndex }); } else if (_indexPropertyObject != null) { var val = _converter.ConvertToObject(value, _indexPropertyObject.PropertyType); _indexPropertyObject.SetValue(Target, val, new object[] { propertyName }); } else { var desc = new PropertyDescriptor(value, true, true, true); DefineOwnProperty(propertyName, desc, throwOnError); } } } }
public void AddGlobalType(string jsTypeName, object owner, MethodInfo ctorMethod) { var type = ctorMethod.ReturnType; var jsCtor = new ClrFuncCtor(type, _engine, args => { //todo: create executor from methodInfo var clrArgs = ctorMethod.GetParameters().Select((parameterInfo, i) => i < args.Length && args[i].CanConvert(parameterInfo.ParameterType) ? _typeConverter.ConvertToObject(args[i], parameterInfo.ParameterType) : parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : parameterInfo.ParameterType.IsValueType ? Activator.CreateInstance(parameterInfo.ParameterType) : null).ToArray(); var obj = ctorMethod.Invoke(owner, clrArgs); _typeConverter.TryConvert(obj, out var res); return(res.AsObject()); }, _typeConverter.GetPrototype(type)); _engine.Global.FastAddProperty(jsTypeName, jsCtor, false, false, false); }