public static SkAttribsModifier Create(string desc) { if (desc.Equals("0") || desc.Equals("")) { return(null); } SkAttribsModifier modifier = new SkAttribsModifier(); string[] strMods = desc.Split('#'); // use this as splitter because it is not used in expression foreach (string strMod in strMods) { string[] descOp = strMod.Split(new Char[] { ',' }, 2); switch (descOp[0].ToLower()) { case "mat": { SkAttribsOpMAT op = new SkAttribsOpMAT(descOp[1]); modifier._tmpOps.Add(op); modifier._tmpOpsIdxs.Add(op._idx); } break; case "mad": modifier._ops.Add(new SkAttribsOpMAD(descOp[1])); break; case "exp": { SkAttribsOpEXP op = new SkAttribsOpEXP(descOp[1]); if (op._bTmpOp) { modifier._tmpOps.Add(op); modifier._tmpOpsIdxs.Add(op._idx); } else { modifier._ops.Add(op); } } break; case "get": modifier._ops.Add(new SkAttribsOpGET(descOp[1])); break; case "rnd": modifier._ops.Add(new SkAttribsOpRND(descOp[1])); break; default: Debug.Log("[Error]:Unrecognized atttribModifier." + strMod); continue; } } return(modifier); }
public void Compile() { int t = Environment.TickCount; #if DBG_ExpCompile _srcCode = "public static class Func0{ public static void func(ISkAttribs caster, ISkAttribs target, ISkAttribsModPara para){ " + "caster.raws[0] += target.sums[0];" + "caster.sums[0] += target.raws[0];" + "caster.raws[1] += target.sums[1];" + "caster.sums[1] += target.raws[1];" + //"caster.pack += 12;" + "caster.mask[0] = true;" + "}}"; Assembly asm0 = CompileExpressionToMethod(_srcCode); _reqs[0].OnCompiled(asm0); bool[] masks = new bool[32]; masks[0] = true; masks[1] = false; SkAttribsOpEXP op = (SkAttribsOpEXP)_reqs[0]; SkAttribs casterBaseAttrib = new SkAttribs(); SkAttribs casterAttrib = new SkAttribs(casterBaseAttrib, masks); SkAttribs targetBaseAttrib = new SkAttribs(); SkAttribs targetAttrib = new SkAttribs(casterBaseAttrib, masks); op.Exec(targetAttrib, casterAttrib, targetAttrib, null); #else Assembly asm = CompileExpressionToMethod(_srcCode); int n = _reqs.Count; for (int i = 0; i < n; i++) { MethodInfo method = asm.GetType("Func" + i).GetMethod("func"); System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara> action = (System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara>)Delegate.CreateDelegate(typeof(System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara>), null, method); _reqs[i].OnCompiled(action); } #endif Debug.Log("[EXP]All Compiled:" + (Environment.TickCount - t)); _reqs.Clear(); _srcCode = ""; }