Beispiel #1
0
        /// <summary>
        /// 初始化LuaValue对象
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaValue(LuaObjectDecoder decoder)
            : base(decoder)
        {
            int contextId = decoder.readInt32();

            _context = LuaContext.getContext(contextId);
            _tableId = decoder.readString();
            _type    = (LuaValueType)decoder.readInt16();
            _value   = null;

            switch (_type)
            {
            case LuaValueType.Integer:
                _value = decoder.readInt32();
                break;

            case LuaValueType.Boolean:
                _value = decoder.readByte();
                break;

            case LuaValueType.Number:
                _value = decoder.readDouble();
                break;

            case LuaValueType.Data:
                _value = decoder.readBytes();
                break;

            case LuaValueType.String:
                _value = decoder.readString();
                break;

            case LuaValueType.Array:
                _value = readArrayList(decoder);
                break;

            case LuaValueType.Map:
                _value = readHashtable(decoder);
                break;

            case LuaValueType.Function:
                _value = decoder.readObject() as LuaFunction;
                break;

            case LuaValueType.Ptr:
                _value = decoder.readObject() as LuaPointer;
                break;

            case LuaValueType.Tuple:
                _value = decoder.readObject() as LuaTuple;
                break;

            case LuaValueType.Object:
                _value = decoder.readObject();
                break;
            }
        }
        private static void _fieldSetter(int contextId, int classId, Int64 instancePtr, string fieldName, IntPtr valueBuffer, int bufferSize)
        {
            if (instancePtr != 0)
            {
                LuaContext         context  = LuaContext.getContext(contextId);
                LuaObjectReference objRef   = LuaObjectReference.findObject(instancePtr);
                object             instance = objRef.target;
                LuaObjectDecoder   decoder  = new LuaObjectDecoder(valueBuffer, bufferSize, context);
                LuaValue           value    = decoder.readObject() as LuaValue;


                if (_exportsProperties.ContainsKey(classId) &&
                    _exportsProperties [classId].ContainsKey(fieldName))
                {
                    PropertyInfo propertyInfo = _exportsProperties [classId] [fieldName];
                    if (instance != null && propertyInfo != null && propertyInfo.CanWrite)
                    {
                        propertyInfo.SetValue(instance, getNativeValueForLuaValue(propertyInfo.PropertyType, value), null);
                    }
                }
                else if (_exportsFields.ContainsKey(classId) &&
                         _exportsFields [classId].ContainsKey(fieldName))
                {
                    FieldInfo fieldInfo = _exportsFields [classId] [fieldName];
                    if (instance != null && fieldInfo != null)
                    {
                        fieldInfo.SetValue(instance, getNativeValueForLuaValue(fieldInfo.FieldType, value));
                    }
                }
            }
        }
        /// <summary>
        /// 解码对象
        /// </summary>
        /// <returns>对象</returns>
        /// <param name="objectPtr">表示C中的二进制数据缓冲区指针</param>
        /// <param name="size">缓冲区大小</param>
        public static object DecodeObject(IntPtr objectPtr, int size)
        {
            if (size > 0)
            {
                LuaObjectDecoder decoder = new LuaObjectDecoder(objectPtr, size);
                return(decoder.readObject());
            }

            return(null);
        }
Beispiel #4
0
        /// <summary>
        /// 获取全局变量
        /// </summary>
        /// <returns>变量值.</returns>
        /// <param name="name">变量名称.</param>
        public LuaValue getGlobal(string name)
        {
            IntPtr valuePtr = IntPtr.Zero;
            int    size     = NativeUtils.getGlobal(_nativeObjectId, name, out valuePtr);

            if (valuePtr != IntPtr.Zero && size > 0)
            {
                LuaObjectDecoder decoder = new LuaObjectDecoder(valuePtr, size, this);
                return(decoder.readObject() as LuaValue);
            }

            return(new LuaValue());
        }
Beispiel #5
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaTuple(LuaObjectDecoder decoder)
            : base(decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                for (int i = 0; i < size; i++)
                {
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (item != null)
                    {
                        _returnValues.Add(item);
                    }
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// 初始化LuaValue对象
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaValue(LuaObjectDecoder decoder)
        {
            _type  = (LuaValueType)decoder.readInt16();
            _value = null;

            switch (_type)
            {
            case LuaValueType.Integer:
                _value = decoder.readInt32();
                break;

            case LuaValueType.Boolean:
                _value = decoder.readByte();
                break;

            case LuaValueType.Number:
                _value = decoder.readDouble();
                break;

            case LuaValueType.Data:
                _value = decoder.readBytes();
                break;

            case LuaValueType.String:
                _value = decoder.readString();
                break;

            case LuaValueType.Array:
                _value = readArrayList(decoder);
                break;

            case LuaValueType.Map:
                _value = readHashtable(decoder);
                break;

            case LuaValueType.Object:
            {
                _value = decoder.readObject();
                break;
            }
            }
        }
        /// <summary>
        /// 从原生编码对象中获取参数列表
        /// </summary>
        /// <returns>参数列表.</returns>
        /// <param name="context">上下文</param>
        /// <param name="arguments">参数缓存.</param>
        /// <param name="size">缓存长度.</param>
        protected static List <LuaValue> getArgumentList(LuaContext context, IntPtr arguments, int size)
        {
            List <LuaValue> argumentsList = null;

            if (arguments != IntPtr.Zero)
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context);
                int argSize = decoder.readInt32();

                argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }
            }

            return(argumentsList);
        }
Beispiel #8
0
        /// <summary>
        /// 解析方法的参数列表
        /// </summary>
        /// <returns>参数列表</returns>
        /// <param name="context">上下文对象</param>
        /// <param name="m">方法信息</param>
        /// <param name="arguments">参数列表数据</param>
        /// <param name="size">参数列表数据长度</param>
        protected static ArrayList parseMethodParameters(LuaContext context, MethodInfo m, IntPtr arguments, int size)
        {
            List <LuaValue> argumentsList = null;

            if (arguments != IntPtr.Zero)
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context);
                int argSize = decoder.readInt32();

                argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }
            }

            ArrayList argsArr = null;

            ParameterInfo[] parameters = m.GetParameters();
            if (parameters.Length > 0 && argumentsList != null)
            {
                int i = 0;
                argsArr = new ArrayList();
                foreach (ParameterInfo p in parameters)
                {
                    if (i >= argumentsList.Count)
                    {
                        break;
                    }

                    object value = getNativeValueForLuaValue(p.ParameterType, argumentsList[i]);
                    argsArr.Add(value);

                    i++;
                }
            }

            return(argsArr);
        }
Beispiel #9
0
        /// <summary>
        /// 读取一个数组列表
        /// </summary>
        /// <returns>数组列表</returns>
        /// <param name="decoder">对象解码器</param>
        private List <LuaValue> readArrayList(LuaObjectDecoder decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                List <LuaValue> list = new List <LuaValue> ();
                for (int i = 0; i < size; i++)
                {
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (item != null)
                    {
                        list.Add(item);
                    }
                }

                return(list);
            }

            return(null);
        }
Beispiel #10
0
        /// <summary>
        /// 读取一个字典
        /// </summary>
        /// <returns>字典对象</returns>
        /// <param name="decoder">对象解码器</param>
        private Dictionary <string, LuaValue> readHashtable(LuaObjectDecoder decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                Dictionary <string, LuaValue> table = new Dictionary <string, LuaValue> ();
                for (int i = 0; i < size; i++)
                {
                    string   key  = decoder.readString();
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (key != null && item != null)
                    {
                        table.Add(key, item);
                    }
                }

                return(table);
            }

            return(null);
        }
Beispiel #11
0
        /// <summary>
        /// Lua方法处理器
        /// </summary>
        /// <returns>返回值</returns>
        /// <param name="methodName">方法名称</param>
        /// <param name="arguments">参数列表</param>
        private IntPtr luaMethodHandler(string methodName, IntPtr args, int size)
        {
            if (_methodHandlers.ContainsKey(methodName))
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(args, size);
                int argSize = decoder.readInt32();

                List <LuaValue> argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }

                LuaMethodHandler handler  = _methodHandlers [methodName];
                LuaValue         retValue = handler(argumentsList);

                if (retValue == null)
                {
                    retValue = new LuaValue();
                }

                LuaObjectEncoder encoder = new LuaObjectEncoder();
                encoder.writeObject(retValue);

                byte[] bytes = encoder.bytes;
                IntPtr retPtr;
                retPtr = Marshal.AllocHGlobal(bytes.Length);
                Marshal.Copy(bytes, 0, retPtr, bytes.Length);

                return(retPtr);
            }

            return(IntPtr.Zero);
        }