public Parameters(ParameterInfo[] parameterInfos, GeneralGetterManager generalGetterManager, GeneralSetterManager generalSetterManager) { this.generalGetterManager = generalGetterManager; length = parameterInfos.Length; typeMasks = new JsValueType[parameterInfos.Length]; types = new Type[parameterInfos.Length]; args = new object[parameterInfos.Length]; argsTranslateFuncs = new GeneralGetter[parameterInfos.Length]; byRefValueSetFuncs = new GeneralSetter[parameterInfos.Length]; byRef = new bool[parameterInfos.Length]; isOut = new bool[parameterInfos.Length]; for (int i = 0; i < parameterInfos.Length; i++) { var parameterInfo = parameterInfos[i]; var parameterType = parameterInfo.ParameterType; if (parameterInfo.IsDefined(typeof(ParamArrayAttribute), false)) { parameterType = parameterType.GetElementType(); hasParamArray = true; } types[i] = parameterType; typeMasks[i] = GeneralGetterManager.GetJsTypeMask(parameterType); argsTranslateFuncs[i] = generalGetterManager.GetTranslateFunc(parameterType); byRef[i] = parameterType.IsByRef; if (parameterType.IsByRef) { byRefValueSetFuncs[i] = generalSetterManager.GetTranslateFunc(parameterType.GetElementType()); } isOut[i] = parameterType.IsByRef && parameterInfo.IsOut && !parameterInfo.IsIn; } }
public JsEnv(ILoader loader, int port = -1) { //PuertsDLL.SetLogCallback(LogCallback, LogWarningCallback, LogErrorCallback); this.loader = loader; isolate = PuertsDLL.CreateJSEngine(); lock (jsEnvs) { Idx = -1; for (int i = 0; i < jsEnvs.Count; i++) { if (jsEnvs[i] == null) { Idx = i; jsEnvs[Idx] = this; break; } } if (Idx == -1) { Idx = jsEnvs.Count; jsEnvs.Add(this); } } objectPool = new ObjectPool(); TypeRegister = new TypeRegister(this); GeneralGetterManager = new GeneralGetterManager(this); GeneralSetterManager = new GeneralSetterManager(this); PuertsDLL.SetGeneralDestructor(isolate, StaticCallbacks.GeneralDestructor); TypeRegister.InitArrayTypeId(isolate); PuertsDLL.SetGlobalFunction(isolate, "__tgjsRegisterTickHandler", StaticCallbacks.JsEnvCallbackWrap, AddCallback(RegisterTickHandler)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsLoadType", StaticCallbacks.JsEnvCallbackWrap, AddCallback(LoadType)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsGetLoader", StaticCallbacks.JsEnvCallbackWrap, AddCallback(GetLoader)); var autoRegister = Type.GetType("PuertsStaticWrap.AutoStaticCodeRegister", false); if (autoRegister != null) { var methodInfoOfRegister = autoRegister.GetMethod("Register"); methodInfoOfRegister.Invoke(null, new object[] { this }); } if (port != -1) { PuertsDLL.CreateInspector(isolate, port); } ExecuteFile("puerts/init.js"); ExecuteFile("puerts/log.js"); ExecuteFile("puerts/cjsload.js"); ExecuteFile("puerts/modular.js"); ExecuteFile("puerts/csharp.js"); ExecuteFile("puerts/timer.js"); }
// 供struct的无参默认构造函数使用 public OverloadReflectionWrap(Type type, GeneralGetterManager generalGetterManager) { ParameterInfo[] info = { }; parameters = new Parameters(info, generalGetterManager, null); this.generalGetterManager = generalGetterManager; this.type = type; }
public OverloadReflectionWrap(MethodBase methodBase, GeneralGetterManager generalGetterManager, GeneralSetterManager generalSetterManager) { parameters = new Parameters(methodBase.GetParameters(), generalGetterManager, generalSetterManager); this.generalGetterManager = generalGetterManager; if (methodBase.IsConstructor) { constructorInfo = methodBase as ConstructorInfo; } else { methodInfo = methodBase as MethodInfo; resultSetter = generalSetterManager.GetTranslateFunc(methodInfo.ReturnType); } }
public OverloadReflectionWrap(MethodBase methodBase, GeneralGetterManager generalGetterManager, GeneralSetterManager generalSetterManager, bool extensionMethod = false) { parameters = new Parameters(methodBase.GetParameters().Skip(extensionMethod ? 1 : 0).ToArray(), generalGetterManager, generalSetterManager); this.generalGetterManager = generalGetterManager; this.extensionMethod = extensionMethod; if (methodBase.IsConstructor) { constructorInfo = methodBase as ConstructorInfo; } else { methodInfo = methodBase as MethodInfo; resultSetter = generalSetterManager.GetTranslateFunc(methodInfo.ReturnType); } }
private FunctionCallback GenFieldSetter(Type type, FieldInfo field) { var translateFunc = jsEnv.GeneralGetterManager.GetTranslateFunc(field.FieldType); var typeMask = GeneralGetterManager.GetJsTypeMask(field.FieldType); if (field.IsStatic) { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { field.SetValue(null, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } else { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { var me = jsEnv.GeneralGetterManager.GetSelf(self); field.SetValue(me, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } }
public JsEnv(ILoader loader, int debugPort = -1) { const int libVersionExpect = 7; int libVersion = PuertsDLL.GetLibVersion(); if (libVersion != libVersionExpect) { throw new InvalidProgramException("expect lib version " + libVersionExpect + ", but got " + libVersion); } //PuertsDLL.SetLogCallback(LogCallback, LogWarningCallback, LogErrorCallback); this.loader = loader; isolate = PuertsDLL.CreateJSEngine(); lock (jsEnvs) { Idx = -1; for (int i = 0; i < jsEnvs.Count; i++) { if (jsEnvs[i] == null) { Idx = i; jsEnvs[Idx] = this; break; } } if (Idx == -1) { Idx = jsEnvs.Count; jsEnvs.Add(this); } } objectPool = new ObjectPool(); TypeRegister = new TypeRegister(this); GeneralGetterManager = new GeneralGetterManager(this); GeneralSetterManager = new GeneralSetterManager(this); PuertsDLL.SetGeneralDestructor(isolate, StaticCallbacks.GeneralDestructor); TypeRegister.InitArrayTypeId(isolate); PuertsDLL.SetGlobalFunction(isolate, "__tgjsRegisterTickHandler", StaticCallbacks.JsEnvCallbackWrap, AddCallback(RegisterTickHandler)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsLoadType", StaticCallbacks.JsEnvCallbackWrap, AddCallback(LoadType)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsGetNestedTypes", StaticCallbacks.JsEnvCallbackWrap, AddCallback(GetNestedTypes)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsGetLoader", StaticCallbacks.JsEnvCallbackWrap, AddCallback(GetLoader)); //可以DISABLE掉自动注册,通过手动调用PuertsStaticWrap.AutoStaticCodeRegister.Register(jsEnv)来注册 #if !DISABLE_AUTO_REGISTER const string AutoStaticCodeRegisterClassName = "PuertsStaticWrap.AutoStaticCodeRegister"; var autoRegister = Type.GetType(AutoStaticCodeRegisterClassName, false); if (autoRegister == null) { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { autoRegister = assembly.GetType(AutoStaticCodeRegisterClassName, false); if (autoRegister != null) { break; } } } if (autoRegister != null) { var methodInfoOfRegister = autoRegister.GetMethod("Register"); methodInfoOfRegister.Invoke(null, new object[] { this }); } #endif if (debugPort != -1) { PuertsDLL.CreateInspector(isolate, debugPort); } ExecuteFile("puerts/init.js"); ExecuteFile("puerts/log.js"); ExecuteFile("puerts/cjsload.js"); ExecuteFile("puerts/modular.js"); ExecuteFile("puerts/csharp.js"); ExecuteFile("puerts/timer.js"); ExecuteFile("puerts/events.js"); ExecuteFile("puerts/promises.js"); ExecuteFile("puerts/polyfill.js"); }
public DelegateConstructWrap(Type delegateType, GeneralGetterManager generalGetterManager) { this.delegateType = delegateType; translateFunc = generalGetterManager.GetTranslateFunc(delegateType); }
public JsEnv(ILoader loader, int debugPort, IntPtr externalRuntime, IntPtr externalContext) { const int libVersionExpect = 14; int libVersion = PuertsDLL.GetLibVersion(); if (libVersion != libVersionExpect) { throw new InvalidProgramException("expect lib version " + libVersionExpect + ", but got " + libVersion); } // PuertsDLL.SetLogCallback(LogCallback, LogWarningCallback, LogErrorCallback); this.loader = loader; if (externalRuntime != IntPtr.Zero) { isolate = PuertsDLL.CreateJSEngineWithExternalEnv(externalRuntime, externalContext); } else { isolate = PuertsDLL.CreateJSEngine(); } if (isolate == IntPtr.Zero) { throw new InvalidProgramException("create jsengine fail"); } lock (jsEnvs) { Idx = -1; for (int i = 0; i < jsEnvs.Count; i++) { if (jsEnvs[i] == null) { Idx = i; jsEnvs[Idx] = this; break; } } if (Idx == -1) { Idx = jsEnvs.Count; jsEnvs.Add(this); } } objectPool = new ObjectPool(); TypeRegister = new TypeRegister(this); genericDelegateFactory = new GenericDelegateFactory(this); jsObjectFactory = new JSObjectFactory(); GeneralGetterManager = new GeneralGetterManager(this); GeneralSetterManager = new GeneralSetterManager(this); // 注册JS对象通用GC回调 PuertsDLL.SetGeneralDestructor(isolate, StaticCallbacks.GeneralDestructor); TypeRegister.InitArrayTypeId(isolate); // 把JSEnv的id和Callback的id拼成一个long存起来,并将StaticCallbacks.JsEnvCallbackWrap注册给V8。而后通过StaticCallbacks.JsEnvCallbackWrap从long中取出函数和envid并调用。 PuertsDLL.SetGlobalFunction(isolate, "__tgjsRegisterTickHandler", StaticCallbacks.JsEnvCallbackWrap, AddCallback(RegisterTickHandler)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsLoadType", StaticCallbacks.JsEnvCallbackWrap, AddCallback(LoadType)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsGetNestedTypes", StaticCallbacks.JsEnvCallbackWrap, AddCallback(GetNestedTypes)); PuertsDLL.SetGlobalFunction(isolate, "__tgjsGetLoader", StaticCallbacks.JsEnvCallbackWrap, AddCallback(GetLoader)); //可以DISABLE掉自动注册,通过手动调用PuertsStaticWrap.AutoStaticCodeRegister.Register(jsEnv)来注册 #if !DISABLE_AUTO_REGISTER const string AutoStaticCodeRegisterClassName = "PuertsStaticWrap.AutoStaticCodeRegister"; var autoRegister = Type.GetType(AutoStaticCodeRegisterClassName, false); if (autoRegister == null) { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { autoRegister = assembly.GetType(AutoStaticCodeRegisterClassName, false); if (autoRegister != null) { break; } } } if (autoRegister != null) { var methodInfoOfRegister = autoRegister.GetMethod("Register"); methodInfoOfRegister.Invoke(null, new object[] { this }); } #endif if (debugPort != -1) { PuertsDLL.CreateInspector(isolate, debugPort); } bool isNode = PuertsDLL.GetLibBackend() == 1; ExecuteFile("puerts/init.js"); ExecuteFile("puerts/log.js"); ExecuteFile("puerts/cjsload.js"); ExecuteFile("puerts/modular.js"); ExecuteFile("puerts/csharp.js"); ExecuteFile("puerts/timer.js"); ExecuteFile("puerts/events.js"); ExecuteFile("puerts/promises.js"); #if !PUERTS_GENERAL if (!isNode) { #endif ExecuteFile("puerts/polyfill.js"); #if !PUERTS_GENERAL } else { ExecuteFile("puerts/nodepatch.js"); } #endif #if UNITY_EDITOR if (OnJsEnvCreate != null) { OnJsEnvCreate(this, loader, debugPort); } this.debugPort = debugPort; #endif }