Пример #1
0
		private void EmitListIn(FleeILGenerator ilg, IServiceProvider services, BranchManager bm)
		{
			var ce = new CompareElement();
			var endLabel = bm.FindLabel("endLabel");
			var trueTerminal = bm.FindLabel("trueTerminal");

			// Cache the operand since we will be comparing against it a lot
			var lb = ilg.DeclareLocal(MyOperand.ResultType);
			int targetIndex = lb.LocalIndex;

			MyOperand.Emit(ilg, services);
			Utility.EmitStoreLocal(ilg, targetIndex);

			// Wrap our operand in a local shim
			var targetShim = new LocalBasedElement(MyOperand, targetIndex);

			// Emit the compares
			foreach (var argumentElement in MyArguments) {
				ce.Initialize(targetShim, argumentElement, LogicalCompareOperation.Equal);
				ce.Emit(ilg, services);

				EmitBranchToTrueTerminal(ilg, trueTerminal, bm);
			}

			ilg.Emit(OpCodes.Ldc_I4_0);
			ilg.Emit(OpCodes.Br_S, endLabel);

			bm.MarkLabel(ilg, trueTerminal);
			ilg.MarkLabel(trueTerminal);

			ilg.Emit(OpCodes.Ldc_I4_1);

			bm.MarkLabel(ilg, endLabel);
			ilg.MarkLabel(endLabel);
		}
Пример #2
0
        // Emit elements into an array
		private static void EmitElementArrayLoad(ExpressionElement[] elements, Type arrayElementType, FleeILGenerator ilg, IServiceProvider services)
		{
			// Load the array length
			LiteralElement.EmitLoad(elements.Length, ilg);

			// Create the array
			ilg.Emit(OpCodes.Newarr, arrayElementType);

			// Store the new array in a unique local and remember the index
			var local = ilg.DeclareLocal(arrayElementType.MakeArrayType());
			int arrayLocalIndex = local.LocalIndex;
			Utility.EmitStoreLocal(ilg, arrayLocalIndex);

			for (int i = 0; i <= elements.Length - 1; i++) {
				// Load the array
				Utility.EmitLoadLocal(ilg, arrayLocalIndex);
				// Load the index
				LiteralElement.EmitLoad(i, ilg);
				// Emit the element (with any required conversions)
				ExpressionElement element = elements[i];
				element.Emit(ilg, services);
				ImplicitConverter.EmitImplicitConvert(element.ResultType, arrayElementType, ilg);
				// Store it into the array
				Utility.EmitArrayStore(ilg, arrayElementType);
			}

			// Load the array
			Utility.EmitLoadLocal(ilg, arrayLocalIndex);
		}