public sealed override bool directSet(RunTimeValueBase value) { if (linktarget != null) { return(linktarget.directSet(value)); } else { index = (int)value.rtType; //if (index > RunTimeDataType.unknown) //若大于unknown,则说明是一个对象 //{ // index = RunTimeDataType._OBJECT; //} //值类型必须拷贝!!否则值可能被其他引用而导致错误 //私有构造函数的数据可以直接传引用,否则必须拷贝赋值。 switch (value.rtType) { case RunTimeDataType.rt_boolean: store[0] = value; break; case RunTimeDataType.rt_int: //setValue(((rtInt)value).value); _intValue.value = ((rtInt)value).value; break; case RunTimeDataType.rt_uint: //setValue(((rtUInt)value).value); _uintValue.value = ((rtUInt)value).value; break; case RunTimeDataType.rt_number: _numberValue.value = ((rtNumber)value).value; break; case RunTimeDataType.rt_string: setValue(((rtString)value).value); break; case RunTimeDataType.rt_void: store[index] = value; break; case RunTimeDataType.rt_null: store[6] = value; break; case RunTimeDataType.rt_function: { //Function需要保存上下文环境。因此需要像值类型那样进行拷贝 _functionValue.CopyFrom((rtFunction)value); //store[index] = _functionValue; store[COMMREFTYPEOBJ] = _functionValue; needclear = true; refPropChanged = true; } break; case RunTimeDataType.fun_void: store[8] = value; break; case RunTimeDataType.rt_array: { //store[index] = value; store[COMMREFTYPEOBJ] = value; refPropChanged = true; } break; case RunTimeDataType.unknown: store[10] = null; break; default: { index = RunTimeDataType._OBJECT; rtObjectBase obj = (rtObjectBase)value; refPropChanged = true; if (obj.value._class.isLink_System) { if (obj is StackLinkObjectCache.StackCacheObject) { needclear = true; //链接到系统的对象。这里需要用到缓存的rtObject,以避免当调用链接对象的方法并返回的也是链接对象时, //要重新创建rtObject,而是直接更新缓存的rtObject. var cacheobj = _linkObjCache.getCacheObj(obj.value._class); ASBinCode.rtti.LinkSystemObject link = (ASBinCode.rtti.LinkSystemObject)cacheobj.value; if (obj.value._class.isStruct) { link.CopyStructData((ASBinCode.rtti.LinkSystemObject)obj.value); } else { link._class = obj.value._class; link.SetLinkData(((ASBinCode.rtti.LinkSystemObject)obj.value).GetLinkData()); cacheobj.rtType = obj.rtType; cacheobj.objScope.blockId = obj.value._class.blockid; } //rtObject srcObj = ((rtObject)value); //StackLinkObjectCache.StackCacheObject ss = srcObj as StackLinkObjectCache.StackCacheObject; //if (ss != null) //{ // srcObj = ss.getSrcObject(); //} //if (!(srcObj is StackLinkObjectCache.StackCacheObject)) //{ // //当对象方法调用已绑定了这个槽中的链接对象,然后下面又复用了这个槽时 // //为了避免下面寄存器复用破坏缓存中的LinkSystemObject对象,缓存一份 // _linkObjCache.srcObject = srcObj; //} //store[RunTimeDataType._OBJECT] = cacheobj; store[COMMREFTYPEOBJ] = cacheobj; } else { store[COMMREFTYPEOBJ] = value; } } else { //store[RunTimeDataType._OBJECT] = value; store[COMMREFTYPEOBJ] = value; } } break; } return(true); } }
public override SLOT assign(RunTimeValueBase value,out bool success) { if (vector_data.vector_type != value.rtType && ! ( //***检查子类关系**** (vector_data.vector_type > RunTimeDataType.unknown && value.rtType > RunTimeDataType.unknown && ( ClassMemberFinder.check_isinherits(value,vector_data.vector_type,classfinder) || ClassMemberFinder.check_isImplements(value,vector_data.vector_type,classfinder) ) ) || ( vector_data.vector_type > RunTimeDataType.unknown && value.rtType == RunTimeDataType.rt_null ) || ( vector_data.vector_type == RunTimeDataType.rt_array && value.rtType == RunTimeDataType.rt_null ) || ( vector_data.vector_type == RunTimeDataType.rt_function && value.rtType == RunTimeDataType.rt_null ) || ( vector_data.vector_type == RunTimeDataType.rt_string && value.rtType == RunTimeDataType.rt_null ) ) ) { //return false; success = false; return(this); } else { switch (value.rtType) { case RunTimeDataType.rt_int: { ((rtInt)vector_data.innnerList[idx]).value = ((rtInt)value).value; success = true; return(this); } case RunTimeDataType.rt_uint: { ((rtUInt)vector_data.innnerList[idx]).value = ((rtUInt)value).value; success = true; return(this); } case RunTimeDataType.rt_number: { ((rtNumber)vector_data.innnerList[idx]).value = ((rtNumber)value).value; success = true; return(this); } case RunTimeDataType.rt_string: { ((rtString)vector_data.innnerList[idx]).value = ((rtString)value).value; success = true; return(this); } case RunTimeDataType.rt_function: { ((rtFunction)vector_data.innnerList[idx]).CopyFrom((rtFunction)value); success = true; return(this); } default: break; } if (value.rtType > RunTimeDataType.unknown) { var vd = vector_data.innnerList[idx]; if (vd != null) { var cls = classfinder.getClassByRunTimeDataType(value.rtType); if (cls.isLink_System) { ASBinCode.rtti.LinkSystemObject link = (ASBinCode.rtti.LinkSystemObject)((rtObjectBase)vd).value; if (cls.isStruct) { link.CopyStructData((ASBinCode.rtti.LinkSystemObject)((rtObjectBase)value).value); } else { ((rtObjectBase)vd).value = ((rtObjectBase)value).value; } success = true; return(this); } } } vector_data.innnerList[idx] = (RunTimeValueBase)value.Clone(); //对容器的直接赋值,需要Clone //return true; success = true; return(this); } }