private static void AddArrayMethods(TypeSystem typeSystem, MosaType arrayType, MosaType.Mutator type, MosaArrayInfo info) { // Remove all methods & fields --> Since BaseType = System.Array, they're automatically inherited. type.Methods.Clear(); type.Fields.Clear(); // Add three array accessors as defined in standard (Get, Set, Address) // Also, constructor. uint rank = info.Rank; MosaMethod methodGet = typeSystem.Controller.CreateMethod(); using (var method = typeSystem.Controller.MutateMethod(methodGet)) { method.DeclaringType = arrayType; method.Name = "Get"; method.IsInternalCall = true; method.IsRTSpecialName = method.IsSpecialName = true; method.IsFinal = true; method.HasThis = true; List <MosaParameter> parameters = new List <MosaParameter>(); for (uint i = 0; i < rank; i++) { var indexParam = typeSystem.Controller.CreateParameter(); using (var mosaParameter = typeSystem.Controller.MutateParameter(indexParam)) { mosaParameter.Name = "index" + i; mosaParameter.ParameterAttributes = MosaParameterAttributes.In; mosaParameter.ParameterType = typeSystem.BuiltIn.I4; mosaParameter.DeclaringMethod = methodGet; } parameters.Add(indexParam); } method.Signature = new MosaMethodSignature(arrayType.ElementType, parameters); } type.Methods.Add(methodGet); MosaMethod methodSet = typeSystem.Controller.CreateMethod(); using (var method = typeSystem.Controller.MutateMethod(methodSet)) { method.DeclaringType = arrayType; method.Name = "Set"; method.IsInternalCall = true; method.IsRTSpecialName = method.IsSpecialName = true; method.IsFinal = true; method.HasThis = true; List <MosaParameter> parameters = new List <MosaParameter>(); for (uint i = 0; i < rank; i++) { var indexParam = typeSystem.Controller.CreateParameter(); using (var mosaParameter = typeSystem.Controller.MutateParameter(indexParam)) { mosaParameter.Name = "index" + i; mosaParameter.ParameterAttributes = MosaParameterAttributes.In; mosaParameter.ParameterType = typeSystem.BuiltIn.I4; mosaParameter.DeclaringMethod = methodSet; } parameters.Add(indexParam); } var valueParam = typeSystem.Controller.CreateParameter(); using (var mosaParameter = typeSystem.Controller.MutateParameter(valueParam)) { mosaParameter.Name = "value"; mosaParameter.ParameterAttributes = MosaParameterAttributes.In; mosaParameter.ParameterType = arrayType.ElementType; mosaParameter.DeclaringMethod = methodSet; } parameters.Add(valueParam); method.Signature = new MosaMethodSignature(typeSystem.BuiltIn.Void, parameters); } type.Methods.Add(methodSet); MosaMethod methodAdrOf = typeSystem.Controller.CreateMethod(); using (var method = typeSystem.Controller.MutateMethod(methodAdrOf)) { method.DeclaringType = arrayType; method.Name = "AddressOr"; method.IsInternalCall = true; method.IsRTSpecialName = method.IsSpecialName = true; method.IsFinal = true; method.HasThis = true; List <MosaParameter> parameters = new List <MosaParameter>(); for (uint i = 0; i < rank; i++) { var indexParam = typeSystem.Controller.CreateParameter(); using (var mosaParameter = typeSystem.Controller.MutateParameter(indexParam)) { mosaParameter.Name = "index" + i; mosaParameter.ParameterAttributes = MosaParameterAttributes.In; mosaParameter.ParameterType = typeSystem.BuiltIn.I4; mosaParameter.DeclaringMethod = methodAdrOf; } parameters.Add(indexParam); } method.Signature = new MosaMethodSignature(arrayType.ElementType.ToManagedPointer(), parameters); } type.Methods.Add(methodAdrOf); MosaMethod methodCtor = typeSystem.Controller.CreateMethod(); using (var method = typeSystem.Controller.MutateMethod(methodCtor)) { method.DeclaringType = arrayType; method.Name = ".ctor"; method.IsInternalCall = true; method.IsRTSpecialName = method.IsSpecialName = true; method.IsFinal = true; method.HasThis = true; List <MosaParameter> parameters = new List <MosaParameter>(); for (uint i = 0; i < rank; i++) { var lengthParam = typeSystem.Controller.CreateParameter(); using (var mosaParameter = typeSystem.Controller.MutateParameter(lengthParam)) { mosaParameter.Name = "length" + i; mosaParameter.ParameterAttributes = MosaParameterAttributes.In; mosaParameter.ParameterType = typeSystem.BuiltIn.I4; mosaParameter.DeclaringMethod = methodCtor; } parameters.Add(lengthParam); } method.Signature = new MosaMethodSignature(typeSystem.BuiltIn.Void, parameters); } type.Methods.Add(methodCtor); }
internal Mutator(MosaMethod method) : base(method) { this.method = method; }
public MosaMethod.Mutator MutateMethod(MosaMethod method) { return(new MosaMethod.Mutator(method)); }
public void SetEntryPoint(MosaMethod entryPoint) { typeSystem.EntryPoint = entryPoint; }
public MosaCustomAttribute(MosaMethod ctor, Argument[] args, NamedArgument[] namedArgs) { Constructor = ctor; Arguments = args; NamedArguments = namedArgs; }