/// <summary> /// Generates code that loads an address of an element of a multidimensional array. /// </summary> internal void EmitArrayElementAddress(Microsoft.Cci.IArrayTypeReference arrayType, SyntaxNode syntaxNode, DiagnosticBag diagnostics) { Debug.Assert(!arrayType.IsSZArray, "should be used only with multidimensional arrays"); ArrayMethod address = module.ArrayMethods.GetArrayAddress(arrayType); // this, idx1, idx2 --> &value this.EmitOpCode(ILOpCode.Call, -(int)arrayType.Rank); this.EmitToken(address, syntaxNode, diagnostics); }
/// <summary> /// Generates code that stores an element of a multidimensional array. /// </summary> internal void EmitArrayElementStore(Cci.IArrayTypeReference arrayType, SyntaxNode syntaxNode, DiagnosticBag diagnostics) { Debug.Assert(!arrayType.IsSZArray, "should be used only with multidimensional arrays"); ArrayMethod store = module.ArrayMethods.GetArraySet(arrayType); // this, idx1, idx2, value --> void this.EmitOpCode(ILOpCode.Call, -(2 + (int)arrayType.Rank)); this.EmitToken(store, syntaxNode, diagnostics); }
/// <summary> /// Generates code that creates an instance of multidimensional array /// </summary> internal void EmitArrayCreation(Microsoft.Cci.IArrayTypeReference arrayType, SyntaxNode syntaxNode, DiagnosticBag diagnostics) { Debug.Assert(!arrayType.IsSZArray, "should be used only with multidimensional arrays"); ArrayMethod ctor = module.ArrayMethods.GetArrayConstructor(arrayType); // idx1, idx2 --> array this.EmitOpCode(ILOpCode.Newobj, 1 - (int)arrayType.Rank); this.EmitToken(ctor, syntaxNode, diagnostics); }