public ASBinCode.rtti.Class buildInterfaceDefine(ASTool.AS3.AS3Interface as3interface, Builder builder, ASBinCode.rtti.Class mainClass, ASTool.AS3.AS3SrcFile as3srcfile, bool isbuildvector, RunTimeDataType vectortype) { if (builder.buildingclasses.isExistsBuildSuccess(new ASBinCode.rtti.Class(-1, -1, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name) { name = as3interface.Name, package = as3interface.Package.Name })) { //重复编译,跳过 return(null); } int classid = builder.getClassId(); int blockid = builder.getBlockId(); ASBinCode.rtti.Class cls = new ASBinCode.rtti.Class(classid, blockid, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name); cls.package = as3interface.Package.Name; cls.name = as3interface.Name; builder.buildingclasses.Add(as3interface, cls); if (isbuildvector) { builder.bin.dict_Vector_type.Add(cls, vectortype); } cls.ispackageout = false; cls.isPublic = as3interface.Access.IsPublic; cls.package = as3interface.Package.Name; cls.name = as3interface.Name; cls.no_constructor = true; cls.isInterface = true; if (as3interface.Access.IsDynamic) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "Interface attribute dynamic is invalid."); } if (as3interface.Access.IsFinal) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "Interface attribute final is invalid."); } //cls.dynamic = as3class.Access.IsDynamic; //cls.final = as3class.Access.IsFinal; if (mainClass != null) { cls.mainClass = mainClass; cls.ispackageout = true; } NativeFunctionBase creatorfunction = null; if (as3interface.Meta != null) { foreach (var m in as3interface.Meta) { if (!m.Value.IsReg) { if (m.Value.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier) { if (m.Value.Data.Value.ToString() == "_IEnumerator_") { if (builder.bin.IEnumeratorInterface == null) { builder.bin.IEnumeratorInterface = cls; } else { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "[_IEnumerator_]只能指定一次"); } } else if (m.Value.Data.Value.ToString() == "_IEnumerable_") { if (builder.bin.IEnumerableInterface == null) { builder.bin.IEnumerableInterface = cls; } else { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "[_IEnumerable_]只能指定一次"); } } } } else { if (m.exprStepList != null && m.exprStepList.Count == 1) { var step = m.exprStepList[0]; if (step.Type == ASTool.AS3.Expr.OpType.CallFunc) { if (!step.Arg2.IsReg) { if (step.Arg2.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier) { if (step.Arg2.Data.Value.ToString() == "link_system_interface") { cls.isLink_System = true; if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.as3_callargements) { List <ASTool.AS3.Expr.AS3DataStackElement> cargs = (List <ASTool.AS3.Expr.AS3DataStackElement>)step.Arg3.Data.Value; if (cargs.Count == 1) { if (cargs[0].Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier) { string creator = cargs[0].Data.Value.ToString(); if (builder.bin.ContainsNativeFunction(creator)) { var nf = builder.bin.getNativeFunction(creator); //nativefunctions[builder.bin.nativefunctionNameIndex[creator]]; if (!(nf is ASBinCode.rtti.ILinkSystemObjCreator)) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "链接接口必须有一个INativeFunctionRegister类型的创建器"); } creatorfunction = nf; } else if (!builder.options.CheckNativeFunctionSignature) { creatorfunction = new mocks.MockNativeFunction(creator); } else { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "本地函数 " + creator + " 未注册"); } } } } } } } } } } } } //****编译metaclass*** int metaclassid = builder.getClassId(); int metablockid = builder.getBlockId(); ASBinCode.rtti.Class metaclass = new ASBinCode.rtti.Class(metaclassid, metablockid, builder.bin, as3srcfile.md5Key + "_metaclass_" + "$" + as3interface.Name); metaclass.package = as3interface.Package.Name; metaclass.ispackageout = false; metaclass.isPublic = as3interface.Access.IsPublic; metaclass.name = "$" + as3interface.Name; metaclass.dynamic = true; metaclass.final = true; cls.staticClass = metaclass; metaclass.instanceClass = cls; if (cls.isLink_System) { builder.linkinterfaceCreators.Add(cls, creatorfunction); } return(cls); }
public AS3Class_Type(RunTimeDataType rttype,Type linktype) { this.rttype = rttype; this.linktype = linktype; }
public ObjectMemberSlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType FunctionClassRtType, RunTimeDataType slottype, IClassFinder classfinder) { this.obj = obj; this.isConstMember = false; this.FunctionClassRtType = FunctionClassRtType; this.slottype = slottype; this.classfinder = classfinder; }
public void init(CSWC swc) { this.swc = swc; arrayType = typeof(Array); link_type = new Dictionary <Type, RunTimeDataType>(); link_type.Add(typeof(int), RunTimeDataType.rt_int); link_type.Add(typeof(string), RunTimeDataType.rt_string); link_type.Add(typeof(double), RunTimeDataType.rt_number); link_type.Add(typeof(bool), RunTimeDataType.rt_boolean); link_type.Add(typeof(uint), RunTimeDataType.rt_uint); link_type.Add(typeof(ASBinCode.rtData.rtArray), RunTimeDataType.rt_array); link_type.Add(typeof(ASBinCode.rtData.rtFunction), RunTimeDataType.rt_function); link_type.Add(typeof(DictionaryKey), _DICT_KEY); link_type.Add(typeof(RunTimeValueBase), _OBJECT_LINK); link_type.Add(typeof(float), _FLOAT); link_type.Add(typeof(short), _SHORT); link_type.Add(typeof(ushort), _USHORT); foreach (var item in swc.creator_Class) { link_type.Add(item.Key.getLinkSystemObjType(), item.Value.getRtType()); link_type.Add(new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()), item.Value.staticClass.getRtType()); if (item.Key.getLinkSystemObjType().Equals(typeof(object))) { _objectType_ = item.Value.getRtType(); } } type_link = new Dictionary <RunTimeDataType, Type>(); type_link.Add(RunTimeDataType.rt_int, typeof(int)); type_link.Add(RunTimeDataType.rt_string, typeof(string)); type_link.Add(RunTimeDataType.rt_number, typeof(double)); type_link.Add(RunTimeDataType.rt_boolean, typeof(bool)); type_link.Add(RunTimeDataType.rt_uint, typeof(uint)); type_link.Add(RunTimeDataType.rt_array, typeof(ASBinCode.rtData.rtArray)); type_link.Add(RunTimeDataType.rt_function, typeof(ASBinCode.rtData.rtFunction)); type_link.Add(_DICT_KEY, typeof(DictionaryKey)); type_link.Add(_OBJECT_LINK, typeof(RunTimeValueBase)); type_link.Add(_FLOAT, typeof(float)); type_link.Add(_SHORT, typeof(short)); type_link.Add(_USHORT, typeof(ushort)); foreach (var item in swc.creator_Class) { type_link.Add(item.Value.getRtType(), item.Key.getLinkSystemObjType()); type_link.Add(item.Value.staticClass.getRtType(), new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType())); } if (swc.TypeClass == null) { return; } { var clsint = swc.getClassDefinitionByName("int").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsint, typeof(int)), clsint); type_link.Add(clsint, new AS3Class_Type(clsint, typeof(int))); } { var clsuint = swc.getClassDefinitionByName("uint").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsuint, typeof(uint)), clsuint); type_link.Add(clsuint, new AS3Class_Type(clsuint, typeof(uint))); } { var clsstring = swc.getClassDefinitionByName("String").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsstring, typeof(string)), clsstring); type_link.Add(clsstring, new AS3Class_Type(clsstring, typeof(string))); } { var clsboolean = swc.getClassDefinitionByName("Boolean").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsboolean, typeof(bool)), clsboolean); type_link.Add(clsboolean, new AS3Class_Type(clsboolean, typeof(bool))); } { var clsnumber = swc.getClassDefinitionByName("Number").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsnumber, typeof(double)), clsnumber); type_link.Add(clsnumber, new AS3Class_Type(clsnumber, typeof(double))); } }
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); }
private static void build_bracket_access(CompileEnv env, ASTool.AS3.Expr.AS3ExprStep step, RightValueBase v1, Builder builder) { ASBinCode.StackSlotAccessor eax = env.createASTRegister(step.Arg1.Reg); eax.setEAXTypeWhenCompile(RunTimeDataType.rt_void); var v2 = ExpressionBuilder.getRightValue(env, step.Arg3, step.token, builder); if (v1.valueType == RunTimeDataType.rt_void ) { OpStep op = new OpStep(OpCode.bracket_access, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } else if (v1.valueType > RunTimeDataType.unknown && builder.bin.dict_Vector_type.ContainsKey(builder.getClassByRunTimeDataType(v1.valueType)) ) { ASBinCode.rtti.Class vector = builder.getClassByRunTimeDataType(v1.valueType); RunTimeDataType vt = builder.bin.dict_Vector_type[vector]; if (v2.valueType > RunTimeDataType.unknown) { v2 = ExpressionBuilder.addCastToPrimitive(env, v2, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile), builder); } if (v2.valueType == RunTimeDataType.rt_int || v2.valueType == RunTimeDataType.rt_number || v2.valueType == RunTimeDataType.rt_uint ) { v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile) , builder); eax.setEAXTypeWhenCompile(vt); { OpStep op = new OpStep(OpCode.vectorAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } } else { OpStep op = new OpStep(OpCode.vectorAccessor_convertidx, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } //if (v2.valueType != RunTimeDataType.rt_int) //{ // v2=ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int, // new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile) // , builder); //} //eax.setEAXTypeWhenCompile(vt); //eax._vector_Type = vt; //{ // OpStep op = new OpStep(OpCode.vectorAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); // op.reg = eax; // op.regType = eax.valueType; // op.arg1 = v1; // op.arg1Type = v1.valueType; // op.arg2 = v2; // op.arg2Type = v2.valueType; // env.block.opSteps.Add(op); //} } else if (builder.bin.ArrayClass != null && builder.bin.ArrayClass.getRtType() == v1.valueType && (v2.valueType == RunTimeDataType.rt_int || v2.valueType == RunTimeDataType.rt_number || v2.valueType == RunTimeDataType.rt_uint ) ) { v1 = builds.ExpressionBuilder.addCastToPrimitive(env, v1, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile), builder); v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile) , builder); OpStep op = new OpStep(OpCode.arrayAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } else if (v1.valueType == RunTimeDataType.rt_array && (v2.valueType == RunTimeDataType.rt_int || v2.valueType == RunTimeDataType.rt_number || v2.valueType == RunTimeDataType.rt_uint ) ) { v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile) , builder); OpStep op = new OpStep(OpCode.arrayAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } else { OpStep op = new OpStep(OpCode.bracket_byname, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)); op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = v1; op.arg1Type = v1.valueType; op.arg2 = v2; op.arg2Type = v2.valueType; env.block.opSteps.Add(op); } }
public void storeLinkObject_ToSlot(object obj, RunTimeDataType defineReturnType, SLOT returnSlot,IClassFinder bin,Player player) { if (obj is ICrossExtendAdapter) { obj = ((ICrossExtendAdapter)obj).AS3Object; } if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtNull.nullptr); } else { RunTimeDataType rt = defineReturnType; //getLinkType(funcDefine.signature.returnType); //RunTimeDataType rt = // getRuntimeDataType(obj.GetType()); if (rt == RunTimeDataType.rt_void) { rt = getRuntimeDataType(obj.GetType()); if (rt == _FLOAT) { rt = RunTimeDataType.rt_number; } else if (rt == _SHORT) { rt = RunTimeDataType.rt_int; } else if (rt == _USHORT) { rt = RunTimeDataType.rt_uint; } } if (rt == _DICT_KEY) { DictionaryKey key = (DictionaryKey)obj; rt = _OBJECT_LINK; obj = key.key; } if (rt == RunTimeDataType._OBJECT) { rt = _OBJECT_LINK; } if (rt == _OBJECT_LINK) { rt = ((RunTimeValueBase)obj).rtType; if (rt < RunTimeDataType.unknown) //否则走下面的Object路径 { returnSlot.directSet((RunTimeValueBase)obj); return; } } if (rt == RunTimeDataType.rt_int) { var realObjType = getRuntimeDataType(obj.GetType()); if (realObjType == RunTimeDataType.rt_uint) { returnSlot.setValue((int)(uint)obj); } else if (realObjType == RunTimeDataType.rt_number) { returnSlot.setValue((int)(double)obj); } else if (realObjType == _FLOAT) { returnSlot.setValue((int)(float)obj); } else if (realObjType == _SHORT) { returnSlot.setValue((int)(short)obj); } else if (realObjType == _USHORT) { returnSlot.setValue((int)(ushort)obj); } else { returnSlot.setValue((int)obj); } } else if (rt == RunTimeDataType.rt_uint) { var realObjType = getRuntimeDataType(obj.GetType()); if (realObjType == RunTimeDataType.rt_int) { returnSlot.setValue((uint)(int)obj); } else if (realObjType == RunTimeDataType.rt_number) { returnSlot.setValue((uint)(double)obj); } else if (realObjType == _FLOAT) { returnSlot.setValue((uint)(float)obj); } else if (realObjType == _SHORT) { returnSlot.setValue((uint)(short)obj); } else if (realObjType == _USHORT) { returnSlot.setValue((uint)(ushort)obj); } else { returnSlot.setValue((uint)obj); } } else if (rt == RunTimeDataType.rt_string) { var realObjType = getRuntimeDataType(obj.GetType()); returnSlot.setValue((string)obj); } else if (rt == RunTimeDataType.rt_number) { var realObjType = getRuntimeDataType(obj.GetType()); if (realObjType == RunTimeDataType.rt_uint) { returnSlot.setValue((double)(uint)obj); } else if (realObjType == RunTimeDataType.rt_int) { returnSlot.setValue((double)(int)obj); } else if (realObjType == _FLOAT) { returnSlot.setValue((double)(float)obj); } else if (realObjType == _SHORT) { returnSlot.setValue((double)(short)obj); } else if (realObjType == _USHORT) { returnSlot.setValue((double)(ushort)obj); } else { returnSlot.setValue((double)obj); } } else if (rt == RunTimeDataType.rt_boolean) { if ((bool)obj) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); } } else if (rt == RunTimeDataType.rt_array) { returnSlot.directSet((ASBinCode.rtData.rtArray)obj); } else if (rt == RunTimeDataType.rt_function) { returnSlot.directSet((ASBinCode.rtData.rtFunction)obj); } else if (rt > RunTimeDataType.unknown) { Class rtCls; // = ((ASBinCode.rtData.rtObject)obj).value._class; //bin.getClassByRunTimeDataType(rt); ASBinCode.rtData.rtObjectBase testObj = obj as ASBinCode.rtData.rtObjectBase; if (testObj != null) { rtCls = ((ASBinCode.rtData.rtObjectBase)obj).value._class; if (rtCls.isLink_System) { var f = ((CSWC)bin).class_Creator[rtCls]; f.setLinkObjectValueToSlot(returnSlot,player, ((LinkSystemObject)testObj.value).GetLinkData(),rtCls); } else { returnSlot.directSet((ASBinCode.rtData.rtObjectBase)obj); } } else { rtCls = bin.getClassByRunTimeDataType(rt); if (rtCls.classid == player.swc.TypeClass.classid) { Type type = obj as Type; if (type != null) { try { var rttype = getRuntimeDataType(type); if (rttype < RunTimeDataType.unknown && player.swc.primitive_to_class_table[rttype] != null ) { rttype = player.swc.primitive_to_class_table[rttype].getRtType(); } var rtcls = bin.getClassByRunTimeDataType(rttype); if (player.init_static_class(rtcls,SourceToken.Empty)) { returnSlot.directSet( player.static_instance[rtcls.staticClass.classid]); } else { throw new ASRunTimeException("转换Class失败",String.Empty); } } catch (KeyNotFoundException) { throw new TypeLinkClassException(type.FullName + " 没有链接到脚本"); } } else { throw new ASRunTimeException("没有将Class链接到Type",String.Empty); } } else { var f = ((CSWC)bin).class_Creator[rtCls]; f.setLinkObjectValueToSlot(returnSlot,player,obj,rtCls); } } } else { throw new ASRunTimeException("意外的链接类型",String.Empty); } } }
private string GetConvertToAS3ParameterFunctionName(RunTimeDataType type) { string paratype = GetTypeString(type); return(GetConvertToAS3ParameterFunctionName(paratype)); }
public Vector_Data(RunTimeDataType vector_type) { this.vector_type = vector_type; }
public void setTypeWhenCompile(RunTimeDataType t) { _type = t; }
//序列化时用 private ClassMember() { _type = RunTimeDataType.rt_void; }
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,"参数" + functionDefine.signature.parameters[0].name + "不能为null"); return; } Class cls = bin.getClassByRunTimeDataType(argements[0].rtType).instanceClass; 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 lengthsObj = ((ASBinCode.rtData.rtObjectBase)argements[1]).value as LinkSystemObject; if (lengthsObj == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组"); return; } int[] lengths = lengthsObj.GetLinkData() as int[]; if (lengths == null) { success = false; stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组int[]"); return; } //int length = TypeConverter.ConvertToInt(argements[1], stackframe, token); 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,lengths)); 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 DynamicPropertySlot(ASBinCode.rtData.rtObjectBase obj, bool _canDelete, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null) { this._canDelete = _canDelete; propertyIsEnumerable = false; }
public DictionarySlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null) { propertyIsEnumerable = false; }