コード例 #1
0
    public static object Execute(ELEMENT i_e, xmlScriptObj scrObj, STACKVAL stack)
    {
        if (i_e == null || i_e.isNONE())
        {
            return(null);
        }

        ELEMENT e = i_e;
        object  o;

        if (e.isSENTENCE())
        {
            e = e.GetListElement(0);
        }

        if (e.isNUMBER())
        {
            double x = 0;
            double.TryParse(e.raw, out x);
            return(x);
        }
        else if (e.isQUOTE())
        {
            return(e.raw);
        }
        else if (e.isNULL())
        {
            return(null);
        }
        else if (e.isBLOCK_M())
        {
            o = null;
            stack.PushStack();
            var l = e.list;
            if (l != null)
            {
                foreach (var s in l)
                {
                    if (s.isSENTENCE())
                    {
                        o = Execute(s.list[0], scrObj, stack);
                        if (o != null && xmlScriptGetMethod.ObjectGetType(o) == typeof(SENTENCE_STATE))
                        {
                            if (((SENTENCE_STATE)o).state != SENTENCE_STATE.STATE.NONE)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            stack.PopStack();
            return(o);
        }
        else if (e.isBLOCK_L())
        {
            return(xmlScriptArray.CreateArray(e, scrObj, stack));
        }
        else if (e.isBLOCK_C())
        {
            if (e.list == null || e.list.Count == 0)
            {
                return(null);
            }
            o = null;
            foreach (var s in e.list)
            {
                o = Execute(s, scrObj, stack);
            }
            return(o);
        }

        else if (Execute_Func_Pointer_Variable(e, scrObj, stack, out o))
        {
            return(o);
        }
        else if (e.isRETURN())
        {
            var ss = new SENTENCE_STATE();
            ss.state = SENTENCE_STATE.STATE.RETURN;
            ss.ret   = Execute(e.GetListElement(0), scrObj, stack);

            return(ss);
        }
        else if (e.isDEC_VAR())
        {
            stack.DeclareLocalVal(e.decname);
            return(e.decname);
        }
        else if (e.isOP())
        {
            if (e.group == GROUP.op_Assign)
            {
                var p0   = e.GetListElement(0);
                var p1   = e.GetListElement(1);
                var o_p1 = Execute(p1, scrObj, stack);


                if (p0.isVARIABLE())
                {
                    bool b = xmlScriptExecVar.ExecuteSetVariable(p0, o_p1, scrObj, stack);//  stack.SetVal(p0.raw, o_p1);
                    if (!b)
                    {
                        stack.SetGlobalVal(p0.raw, o_p1);
                    }
                }
                else if (p0.isPOINTER())
                {
                    xmlScriptExecPointer.ExecuteSetPointer(p0, o_p1, scrObj, stack);
                }
                else if (p0.isDEC_VAR())
                {
                    stack.SetVal((string)Execute(p0, scrObj, stack), o_p1);
                }
                return(null);
            }
            else
            {
                o = Execute_OP(e, scrObj, stack);

                if (e.group == GROUP.op_Increment_R || e.group == GROUP.op_Decrement_R)
                {
                    var p0 = e.GetListElement(0);
                    if (p0.isVARIABLE())
                    {
                        if (xmlScriptGetMethod.ObjectGetType(o) == typeof(double))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (double)o + 1, scrObj, stack); break; //stack.SetVal(p0.raw, (int)o + 1); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (double)o - 1, scrObj, stack); break; // stack.SetVal(p0.raw, (int)o - 1); break;
                            }
                        }
                        else if (xmlScriptGetMethod.ObjectGetType(o) == typeof(int))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (int)o + 1, scrObj, stack); break; //stack.SetVal(p0.raw, (int)o + 1); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (int)o - 1, scrObj, stack); break; // stack.SetVal(p0.raw, (int)o - 1); break;
                            }
                        }
                        else if (xmlScriptGetMethod.ObjectGetType(o) == typeof(float))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (float)o + 1.0f, scrObj, stack); break; //  stack.SetVal(p0.raw, (float)o + 1.0f); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (float)o - 1.0f, scrObj, stack); break; //stack.SetVal(p0.raw, (float)o - 1.0f); break;
                            }
                        }
                    }
                }
                return(o);
            }
        }
        else if (Execute_FlowControl(e, scrObj, stack, out o))
        {
            return(o);
        }
        else if (e.isNEW())
        {
            ELEMENT last = e.GetListElement(0).GetPointerLast();
            if (!last.isFUNCTION())
            {
                throw new SystemException("ERROR NEW EXPECTED () ");
            }

            object[] args = last.GetListElement(0).GetListCount() > 0 ? new object[last.GetListElement(0).GetListCount()] : null;
            for (int i = 0; i < last.GetListElement(0).GetListCount(); i++)
            {
                args[i] = Execute(last.GetListElement(0).GetListElement(i), scrObj, stack);
            }

            return(xmlScriptReflection.CreateNewObject(e.GetListElement(0), args, scrObj, stack));
        }
        else if (e.isDELETE())
        {
            var p_o = Execute(e.GetListElement(0), scrObj, stack);
            if (p_o is UnityEngine.Object)
            {
                UnityEngine.Object.Destroy((UnityEngine.Object)p_o);
            }
            else if (p_o is System.IDisposable)
            {
                ((System.IDisposable)p_o).Dispose();
            }
            //ELEMENT last;
            //var pointerstr = GetPointerToString(e.GetListElement(0), out last);
            //TBD
        }
        return(null);
    }
コード例 #2
0
    public static bool ExecuteSetVariable(ELEMENT e, object val, xmlScriptObj scrObj, STACKVAL stack)
    {
        if (!e.isVARIABLE())
        {
            return(false);
        }
        if (e.isVARIABLE_NOTARRAY())
        {
            return(stack.SetVal(e.raw, val));
        }

        if (e.GetListCount() == 1)
        {
            var index = xmlScriptArray.GetArrayIndex(e.GetListElement(0), scrObj, stack); //Debug.LogError("index = " + index);
            var array = stack.GetVal(e.raw);
            if (array == null)
            {
                array = new xmlScriptJS.Array();
            }
            //Debug.LogError("array = " + array);
            if (xmlScriptGetMethod.ObjectGetType(array) == typeof(xmlScriptJS.Array))
            {
                ((xmlScriptJS.Array)array).Set(index, val);
                if (!stack.isExist(e.raw))
                {
                    stack.SetGlobalVal(e.raw, array);
                }
                else
                {
                    stack.SetVal(e.raw, array);
                }
                //Debug.Log("array1 = " + array);
                //Debug.Log("array2 = " + stack.GetVal(e.raw));
            }
        }
        else
        {
            object[] indexList = new object[e.GetListCount()];
            for (int i = 0; i < e.GetListCount(); i++)
            {
                indexList[i] = xmlScriptArray.GetArrayIndex(e.GetListElement(i), scrObj, stack);
            }
            var array = stack.GetVal(e.raw);
            if (array == null)
            {
                array = new xmlScriptJS.Array();
            }
            if (array != null && xmlScriptGetMethod.ObjectGetType(array) == typeof(xmlScriptJS.Array))
            {
                xmlScriptJS.Array.SetMultidimension(array, indexList, val);
                if (!stack.isExist(e.raw))
                {
                    stack.SetGlobalVal(e.raw, array);
                }
                else
                {
                    stack.SetVal(e.raw, array);
                }
            }
        }
        return(true);
    }