public void checkCircularReference(ASTool.AS3.AS3Interface as3interface, Builder builder) { var cls = builder.buildingclasses[as3interface]; if (Circularfind(cls, cls.implements)) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "Circular type reference was detected in " + cls.name); } }
public void copyImplements(ASTool.AS3.AS3Interface as3interface, Builder builder) { var cls = builder.buildingclasses[as3interface]; List <ASBinCode.rtti.Class> implist = new List <ASBinCode.rtti.Class>(); foreach (var impl in cls.implements) { implist.Add(impl.Key); } for (int i = 0; i < implist.Count; i++) { copyextendImplements(cls, implist[i]); } }
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 void buildInterfaceExtends(ASTool.AS3.AS3Interface as3interface, Builder builder) { var cls = builder.buildingclasses[as3interface]; cls.staticClass.super = builder.getClassByRunTimeDataType(RunTimeDataType._OBJECT + 2); if (cls.isLink_System) { if (builder.bin.LinkObjectClass == null) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "未设置链接对象基类"); } cls.super = builder.bin.LinkObjectClass; } else { cls.super = builder.bin.ObjectClass; } if (as3interface.ExtendsNames.Count > 0) { for (int i = 0; i < as3interface.ExtendsNames.Count; i++) { string extendName = as3interface.ExtendsNames[i]; var find = TypeReader.findClassFromImports(extendName, builder, as3interface.token); if (find.Count == 1) { if (!find[0].isInterface) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "An interface can only extend other interfaces, but " + extendName + " is a class."); } else if ((!cls.isLink_System) && find[0].isLink_System) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "非链接到系统的接口" + cls.name + " 不能继承链接到系统的接口 " + find[0].name); } else { if (!cls.implements.ContainsKey(find[0])) { cls.implements.Add(find[0], null); } } } else if (find.Count == 0) { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "interface " + extendName + " was not found." ); } else { throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile, "Ambiguous reference to " + extendName ); } } } }