public AbcMultiname BuildMemberType(IType type) { Build(type); if (type.Data == null) { throw new InvalidOperationException(string.Format("Type {0} is not defined", type.FullName)); } return(Abc.GetTypeName(type, true)); }
public AbcMethod ToStringInterfaceImpl(IType type, bool cast) { if (type == null) { return(null); } const bool me = false; if (cast) { var AS = ToStringInterfaceImpl(type, false); return(Impl(type, AS, GetCastMethodName(type, me))); } var instance = _generator.TypeBuilder.BuildInstance(SystemTypes.String); var name = GetAsMethodName(type, me); return(instance.DefineMethod( Sig.@static(name, AvmTypeCode.Object, AvmTypeCode.Object, "value"), code => { const int value = 1; code.BeginAsMethod(); code.Try(); code.If( () => { code.GetLocal(value); //code.PushString("String"); //code.PushQName(code[AvmTypeCode.String]); //code.Add(InstructionCode.Istypelate); code.Is(AvmTypeCode.String); return code.IfTrue(); }, () => { code.GetLocal(value); code.ReturnValue(); }, () => { if (type.IsIEnumerableInstance()) { var elemType = type.GetTypeArgument(0); //check array code.GetLocal(value); var notArray = code.IfNotArray(); code.HasElemType(elemType, value); var notArgArray = code.IfFalse(); code.GetLocal(value); code.ReturnValue(); var label = code.Label(); notArgArray.BranchTarget = label; notArray.BranchTarget = label; } code.GetLocal(value); code.As(Abc.GetTypeName(type, false)); code.ReturnValue(); } ); code.CatchReturnNull(); })); }