public static bool isCatchError(int tryid, ASBinCode.RunTimeValueBase throwValue, ASBinCode.OpStep step, ASBinCode.RunTimeScope scope, StackFrame frame) { int id = ((ASBinCode.rtData.rtInt)((ASBinCode.rtData.RightValue)step.arg1).getValue(null, null)).value; if (tryid == id) { return(TypeConverter.testTypeMatch(throwValue, step.regType, frame.player.swc)); } return(false); }
public static double ConvertToNumber(ASBinCode.RunTimeValueBase src) { return(src.toNumber()); //switch (src.rtType) //{ // case rt.rt_boolean: // if (((ASBinCode.rtData.rtBoolean)src).value == true) // { // return 1;// new ASBinCode.rtData.rtNumber(1); // } // else // { // return 0;// ASBinCode.rtData.rtNumber.zero; // } // case rt.rt_int: // return ((ASBinCode.rtData.rtInt)src).value;// new ASBinCode.rtData.rtNumber(((ASBinCode.rtData.rtInt)src).value); // case rt.rt_uint: // return ((ASBinCode.rtData.rtUInt)src).value;// new ASBinCode.rtData.rtNumber(((ASBinCode.rtData.rtUInt)src).value); // case rt.rt_number: // return ((ASBinCode.rtData.rtNumber)src).value; //(ASBinCode.rtData.rtNumber)src; // case rt.rt_string: // { // double r = 0; // if (((ASBinCode.rtData.rtString)src).value == null) // { // return 0;// new ASBinCode.rtData.rtNumber(0); // } // else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r)) // { // return r;//new ASBinCode.rtData.rtNumber(r); // } // else // { // return double.NaN; //new ASBinCode.rtData.rtNumber(double.NaN); // } // } // case rt.rt_void: // case rt.fun_void: // return double.NaN; //new ASBinCode.rtData.rtNumber(double.NaN); // case rt.rt_null: // return 0;// new ASBinCode.rtData.rtNumber(0); // case rt.rt_function: // case rt.rt_array: // return double.NaN; // case rt.unknown: // return double.NaN; // default: // return double.NaN;// null; //} }
internal Iterator(ASBinCode.RunTimeValueBase v, Player player) { this.player = player; if (v.rtType > ASBinCode.RunTimeDataType.unknown) { var cls = player.swc.getClassByRunTimeDataType(v.rtType); if (cls.isLink_System) { var lobj = ((ASBinCode.rtti.LinkSystemObject)((ASBinCode.rtData.rtObjectBase)v).value).GetLinkData(); if (lobj is System.Collections.IEnumerator) { innerenumerator = (System.Collections.IEnumerator)lobj; } else if (lobj is System.Collections.IEnumerable) { innerenumerator = ((System.Collections.IEnumerable)lobj).GetEnumerator(); } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } } else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumeratorInterface.getRtType(), player.swc)) { as3ienumerator = (ASBinCode.rtData.rtObjectBase)v; get_current = player.getMethod(as3ienumerator, "@current_get"); movenext = player.getMethod(as3ienumerator, "moveNext"); reset = player.getMethod(as3ienumerator, "reset"); } else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumerableInterface.getRtType(), player.swc)) { var getenumerator = player.getMethod((ASBinCode.rtData.rtObjectBase)v, "getEnumerator"); as3ienumerator = (ASBinCode.rtData.rtObjectBase)player.InvokeFunction(getenumerator, 0, null, null, null, null, null, null); get_current = player.getMethod(as3ienumerator, "@current_get"); movenext = player.getMethod(as3ienumerator, "moveNext"); reset = player.getMethod(as3ienumerator, "reset"); } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } }
/// <summary> /// 测试索引器类型是否匹配 /// </summary> /// <returns></returns> public static bool testIndexGetSetMatch(ASBinCode.RunTimeValueBase src, rt dsttype, ASBinCode.CSWC swc) { if (src.rtType > rt.unknown && dsttype > rt.unknown) { return(ASBinCode.ClassMemberFinder.check_isinherits(src.rtType, dsttype, swc)); } if (dsttype == rt.rt_void || dsttype == swc.ObjectClass.getRtType() || src.rtType == dsttype) { return(true); } if (swc.LinkObjectClass != null) { if (dsttype == swc.LinkObjectClass.getRtType()) { if (src.rtType == rt.rt_boolean || src.rtType == rt.rt_int || src.rtType == rt.rt_null || src.rtType == rt.rt_number || src.rtType == rt.rt_string || src.rtType == rt.rt_uint) { return(true); } } } if (src.rtType == rt.rt_number && dsttype == rt.rt_int) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (int)(long)v) { return(true); } } if (src.rtType == rt.rt_number && dsttype == rt.rt_uint) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (uint)(long)v) { return(true); } } if (src.rtType == rt.rt_int || src.rtType == rt.rt_uint) { return(dsttype == rt.rt_number || dsttype == rt.rt_int || dsttype == rt.rt_uint); } return(false); }
/// <summary> /// 比较值src是否和值dst类型匹配 /// </summary> /// <param name="src"></param> /// <param name="dst"></param> /// <returns></returns> public static bool testTypeMatch(ASBinCode.RunTimeValueBase src, ASBinCode.RunTimeDataType dsttype, ASBinCode.IClassFinder classfinder) { if (src.rtType > rt.unknown && dsttype > rt.unknown) { return(ASBinCode.ClassMemberFinder.check_isinherits(src, dsttype, classfinder)); } if (dsttype == rt.rt_void || src.rtType == dsttype) { return(true); } if (src.rtType == rt.rt_number && dsttype == rt.rt_int) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (int)(long)v) { return(true); } } if (src.rtType == rt.rt_number && dsttype == rt.rt_uint) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (uint)(long)v) { return(true); } } if (src.rtType == rt.rt_int || src.rtType == rt.rt_uint) { return(dsttype == rt.rt_number); } return(false); }
public static ASBinCode.rtData.rtBoolean ConvertToBoolean(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token) { switch (src.rtType) { case rt.rt_boolean: return((ASBinCode.rtData.rtBoolean)src); case rt.rt_int: if (((ASBinCode.rtData.rtInt)src).value == 0) { return(ASBinCode.rtData.rtBoolean.False); } else { return(ASBinCode.rtData.rtBoolean.True); } case rt.rt_uint: if (((ASBinCode.rtData.rtUInt)src).value == 0) { return(ASBinCode.rtData.rtBoolean.False); } else { return(ASBinCode.rtData.rtBoolean.True); } case rt.rt_number: { double r = ((ASBinCode.rtData.rtNumber)src).value; if (double.IsNaN(r) || r == 0) { return(ASBinCode.rtData.rtBoolean.False); } else { return(ASBinCode.rtData.rtBoolean.True); } } case rt.rt_string: { if (string.IsNullOrEmpty(((ASBinCode.rtData.rtString)src).value)) { return(ASBinCode.rtData.rtBoolean.False); } else { return(ASBinCode.rtData.rtBoolean.True); } } case rt.rt_void: case rt.fun_void: return(ASBinCode.rtData.rtBoolean.False); case rt.rt_null: return(ASBinCode.rtData.rtBoolean.False); case rt.rt_function: case rt.rt_array: return(ASBinCode.rtData.rtBoolean.True); case rt.unknown: return(ASBinCode.rtData.rtBoolean.False); default: //凡是大于unknown的都是对象 return(ASBinCode.rtData.rtBoolean.True); } }
public static string ConvertToString(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token) { switch (src.rtType) { case rt.rt_boolean: return(((ASBinCode.rtData.rtBoolean)src).ToString()); // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtBoolean)src).ToString()); case rt.rt_int: return(((ASBinCode.rtData.rtInt)src).ToString()); // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtInt)src).value.ToString()); case rt.rt_uint: return(((ASBinCode.rtData.rtUInt)src).value.ToString()); // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtUInt)src).value.ToString()); case rt.rt_number: return(((ASBinCode.rtData.rtNumber)src).ToString()); // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtNumber)src).value.ToString()); case rt.rt_string: return(((ASBinCode.rtData.rtString)src).value); //(ASBinCode.rtData.rtString)src; case rt.rt_void: return(null); case rt.fun_void: return(ASBinCode.rtData.rtUndefined.undefined.ToString()); case rt.rt_null: return(null); //new ASBinCode.rtData.rtString(null); case rt.rt_function: return("function Function() {}"); case rt.rt_array: return(((ASBinCode.rtData.rtArray)src).ToString()); case rt.unknown: return(null); default: { //ASBinCode.rtData.rtObject obj = (ASBinCode.rtData.rtObject)src; //var toStr = (ASBinCode.ClassMemberFinder.find(obj.value._class, "toString", obj.value._class)); //if (toStr.type == rt.rt_function && !toStr.isStatic && toStr.isPublic // && !toStr.isConstructor // ) //{ // operators.FunctionCaller fc = new operators.FunctionCaller(frame.player, frame, token); // fc.function = (ASBinCode.rtData.rtFunction)obj.value.memberData[toStr.index].getValue(); // fc.loadDefineFromFunction(); // fc.createParaScope(); // fc.returnSlot = frame._tempSlot; // fc.call(); // if (frame.player.step_toblockend()) // { // return ConvertToString(fc.returnSlot.getValue(), frame, token, isthrow); // } // else // { // return null; // } //} //else { return(((ASBinCode.rtData.rtObjectBase)src).value.ToString()); } } //return "object " + ((ASBinCode.rtData.rtObject)src).value._class.name; } }
public static uint ConvertToUInt(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token) { switch (src.rtType) { case rt.rt_boolean: if (((ASBinCode.rtData.rtBoolean)src).value == true) { return(1); // new ASBinCode.rtData.rtUInt(1); } else { return(0); // ASBinCode.rtData.rtUInt.zero; } case rt.rt_int: return((uint)((ASBinCode.rtData.rtInt)src).value); // new ASBinCode.rtData.rtUInt((uint)((ASBinCode.rtData.rtInt)src).value); case rt.rt_uint: return(((ASBinCode.rtData.rtUInt)src).value); //(ASBinCode.rtData.rtUInt)src; case rt.rt_number: { double r = ((ASBinCode.rtData.rtNumber)src).value; if (double.IsNaN(r) || double.IsInfinity(r)) { return(0); // new ASBinCode.rtData.rtUInt(0); } else { return((uint)((long)r)); // new ASBinCode.rtData.rtUInt((uint)r); } } case rt.rt_string: { double r = 0; if (((ASBinCode.rtData.rtString)src).value == null) { return(0); // new ASBinCode.rtData.rtUInt(0); } else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r)) { if (double.IsNaN(r) || double.IsInfinity(r)) { return(0); // new ASBinCode.rtData.rtUInt(0); } else { return((uint)((long)r)); // new ASBinCode.rtData.rtUInt((uint)r); } } else { return(0); // new ASBinCode.rtData.rtUInt(0); } } case rt.rt_void: case rt.fun_void: return(0); // new ASBinCode.rtData.rtUInt(0); case rt.rt_null: return(0); // new ASBinCode.rtData.rtUInt(0); case rt.unknown: case rt.rt_function: case rt.rt_array: default: return(0); } }
public static int ConvertToInt(ASBinCode.RunTimeValueBase src) { switch (src.rtType) { case rt.rt_boolean: if (((ASBinCode.rtData.rtBoolean)src).value == true) { return(1); // new ASBinCode.rtData.rtInt(1); } else { return(0); // ASBinCode.rtData.rtInt.zero; } case rt.rt_int: return(((ASBinCode.rtData.rtInt)src).value); //(ASBinCode.rtData.rtInt)src; case rt.rt_uint: return((int)((ASBinCode.rtData.rtUInt)src).value); //new ASBinCode.rtData.rtInt((int)((ASBinCode.rtData.rtUInt)src).value ); case rt.rt_number: { double r = ((ASBinCode.rtData.rtNumber)src).value; if (double.IsNaN(r) || double.IsInfinity(r)) { return(0); //new ASBinCode.rtData.rtInt(0); } else { return((int)((long)r)); //new ASBinCode.rtData.rtInt((int)r); } } case rt.rt_string: { double r = 0; if (((ASBinCode.rtData.rtString)src).value == null) { return(0); // new ASBinCode.rtData.rtInt(0); } else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r)) { if (double.IsNaN(r) || double.IsInfinity(r)) { return(0); // new ASBinCode.rtData.rtInt(0); } else { return((int)((long)r)); // new ASBinCode.rtData.rtInt((int)r); } } else { return(0); // new ASBinCode.rtData.rtInt(0); } } case rt.rt_void: case rt.fun_void: return(0); // new ASBinCode.rtData.rtInt(0); case rt.rt_null: case rt.rt_function: case rt.rt_array: return(0); // new ASBinCode.rtData.rtInt(0); case rt.unknown: default: //if (isthrow) //{ // frame.throwCastException(token, rt.unknown, rt.rt_int); //} return(0); } }