Beispiel #1
0
        public void DefineAndSet(string name, TypeBridge type, CQ_Value value)
        {
            if (values == null)
            {
                values = new Dictionary <string, CQ_Value>();
            }
            else if (values.ContainsKey(name))
            {
                throw new Exception(name + "已经定义过");
            }

            CQ_Value v = new CQ_Value();

            if (type.type != null)
            {
                v.m_type = type.type;
            }
            else if (type.stype != null)
            {
                v.m_stype = type.stype;
            }

            v.UsingValue(value);
            values[name] = v;

            int newdepth = tvalueDepth.Pop() + 1;

            tvalueDepth.Push(newdepth);
            tvalues.Push(name);
        }
Beispiel #2
0
        public CQ_Value ComputeValue(CQ_Content content)
        {
#if CQUARK_DEBUG
            content.InStack(this);
#endif

            CQ_Value v      = _expressions[0].ComputeValue(content);
            CQ_Value oldVal = CQ_Value.Null;

            if (content.values != null && content.values.ContainsKey(value_name))
            {
                oldVal = content.values[value_name];
            }
            else if (content.CallType != null && content.CallType.members.ContainsKey(value_name))
            {
                if (content.CallType.members[value_name].bStatic)
                {
                    oldVal = content.CallType.staticMemberInstance[value_name];
                }
                else
                {
                    oldVal = content.CallThis.member[value_name];
                }
            }

            oldVal.UsingValue(v);
            content.Set(value_name, oldVal);

#if CQUARK_DEBUG
            content.OutStack(this);
#endif
            return(CQ_Value.Null);
        }
Beispiel #3
0
        public void Set(string name, CQ_Value value)
        {
            if (values == null)
            {
                values = new Dictionary <string, CQ_Value>();
            }
            CQ_Value oldVal = CQ_Value.Null;
            bool     bFind  = values.TryGetValue(name, out oldVal);

            if (bFind)
            {
                //var第一次赋值类型
                if (oldVal.m_type == typeof(Type_Var.var))
                {
                    if (value.m_type != null)
                    {
                        oldVal.m_type = value.m_type;
                    }
                    else if (value.m_stype != null)
                    {
                        oldVal.m_stype = value.m_stype;
                    }
                }

                oldVal.UsingValue(value);
                values[name] = oldVal;
            }
            else
            {
                if (CallType != null)
                {
                    Class_CQuark.Member retM = Class_CQuark.Member.Null;
                    bool bRet = CallType.members.TryGetValue(name, out retM);
                    if (bRet)
                    {
                        if (retM.bStatic)
                        {
                            CQ_Value val = CallType.staticMemberInstance[name];
                            val.UsingValue(value);
                            CallType.staticMemberInstance[name] = val;
                        }
                        else
                        {
                            CQ_Value val = CallThis.member[name];
                            val.UsingValue(value);
                            CallThis.member[name] = val;
                        }
                        return;
                    }
                }
                string err = CallType.Name + "\n";
                foreach (var m in CallType.members)
                {
                    err += m.Key + ",";
                }
                throw new Exception("值没有定义过" + name + "," + err);
            }
        }
Beispiel #4
0
        public bool MemberValueSet(CQ_Content content, object object_this, string valuename, CQ_Value value)
        {
            CQ_ClassInstance sin = object_this as CQ_ClassInstance;

            if (sin.member.ContainsKey(valuename))
            {
                CQ_Value oldVal = sin.member[valuename];
                oldVal.UsingValue(value);
                sin.member[valuename] = oldVal;
                return(true);
            }
            throw new NotImplementedException();
        }
Beispiel #5
0
        public bool StaticValueSet(CQ_Content content, string valuename, CQ_Value value)
        {
            NewStatic();

            if (this.staticMemberInstance.ContainsKey(valuename))
            {
                CQ_Value oldVal = this.staticMemberInstance[valuename];
                oldVal.UsingValue(value);
                this.staticMemberInstance[valuename] = oldVal;
                return(true);
            }
            throw new NotImplementedException();
        }
        public CQ_Value ComputeValue(CQ_Content content)
        {
#if CQUARK_DEBUG
            content.InStack(this);
#endif
            CQ_Value v      = content.Get(value_name);
            IType    type   = CQuark.AppDomain.GetITypeByCQValue(v);
            CQ_Value retVal = type.Math2Value(mathop, v, CQ_Value.One);
            v.UsingValue(retVal);
            content.Set(value_name, v);

#if CQUARK_DEBUG
            content.OutStack(this);
#endif
            return(v);
        }
Beispiel #7
0
        public IEnumerator CoroutineCompute(CQ_Content content, UnityEngine.MonoBehaviour coroutine)
        {
#if CQUARK_DEBUG
            content.InStack(this);
#endif

            if (_expressions[0].hasCoroutine)
            {
                yield return(coroutine.StartCoroutine(_expressions[0].CoroutineCompute(content, coroutine)));
            }
            else
            {
                CQ_Value v      = _expressions[0].ComputeValue(content);
                CQ_Value oldVal = CQ_Value.Null;

                if (content.values != null && content.values.ContainsKey(value_name))
                {
                    oldVal = content.values[value_name];
                }
                else if (content.CallType != null && content.CallType.members.ContainsKey(value_name))
                {
                    if (content.CallType.members[value_name].bStatic)
                    {
                        oldVal = content.CallType.staticMemberInstance[value_name];
                    }
                    else
                    {
                        oldVal = content.CallThis.member[value_name];
                    }
                }

                oldVal.UsingValue(v);
                content.Set(value_name, oldVal);
            }
#if CQUARK_DEBUG
            content.OutStack(this);
#endif
        }
Beispiel #8
0
        public CQ_Value ComputeValue(CQ_Content content)
        {
#if CQUARK_DEBUG
            content.InStack(this);
#endif

            CQ_Value left  = _expressions[0].ComputeValue(content);
            CQ_Value right = _expressions[1].ComputeValue(content);
            IType    type  = CQuark.AppDomain.GetITypeByCQValue(left);

            CQ_Value val = type.Math2Value(mathop, left, right);
            //val.SetValue(left.typeBridge, type.ConvertTo(val.GetValue(), left.typeBridge));
            left.UsingValue(val);

            if (_expressions[0] is CQ_Expression_MemberValueGet)
            {
                CQ_Expression_MemberValueGet f = _expressions[0] as CQ_Expression_MemberValueGet;

                CQ_Value parent = f._expressions[0].ComputeValue(content);
                if (parent == CQ_Value.Null)
                {
                    throw new Exception("调用空对象的方法:" + f._expressions[0].ToString() + ":" + ToString());
                }

                //这几行是为了快速获取Unity的静态变量,而不需要反射
                object obj = parent.GetObject();
                if (!Wrap.MemberValueSet(parent.m_type, obj, f.membername, val))
                {
                    IType ptype = CQuark.AppDomain.GetITypeByCQValue(parent);
                    ptype._class.MemberValueSet(content, obj, f.membername, val);
                }
            }
            else if (_expressions[0] is CQ_Expression_StaticValueGet)
            {
                CQ_Expression_StaticValueGet f = _expressions[0] as CQ_Expression_StaticValueGet;

                //这几行是为了快速获取Unity的静态变量,而不需要反射
                if (!Wrap.StaticValueSet(type.typeBridge.type, f.staticmembername, val))
                {
                    f.type._class.StaticValueSet(content, f.staticmembername, val);
                }
            }
            else if (_expressions[0] is CQ_Expression_GetValue)
            {
                CQ_Expression_GetValue f = _expressions[0] as CQ_Expression_GetValue;
                content.Set(f.value_name, left);
            }
            else if (_expressions[0] is CQ_Expression_IndexGet)
            {
                CQ_Expression_IndexGet f = _expressions[0] as CQ_Expression_IndexGet;
                CQ_Value parent          = f._expressions[0].ComputeValue(content);
                object   obj             = parent.GetObject();
                CQ_Value key             = f._expressions[1].ComputeValue(content);

                IType parenttype = CQuark.AppDomain.GetITypeByCQValue(parent);
                parenttype._class.IndexSet(content, obj, key.GetObject(), left.GetObject());

                CQ_Expression_GetValue g = f._expressions[0] as CQ_Expression_GetValue;
                content.Set(g.value_name, parent);
            }



#if CQUARK_DEBUG
            content.OutStack(this);
#endif

            return(CQ_Value.Null);
        }