internal GeneralGetterManager(JsEnv jsEnv) { this.jsEnv = jsEnv; objectPool = jsEnv.objectPool; typeRegister = jsEnv.TypeRegister; genericDelegateFactory = jsEnv.genericDelegateFactory; nativeObjectTranslator = NativeObjectTranslator; arrayBufferTranslator = ArrayBufferTranslator; jsObjectTranslator = JSObjectTranslator; genericDelegateTranslator = GenericDelegateTranslator; anyTranslator = AnyTranslator; generalGetterMap[typeof(char)] = CharTranslator; generalGetterMap[typeof(sbyte)] = SbyteTranslator; generalGetterMap[typeof(byte)] = ByteTranslator; generalGetterMap[typeof(short)] = ShortTranslator; generalGetterMap[typeof(ushort)] = UshortTranslator; generalGetterMap[typeof(int)] = IntTranslator; generalGetterMap[typeof(uint)] = UintTranslator; generalGetterMap[typeof(long)] = LongTranslator; generalGetterMap[typeof(ulong)] = UlongTranslator; generalGetterMap[typeof(double)] = DoubleTranslator; generalGetterMap[typeof(float)] = FloatTranslator; //translatorMap[typeof(decimal)] = decimalTranslator; generalGetterMap[typeof(bool)] = BooleanTranslator; generalGetterMap[typeof(string)] = StringTranslator; generalGetterMap[typeof(DateTime)] = DateTranslator; generalGetterMap[typeof(ArrayBuffer)] = arrayBufferTranslator; generalGetterMap[typeof(GenericDelegate)] = genericDelegateTranslator; generalGetterMap[typeof(JSObject)] = jsObjectTranslator; generalGetterMap[typeof(object)] = anyTranslator; //special type //translatorMap[typeof(LuaTable)] = getLuaTable; //translatorMap[typeof(LuaFunction)] = getLuaFunction; }
public void RegisterGetter(Type type, GeneralGetter generalGetter) { Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { nullableTypeGeneralGetterMap.Add(underlyingType, generalGetter); } else { generalGetterMap.Add(type, generalGetter); } }
GeneralGetter MakeNullableTranslateFunc(GeneralGetter jvt) { return((IntPtr isolate, IGetValueFromJs getValueApi, IntPtr value, bool isByRef) => { if (getValueApi.GetJsValueType(isolate, value, isByRef) == JsValueType.NullOrUndefined) { return null; } else { return jvt(isolate, getValueApi, value, isByRef); } }); }
private GeneralGetter MakeTranslateFunc(Type type) { GeneralGetter fixTypeGetter = (IntPtr isolate, IGetValueFromJs getValueApi, IntPtr value, bool isByRef) => { if (getValueApi.GetJsValueType(isolate, value, isByRef) == JsValueType.NativeObject) { var objPtr = getValueApi.GetObject(isolate, value, isByRef); var obj = objectPool.Get(objPtr.ToInt32()); return((obj != null && type.IsAssignableFrom(obj.GetType())) ? obj : null); } return(null); }; if (typeof(Delegate).IsAssignableFrom(type)) { return((IntPtr isolate, IGetValueFromJs getValueApi, IntPtr value, bool isByRef) => { var jsValueType = getValueApi.GetJsValueType(isolate, value, isByRef); if (jsValueType == JsValueType.Function) { var nativePtr = getValueApi.GetFunction(isolate, value, isByRef); var result = genericDelegateFactory.Create(type, nativePtr); if (result == null) { throw new Exception("can not find delegate bridge for " + type.GetFriendlyName()); } return result; } else { return fixTypeGetter(isolate, getValueApi, value, isByRef); } }); } return(fixTypeGetter); }
public void RegisterGeneralGetSet(Type type, GeneralGetter getter, GeneralSetter setter) { GeneralGetterManager.RegisterGetter(type, getter); GeneralSetterManager.RegisterSetter(type, setter); }
public DelegateConstructWrap(Type delegateType, GeneralGetterManager generalGetterManager) { this.delegateType = delegateType; translateFunc = generalGetterManager.GetTranslateFunc(delegateType); }