示例#1
0
        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;
        }
示例#2
0
        public void RegisterGetter(Type type, GeneralGetter generalGetter)
        {
            Type underlyingType = Nullable.GetUnderlyingType(type);

            if (underlyingType != null)
            {
                nullableTypeGeneralGetterMap.Add(underlyingType, generalGetter);
            }
            else
            {
                generalGetterMap.Add(type, generalGetter);
            }
        }
示例#3
0
 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);
         }
     });
 }
示例#4
0
        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);
        }
示例#5
0
 public void RegisterGeneralGetSet(Type type, GeneralGetter getter, GeneralSetter setter)
 {
     GeneralGetterManager.RegisterGetter(type, getter);
     GeneralSetterManager.RegisterSetter(type, setter);
 }
示例#6
0
 public DelegateConstructWrap(Type delegateType, GeneralGetterManager generalGetterManager)
 {
     this.delegateType = delegateType;
     translateFunc     = generalGetterManager.GetTranslateFunc(delegateType);
 }