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); }
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); }