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); } }
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); }