Exemplo n.º 1
0
        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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
        }