Beispiel #1
0
        public JurassicJsEngine(object global)
        {
            _typeConverter = new ClrTypeConverter(new ScriptEngine(), () => _global);

            if (global != null)
            {
	            _global = global;
	            Engine.Global.DefineProperties(_typeConverter, global.GetType(), global);
	            foreach (var method in _global.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance))
	            {
		            var ctor = method.GetCustomAttribute<JsCtorAttribute>();
		            if(ctor == null)
			            continue;

		            var paramConverter = ClrTypeConverter.GetParamsConverter(_typeConverter, method.GetParameters());
		            
		            var prototype = _typeConverter.GetPrototype(method.ReturnType);
		            var jsCtor = new ClrCtor(_typeConverter, method.ReturnType, prototype, ctor.Name, args =>
		            {
			            var clrArgs = paramConverter(Engine.Global, args);
			            return method.Invoke(global, clrArgs);
		            });
            
		            _typeConverter.Engine.SetGlobalValue(ctor.Name, jsCtor);
	            }
            }
        }
        public override object CallLateBound(object thisObject, params object[] argumentValues)
        {
            var clrObject = thisObject is Undefined ? _owner : _ctx.ConvertToClr(thisObject);

            var methodIndex = _methods.IndexOf(x => x.GetParameters().IsAppropriate(argumentValues));

            if (methodIndex < 0)
            {
                return(null); //or throw exception;
            }
            var method = _methods[methodIndex];

            var converter = _paramConverters[methodIndex] ?? (_paramConverters[methodIndex] =
                                                                  ClrTypeConverter.GetParamsConverter(_ctx, method.GetParameters()));

            var clrArguments = converter(thisObject, argumentValues);

            try
            {
                var clrResult = method.Invoke(clrObject, clrArguments);
                return(_ctx.ConvertToJs(clrResult));
            }
            catch (Exception e)
            {
                throw new JavaScriptException(_ctx.Engine, ErrorType.Error, e.Message, e);
            }
        }
Beispiel #3
0
        public ClrMethodInstance(ClrTypeConverter ctx, object owner, MethodInfo method, string name) : base(ctx.Engine)
        {
            _ctx             = ctx;
            _owner           = owner;
            _method          = method;
            _paramsConverter = ClrTypeConverter.GetParamsConverter(_ctx, _method.GetParameters());

            SetPropertyValue("name", name, false);
        }