public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { if (argements[0].rtType == RunTimeDataType.rt_null) { success = false; stackframe.throwArgementException(token,"参数elementType不能为null"); return; } Class _arraylist_ = ((ASBinCode.rtData.rtObjectBase)thisObj).value._class; var arr = stackframe.player.alloc_pureHostedOrLinkedObject(_arraylist_.instanceClass); LinkSystemObject linkobj = (LinkSystemObject)arr.value; try { object lo; if (stackframe.player.linktypemapper.rtValueToLinkObject( argements[0], stackframe.player.linktypemapper.getLinkType( functionDefine.signature.parameters[0].type ), bin,true,out lo )) { linkobj.SetLinkData(new ArrayList((ICollection)lo)); returnSlot.directSet(arr); success = true; } else { stackframe.throwCastException(token,argements[0].rtType, functionDefine.signature.parameters[0].type ); success = false; } } catch (KeyNotFoundException) { success = false; stackframe.throwArgementException(token,"类型" + argements[0].rtType + "不是一个链接到系统类库的对象,不能创建托管数组"); } catch (ArgumentOutOfRangeException a) { success = false; stackframe.throwAneException(token,a.Message); } catch { throw new EngineException(); } }
public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { Class _arraylist_ = ((ASBinCode.rtData.rtObjectBase)thisObj).value._class; var arr = stackframe.player.alloc_pureHostedOrLinkedObject(_arraylist_.instanceClass); LinkSystemObject linkobj = (LinkSystemObject)arr.value; try { int capacity = TypeConverter.ConvertToInt(argements[0]); linkobj.SetLinkData(new ArrayList(capacity)); returnSlot.directSet(arr); success = true; } //catch (KeyNotFoundException) //{ // success = false; // stackframe.throwArgementException(token, "类型" + argements[0].rtType + "不是一个链接到系统类库的对象,不能创建托管数组"); //} catch (ArgumentOutOfRangeException a) { success = false; stackframe.throwAneException(token,a.Message); } catch { throw new EngineException(); } }
//public override NativeFunctionMode mode //{ // get // { // return NativeFunctionMode.normal_1; // } //} //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno) //{ // throw new ASRunTimeException(); //} //public override void execute2(RunTimeValueBase thisObj, FunctionDefine functionDefine, SLOT[] argements, SLOT returnSlot, SourceToken token, object stackframe, out bool success) //{ // success = true; // ASBinCode.rtData.rtObject obj = argements[0].getValue() as ASBinCode.rtData.rtObject; // if (obj == null) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } // LinkSystemObject other = obj.value as LinkSystemObject; // if (other == null) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } // LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObject)thisObj).value); // if (System.Object.Equals(iv, other)) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); // return; // } // else // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } //} public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { success = true; ASBinCode.rtData.rtObjectBase obj = argements[0] as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject other = obj.value as LinkSystemObject; if (other == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); if (System.Object.Equals(iv,other)) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { success = true; LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value; (returnSlot).setValue((int)lo.GetLinkData()); }
public override void execute2(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT[] argements,SLOT returnSlot,SourceToken token,object stackframe,out bool success) { //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); success = true; var a1 = argements[0].getValue(); var a2 = argements[1].getValue(); if (a1.rtType == a2.rtType && a1.rtType == RunTimeDataType.rt_null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } ASBinCode.rtData.rtObjectBase obj = a1 as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o1 = obj.value as LinkSystemObject; if (o1 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } ASBinCode.rtData.rtObjectBase obj2 = a2 as ASBinCode.rtData.rtObjectBase; if (obj2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o2 = obj2.value as LinkSystemObject; if (o2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } if (object.ReferenceEquals(o1.GetLinkData(),o2.GetLinkData())) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
//public override NativeFunctionMode mode //{ // get // { // return NativeFunctionMode.normal_1; // } //} //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno) //{ // throw new EngineException(); //} //public override void execute2(RunTimeValueBase thisObj, FunctionDefine functionDefine, SLOT[] argements, SLOT returnSlot,SourceToken token, object stackframe, out bool success) //{ // //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); // success = true; // LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); // string tostr = iv.ToString(); // returnSlot.setValue(tostr); // //return new ASBinCode.rtData.rtString(iv.ToString()); //} public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { success = true; LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); string tostr = iv.ToString(); returnSlot.setValue(tostr); }
public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { success = true; if (argements[0].rtType == RunTimeDataType.rt_null) { success = false; stackframe.throwArgementException(token,"参数elementType不能为null"); return; } Class cls = bin.getClassByRunTimeDataType(argements[0].rtType).instanceClass; int length1 = TypeConverter.ConvertToInt(argements[1]); int length2 = TypeConverter.ConvertToInt(argements[2]); Class _array_ = ((ASBinCode.rtData.rtObjectBase)thisObj).value._class; var arr = stackframe.player.alloc_pureHostedOrLinkedObject(_array_.instanceClass); LinkSystemObject lo = (LinkSystemObject)arr.value; try { RunTimeDataType et = cls.getRtType(); RunTimeDataType ot; if (TypeConverter.Object_CanImplicit_ToPrimitive(cls,out ot)) { et = ot; } Type elementType = stackframe.player.linktypemapper.getLinkType(et); lo.SetLinkData(Array.CreateInstance(elementType,length1,length2)); returnSlot.directSet(arr); } catch (KeyNotFoundException) { success = false; stackframe.throwArgementException(token,"类型" + cls + "不是一个链接到系统类库的对象,不能创建托管数组"); } catch (ArgumentOutOfRangeException a) { success = false; stackframe.throwAneException(token,a.Message); } catch { throw new EngineException(); } }
//public override NativeFunctionMode mode //{ // get // { // return NativeFunctionMode.normal_1; // } //} //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno) //{ // throw new EngineException(); //} //public override void execute2(RunTimeValueBase thisObj, FunctionDefine functionDefine, SLOT[] argements, SLOT returnSlot, SourceToken token, object stackframe, out bool success) //{ // //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); // success = true; // LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); // int hashcode = iv.GetHashCode(); // returnSlot.setValue(hashcode); // //return new ASBinCode.rtData.rtString(iv.ToString()); //} public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); success = true; LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); int hashcode = iv.GetHashCode(); returnSlot.setValue(hashcode); //return new ASBinCode.rtData.rtString(iv.ToString()); }
public static StackCacheObject createFrom(StackLinkObjectCache cache, rtObjectBase src) { LinkSystemObject lobj = (LinkSystemObject)src.value; StackCacheObject clone = new StackCacheObject(cache, (lobj).Clone(), null ); RunTimeScope scope = new RunTimeScope(null, src.objScope.blockId, null, clone, RunTimeScopeType.objectinstance); clone.objScope = scope; return(clone); }
public sealed override object Clone() { LinkSystemObject lobj = (LinkSystemObject)value; rtObject clone = new rtObject((lobj).Clone(), null ); RunTimeScope scope = new RunTimeScope(null, objScope.blockId, null, clone, RunTimeScopeType.objectinstance); clone.objScope = scope; return(clone); }
public override void execute2(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT[] argements,SLOT returnSlot,SourceToken token,object stackframe,out bool success) { //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); success = true; ASBinCode.rtData.rtObjectBase obj = argements[0].getValue() as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o1 = obj.value as LinkSystemObject; if (o1 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } ASBinCode.rtData.rtObjectBase obj2 = argements[1].getValue() as ASBinCode.rtData.rtObjectBase; if (obj2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o2 = obj2.value as LinkSystemObject; if (o2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } if (System.Object.Equals(o1,o2)) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
//public override NativeFunctionMode mode //{ // get // { // return NativeFunctionMode.normal_1; // } //} //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno) //{ // throw new NotImplementedException(); //} //public override void execute2(RunTimeValueBase thisObj, // FunctionDefine functionDefine, // SLOT[] argements, // SLOT returnSlot, // SourceToken token, // object stackframe, out bool success) //{ // LinkObj<T> lobj = (LinkObj<T>)((ASBinCode.rtData.rtObject)thisObj).value; // StackFrame frame = (StackFrame)stackframe; // var arg = argements[0].getValue(); // if (arg.rtType == RunTimeDataType.rt_null) // { // ((StackSlot)returnSlot).setValue(lobj.value.CompareTo(null)); // } // else // { // LinkSystemObject argObj = (LinkSystemObject)((ASBinCode.rtData.rtObject)arg).value; // ((StackSlot)returnSlot).setValue(lobj.value.CompareTo(argObj.GetLinkData())); // } // success = true; //} public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { LinkObj <T> lobj = (LinkObj <T>)((ASBinCode.rtData.rtObjectBase)thisObj).value; StackFrame frame = stackframe; var arg = argements[0]; if (arg.rtType == RunTimeDataType.rt_null) { (returnSlot).setValue(lobj.value.CompareTo(null)); } else { LinkSystemObject argObj = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)arg).value; (returnSlot).setValue(lobj.value.CompareTo(argObj.GetLinkData())); } success = true; }
private static ASBinCode.rtti.Object createObject(CSWC swc,Class cls,InstanceCreator creator, out ASBinCode.rtData.rtObjectBase rtObjectBase, out ASBinCode.rtData.rtObjectBase linkrtobj, out string errinfo ) { ASBinCode.rtti.Object obj = null;// = new ASBinCode.rtti.Object(cls); rtObjectBase = null; linkrtobj = null; errinfo = null; if (cls.isLink_System) { if (creator != null) { StackSlot stackSlot = creator.objectStoreToSlot as StackSlot; if (stackSlot != null) { rtObjectBase = stackSlot.getStackCacheObject(cls); return(rtObjectBase.value); } } var func = (NativeFunctionBase)swc.class_Creator[cls]; string err; int no; ASBinCode.rtData.rtObjectBase rtObj = func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase; linkrtobj = rtObj; if (rtObj == null) { errinfo = cls.ToString() + " create linksystem object failed"; return(null); } else { return(rtObj.value); } } else if (cls.isCrossExtend) { var scls = cls.super; while (!scls.isLink_System) { scls = scls.super; } var cextend = scls.staticClass.linkObjCreator; var func = swc.getNativeFunction(((ClassMethodGetter)cextend.bindField).functionId); if (func == null) { errinfo = cls.ToString() + " create crossextend object failed, creator function not found"; return(null); } string err; int no; ASBinCode.rtData.rtObjectBase rtObj = func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase; linkrtobj = rtObj; if (rtObj == null) { errinfo = cls.ToString() + " create crossextend object failed"; return(null); } else { LinkSystemObject lo = (LinkSystemObject)rtObj.value; return(lo); } } else if ( swc.DictionaryClass != null && ClassMemberFinder.isInherits(cls,swc.DictionaryClass)) { obj = new DictionaryObject(cls); } else if (cls.dynamic) { if (cls.isUnmanaged) { obj = new HostedDynamicObject(cls); } else { obj = new DynamicObject(cls); } } else if (cls.isUnmanaged) { obj = new HostedObject(cls); } else { obj = new ASBinCode.rtti.Object(cls); } return(obj); }
public bool rtValueToLinkObject (RunTimeValueBase value,Type linkType,IClassFinder bin,bool needclone,out object linkobject) { RunTimeDataType vt = value.rtType; if (vt == RunTimeDataType.rt_null) { linkobject = null; return(true); } if (vt > RunTimeDataType.unknown) { var cls = bin.getClassByRunTimeDataType(vt); RunTimeDataType ot; if (TypeConverter.Object_CanImplicit_ToPrimitive( cls,out ot )) { vt = ot; value = TypeConverter.ObjectImplicit_ToPrimitive((ASBinCode.rtData.rtObjectBase)value); } else if (linkType is AS3Class_Type && cls.staticClass == null) { if (cls.getRtType() == ((AS3Class_Type)linkType).rttype) { linkobject = ((AS3Class_Type)linkType).linktype; return(true); } } } RunTimeDataType at = getRuntimeDataType( linkType); if (at == RunTimeDataType.rt_int) { linkobject = (TypeConverter.ConvertToInt(value)); } else if (at == RunTimeDataType.rt_uint) { linkobject = (TypeConverter.ConvertToUInt(value,null,null)); } else if (at == RunTimeDataType.rt_string) { linkobject = (TypeConverter.ConvertToString(value,null,null)); } else if (at == RunTimeDataType.rt_number) { linkobject = (TypeConverter.ConvertToNumber(value)); } else if (at == RunTimeDataType.rt_boolean) { var b = TypeConverter.ConvertToBoolean(value,null,null); linkobject = b.value; } else if (at == RunTimeDataType.rt_array) { linkobject = (ASBinCode.rtData.rtArray)value; } else if (at == RunTimeDataType.rt_function) { if (needclone) { linkobject = (ASBinCode.rtData.rtFunction)value; } else { linkobject = ((ASBinCode.rtData.rtFunction)value).Clone(); } } else if (at == _OBJECT_LINK) { if (vt > RunTimeDataType.unknown) { if (needclone) { linkobject = ((ASBinCode.rtData.rtObjectBase)value).Clone(); } else { linkobject = (ASBinCode.rtData.rtObjectBase)value; } } else { if (needclone) { linkobject = value.Clone(); } else { linkobject = value; } } } else if (at > RunTimeDataType.unknown) { if (vt > RunTimeDataType.unknown) { Class c = bin.getClassByRunTimeDataType(vt); if (c.isLink_System) { LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value; linkobject = lo.GetLinkData(); } else if (c.isCrossExtend) { LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value; linkobject = lo.GetLinkData(); } else if (c.staticClass == null) { if (c.instanceClass.isCrossExtend) { //***isCrossExtend Class转换为 基础类型的type var sc = c.instanceClass.super; while (!sc.isLink_System) { sc = sc.super; } var nf = (ICrossExtendAdapterCreator)swc.getNativeFunction(((ClassMethodGetter)sc.crossExtendAdapterCreator.bindField).functionId); linkobject = nf.GetAdapterType(); } else { linkobject = null; return(false); } } else { linkobject = null; return(false); } } else if (at == _objectType_) //托管object { if (vt == RunTimeDataType.rt_int) { linkobject = (TypeConverter.ConvertToInt(value)); } else if (vt == RunTimeDataType.rt_uint) { linkobject = (TypeConverter.ConvertToUInt(value,null,null)); } else if (vt == RunTimeDataType.rt_string) { linkobject = (TypeConverter.ConvertToString(value,null,null)); } else if (vt == RunTimeDataType.rt_number) { linkobject = (TypeConverter.ConvertToNumber(value)); } else if (vt == RunTimeDataType.rt_boolean) { var b = TypeConverter.ConvertToBoolean(value,null,null); linkobject = b.value; } else if (vt == RunTimeDataType.rt_void) { linkobject = null; } else { linkobject = null; return(false); } } else { linkobject = null; return(false); } } else { linkobject = null; return(false); } return(true); }
public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { if (argements[0].rtType == RunTimeDataType.rt_null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "不能为null"); return; } else if (argements[0].rtType < RunTimeDataType.unknown) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组"); return; } LinkSystemObject indicesObj = ((ASBinCode.rtData.rtObjectBase)argements[0]).value as LinkSystemObject; if (indicesObj == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组"); return; } int[] indices = indicesObj.GetLinkData() as int[]; if (indices == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组int[]"); return; } Array array = (Array)((LinkObj <object>)((ASBinCode.rtData.rtObjectBase)thisObj).value).value; try { object obj = array.GetValue(indices); stackframe.player.linktypemapper.storeLinkObject_ToSlot(obj,functionDefine.signature.returnType,returnSlot,bin,stackframe.player); //returnSlot.setValue((int)array.GetValue(index)); success = true; } catch (RuntimeLinkTypeMapper.TypeLinkClassException tlc) { success = false; stackframe.throwAneException(token,tlc.Message); } catch (KeyNotFoundException) { success = false; stackframe.throwAneException(token,array.ToString() + "没有链接到脚本"); } catch (ArgumentException a) { success = false; stackframe.throwAneException(token,a.Message); } catch (IndexOutOfRangeException i) { success = false; stackframe.throwAneException(token,i.Message); } }
public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { if (argements[1].rtType == RunTimeDataType.rt_null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "不能为null"); return; } else if (argements[1].rtType < RunTimeDataType.unknown) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组"); return; } LinkSystemObject indicesObj = ((ASBinCode.rtData.rtObjectBase)argements[1]).value as LinkSystemObject; if (indicesObj == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组"); return; } int[] indices = indicesObj.GetLinkData() as int[]; if (indices == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组int[]"); return; } Array array = (Array)((LinkObj <object>)((ASBinCode.rtData.rtObjectBase)thisObj).value).value; try { object lo; if (stackframe.player.linktypemapper.rtValueToLinkObject( argements[0],array.GetType().GetElementType(),bin,true,out lo )) { array.SetValue(lo,indices); returnSlot.setValue(ASBinCode.rtData.rtUndefined.undefined); success = true; } else { stackframe.throwCastException(token,argements[0].rtType, stackframe.player.linktypemapper.getRuntimeDataType(array.GetType().GetElementType()) ); success = false; } } catch (RuntimeLinkTypeMapper.TypeLinkClassException tlc) { success = false; stackframe.throwAneException(token,tlc.Message); } catch (InvalidCastException ic) { success = false; stackframe.throwAneException(token,ic.Message); } catch (ArgumentException a) { success = false; stackframe.throwAneException(token,a.Message); } catch (IndexOutOfRangeException i) { success = false; stackframe.throwAneException(token,i.Message); } }