public CLS_Content Clone() { CLS_Content content = CLS_Content.NewContent(environment); content.CallThis = this.CallThis; content.CallType = this.CallType; foreach (var pair in this.dictValues) { content.dictValues.Add(pair.Key, pair.Value); } return(content); }
public ICLS_Expression Optimize(ICLS_Expression value, ICLS_Environment env) { ICLS_Expression expr = value as ICLS_Expression; if (expr == null) { return(value); } else { return(OptimizeDepth(expr, CLS_Content.NewContent(env))); } }
public override Delegate CreateDelegate(ICLS_Environment env, DeleFunction delefunc) { Delegate _dele = delefunc.cacheFunction(null); if (_dele != null) { return(_dele); } var func = delefunc.calltype.functions[delefunc.function]; Action <T, T1, T2> dele; if (func.expr_runtime != null) { dele = (T param0, T1 param1, T2 param2) => { CLS_Content content = CLS_Content.NewContent(env); #if UNITY_EDITOR try{ #endif content.CallThis = delefunc.callthis; content.CallType = delefunc.calltype; content.DefineAndSet(func._paramnames[0], func._paramtypes[0].type, param0); content.DefineAndSet(func._paramnames[1], func._paramtypes[1].type, param1); content.DefineAndSet(func._paramnames[2], func._paramtypes[2].type, param2); func.expr_runtime.ComputeValue(content); CLS_Content.PoolContent(content); #if UNITY_EDITOR }catch (System.Exception ex) { content.environment.logger.Log_Error(ex.Message + "\n" + content.DumpStack() + ex); } #endif }; } else { dele = (T param0, T1 param1, T2 param2) => { }; } if (this.sysType != typeof(Action <T, T1, T2>)) { _dele = Delegate.CreateDelegate(this.sysType, dele.Target, dele.Method); } else { _dele = dele; } return(delefunc.cacheFunction(_dele)); }
public override Delegate CreateDelegate(ICLS_Environment env, DeleFunction delefunc) { Delegate _dele = delefunc.cacheFunction(null); if (_dele != null) { return(_dele); } var func = delefunc.calltype.functions[delefunc.function]; NonVoidDelegate dele; if (func.expr_runtime != null) { dele = delegate(T param, T1 param1) { CLS_Content content = CLS_Content.NewContent(env); #if UNITY_EDITOR try{ #endif content.CallThis = delefunc.callthis; content.CallType = delefunc.calltype; content.DefineAndSet(func._paramnames[0], func._paramtypes[0].type, param); content.DefineAndSet(func._paramnames[1], func._paramtypes[1].type, param1); CLS_Content.Value retValue = func.expr_runtime.ComputeValue(content); CLS_Content.PoolContent(content); return((ReturnType)retValue.value); #if UNITY_EDITOR }catch (System.Exception ex) { content.environment.logger.Log_Error(ex.Message + "\n" + content.DumpStack() + ex); return(default(ReturnType)); } #endif }; } else { dele = delegate(T param, T1 param1) { return(default(ReturnType)); }; } _dele = Delegate.CreateDelegate(this.type, dele.Target, dele.Method); return(delefunc.cacheFunction(_dele)); }
public CLS_Content CreateContent() { return(CLS_Content.NewContent(this)); }
public CLS_Content.Value New(CLS_Content content, BetterList <CLS_Content.Value> _params) { if (staticMemberContent == null) { NewStatic(content.environment); } SInstance scriptInstance = new SInstance(); scriptInstance.type = this; foreach (var pair in this.members) { Member member = pair.Value; if (!member.bStatic) { CLS_Content.Value val = new CLS_Content.Value(); val.type = member.type.type; if (member.expr_defvalue == null) { val.value = member.type.DefValue; } else { CLS_Content.Value value = member.expr_defvalue.ComputeValue(staticMemberContent); if (member.type.type != value.type) { val.value = content.environment.GetType(value.type).ConvertTo(content, value.value, member.type.type); } else { val.value = value.value; } } scriptInstance.member[pair.Key] = val; } } CLS_Content.Value thisVal = new CLS_Content.Value() { type = this, value = scriptInstance }; // 加入this关键字 scriptInstance.member["this"] = thisVal; // 加入base关键字 if (BaseType != null) { scriptInstance.member["base"] = new CLS_Content.Value() { type = BaseType, value = scriptInstance, breakBlock = 255 } } ; // 调用构造函数 if (this.functions.ContainsKey(this.Name)) { MemberCall(content, scriptInstance, this.Name, _params); } return(thisVal); } void NewStatic(ICLS_Environment env) { staticMemberContent = CLS_Content.NewContent(env); staticMemberValues = new Dictionary <string, CLS_Content.Value>(); // 先初始化基类静态数据 if (BaseType != null) { BaseType.NewStatic(env); // 拷贝基类的静态数据 foreach (var pair in BaseType.staticMemberValues) { staticMemberValues.Add(pair.Key, pair.Value); } } // 添加自身的静态成员数据 foreach (var pair in this.members) { if (pair.Value.bStatic && !staticMemberValues.ContainsKey(pair.Key)) { CLS_Content.Value val = new CLS_Content.Value(); val.type = pair.Value.type.type; if (pair.Value.expr_defvalue == null) { val.value = pair.Value.type.DefValue; } else { CLS_Content.Value value = pair.Value.expr_defvalue.ComputeValue(staticMemberContent); if (pair.Value.type.type != value.type) { val.value = env.GetType(value.type).ConvertTo(staticMemberContent, value.value, pair.Value.type.type); } else { val.value = value.value; } } staticMemberValues[pair.Key] = val; } } }
public CLS_Content.Value MemberCall(CLS_Content contentParent, object object_this, string func, BetterList <CLS_Content.Value> _params, bool isBaseCall = false) { SInstance callThis = object_this as SInstance; // 成员函数判断 Function fun; if (this.functions.TryGetValue(func, out fun)) { #if UNITY_EDITOR if (fun.bStatic) { throw new Exception("不能通过实例来调用静态函数: " + this.Name + "." + func); } #endif CLS_Content.Value value = null; SType callType = this; if (isBaseCall) { SType tempType = contentParent.CallType.BaseType; SType.Function tempFun; while (tempType != null) { if (tempType.functions.TryGetValue(func, out tempFun)) { if (tempFun.ownerType == null || tempFun.ownerType == tempType) { callType = tempType; fun = tempFun; break; } } tempType = tempType.BaseType; } } else { if (callType != callThis.type) { SType tempType = callThis.type; Function tempFun; while (tempType != null) { if (tempType.functions.TryGetValue(func, out tempFun)) { if (tempFun.ownerType == null || tempFun.ownerType == tempType) { callType = tempType; fun = tempFun; break; } } tempType = tempType.BaseType; } } else if (fun.ownerType != null && fun.ownerType != callType) { callType = fun.ownerType; } } if (fun.expr_runtime != null) { CLS_Content content = CLS_Content.NewContent(contentParent.environment); #if UNITY_EDITOR contentParent.InStackContent(content);//把这个上下文推给上层的上下文,这样如果崩溃是可以一层层找到原因的 #endif content.CallType = callType; content.CallThis = callThis; for (int i = 0, count = fun._paramtypes.Count; i < count; i++) { content.DefineAndSet(fun._paramnames[i], fun._paramtypes[i].type, _params[i].value); } value = fun.expr_runtime.ComputeValue(content); if (value != null) { value.breakBlock = 0; } #if UNITY_EDITOR contentParent.OutStackContent(content); #endif CLS_Content.PoolContent(content); } return(value); } // 委托判断 CLS_Content.Value mDeleVal; if (callThis.member.TryGetValue(func, out mDeleVal)) { Delegate dele = mDeleVal.value as Delegate; if (dele != null) { CLS_Content.Value value = new CLS_Content.Value(); value.type = null; object[] objs = CLS_Content.ParamObjsArray[_params.size]; for (int i = 0; i < _params.size; i++) { objs[i] = _params[i].value; } value.value = dele.DynamicInvoke(objs); if (value.value != null) { value.type = value.value.GetType(); } value.breakBlock = 0; return(value); } } throw new NotImplementedException("未实现成员函数: " + this.Name + "." + func); }
public CLS_Content.Value StaticCall(CLS_Content contentParent, string func, BetterList <CLS_Content.Value> _params) { if (staticMemberContent == null) { NewStatic(contentParent.environment); } // 静态函数判断 Function fun; if (this.functions.TryGetValue(func, out fun)) { #if UNITY_EDITOR if (!fun.bStatic) { throw new Exception("成员函数必须通过实例来调用: " + this.Name + "." + func); } #endif CLS_Content.Value value = null; if (fun.expr_runtime != null) { CLS_Content content = CLS_Content.NewContent(contentParent.environment); #if UNITY_EDITOR contentParent.InStackContent(content);//把这个上下文推给上层的上下文,这样如果崩溃是可以一层层找到原因的 #endif content.CallType = this; content.CallThis = null; for (int i = 0, count = fun._paramtypes.Count; i < count; i++) { content.DefineAndSet(fun._paramnames[i], fun._paramtypes[i].type, _params[i].value); } value = fun.expr_runtime.ComputeValue(content); if (value != null) { value.breakBlock = 0; } #if UNITY_EDITOR contentParent.OutStackContent(content); #endif CLS_Content.PoolContent(content); } return(value); } // 委托判断 CLS_Content.Value smDeleVal; if (this.staticMemberValues.TryGetValue(func, out smDeleVal)) { Delegate dele = smDeleVal.value as Delegate; if (dele != null) { CLS_Content.Value value = new CLS_Content.Value(); value.type = null; object[] objs = CLS_Content.ParamObjsArray[_params.size]; for (int i = 0; i < _params.size; i++) { objs[i] = _params[i].value; } value.value = dele.DynamicInvoke(objs); if (value.value != null) { value.type = value.value.GetType(); } value.breakBlock = 0; return(value); } } throw new NotImplementedException("未实现静态函数: " + this.Name + "." + func); }