public static void exec_link(StackFrame frame, OpStep step, RunTimeScope scope) { StackSlot l = (StackSlot)step.reg.getSlot(scope, frame); int classid = ((ASBinCode.rtData.rtInt)step.arg2.getValue(scope, frame)).value; var outscope = frame.player.outpackage_runtimescope[classid]; SLOT outpackagescopeslot = ((VariableBase)step.arg1).getSlot(outscope,null); StackSlotAccessor register = (StackSlotAccessor)step.reg; if (register._isassigntarget || register._hasUnaryOrShuffixOrDelete) { l.linkTo(outpackagescopeslot); } else { l.directSet(outpackagescopeslot.getValue()); } frame.endStep(step); }
public static void exec_AccessorBind_ConvertIdx(StackFrame frame, OpStep step, RunTimeScope scope) { RunTimeValueBase obj = step.arg1.getValue(scope, frame); if (rtNull.nullptr.Equals(obj)) { frame.throwError( step.token, 1009, "Cannot access a property or method of a null object reference." ); frame.endStep(); return; } ASBinCode.rtti.Vector_Data vector = (ASBinCode.rtti.Vector_Data)((ASBinCode.rtti.HostedObject)((ASBinCode.rtData.rtObjectBase)obj).value).hosted_object; var idxvalue = step.arg2.getValue(scope, frame); double idx = double.NaN; if (idxvalue.rtType > RunTimeDataType.unknown) { RunTimeDataType ot; if (TypeConverter.Object_CanImplicit_ToPrimitive(idxvalue.rtType, frame.player.swc, out ot)) { var v = TypeConverter.ObjectImplicit_ToPrimitive((rtObjectBase)idxvalue); idx = TypeConverter.ConvertToNumber(v); } } else if (idxvalue.rtType == RunTimeDataType.rt_string || idxvalue.rtType == RunTimeDataType.rt_int || idxvalue.rtType == RunTimeDataType.rt_number || idxvalue.rtType == RunTimeDataType.rt_uint ) { idx = TypeConverter.ConvertToNumber(idxvalue); } if (double.IsNaN(idx)) { frame.throwError( step.token, 0, "索引" + idxvalue + "不能转为int" ); } else { int index = (int)idx; if (index < 0 || index > vector.innnerList.Count) { frame.throwError(step.token, 1125, "The index " + index + " is out of range " + vector.innnerList.Count + "."); } StackSlotAccessor reg = (StackSlotAccessor)step.reg; if (idx == vector.innnerList.Count) { if (vector.isFixed || !reg._isassigntarget) { frame.throwError(step.token, 1125, "The index " + idx + " is out of range " + vector.innnerList.Count + "."); frame.endStep(step); return; } else { vector.innnerList.Add(TypeConverter.getDefaultValue(vector.vector_type).getValue(null, null)); } } StackSlot slot = (StackSlot)step.reg.getSlot(scope, frame); if (reg._isassigntarget || reg._hasUnaryOrShuffixOrDelete) { slot._cache_vectorSlot.idx = index; slot._cache_vectorSlot.vector_data = vector; slot.linkTo(slot._cache_vectorSlot); } else { slot.directSet(vector.innnerList[index]); } } frame.endStep(step); }
public static void exec_AccessorBind(StackFrame frame, OpStep step, RunTimeScope scope) { RunTimeValueBase obj = step.arg1.getValue(scope, frame); if (rtNull.nullptr.Equals(obj)) { frame.throwError( step.token, 1009, "Cannot access a property or method of a null object reference." ); frame.endStep(); return; } ASBinCode.rtti.Vector_Data vector = (ASBinCode.rtti.Vector_Data)((ASBinCode.rtti.HostedObject)((rtObjectBase)obj).value).hosted_object; int idx = TypeConverter.ConvertToInt(step.arg2.getValue(scope, frame)); if (idx < 0 || idx > vector.innnerList.Count) { frame.throwError(step.token, 1125, "The index " + idx + " is out of range " + vector.innnerList.Count + "."); } StackSlotAccessor reg = (StackSlotAccessor)step.reg; if (idx == vector.innnerList.Count) { if (vector.isFixed || !reg._isassigntarget) { frame.throwError(step.token, 1125, "The index " + idx + " is out of range " + vector.innnerList.Count + "." ); frame.endStep(step); return; } else { vector.innnerList.Add(TypeConverter.getDefaultValue(vector.vector_type).getValue(null, null)); } } StackSlot slot = (StackSlot)step.reg.getSlot(scope, frame); if (reg._isassigntarget || reg._hasUnaryOrShuffixOrDelete) { slot._cache_vectorSlot.idx = idx; slot._cache_vectorSlot.vector_data = vector; slot.linkTo(slot._cache_vectorSlot); } else { slot.directSet(vector.innnerList[idx]); } frame.endStep(step); }