Exemplo n.º 1
0
        int EnterGenericProvider(IGenericParameterProvider provider, CilType owner, int parameterIndex)
        {
            int pos = 0;

            foreach (var genericElement in provider.GenericParameters)
            {
                var item = new GenericStackItem();
                item.Name = CilType.GenericParameterFullName(genericElement);

                ++pos;  // index always +1
                if (parameterIndex == -1)
                {
                    item.Index = -pos;
                    item.Type  = owner;
                }
                else
                {
                    item.Index = parameterIndex + pos;
                }

                items.Add(item);
            }

            return(pos);
        }
Exemplo n.º 2
0
 void EnterGenericInstance(IGenericInstance instance, IGenericParameterProvider provider)
 {
     if (instance.HasGenericArguments)
     {
         foreach (var genericElement in provider.GenericParameters)
         {
             var item            = new GenericStackItem();
             var genericArgument = instance.GenericArguments[genericElement.Position];
             if (genericArgument is ArrayType genericArgumentAsArray)
             {
                 item.GenericInstance = genericArgumentAsArray.ElementType as GenericInstanceType;
             }
             else
             {
                 item.GenericInstance = genericArgument as GenericInstanceType;
             }
             item.GenericParent = instance;
             item.Name          = CilType.GenericParameterFullName(genericElement);
             item.Type          = CilType.From(genericArgument);
             items.Add(item);
         }
     }
 }
Exemplo n.º 3
0
        public void EnterMethod(CilType type, JavaMethodRef method, bool instanceMethod)
        {
            //
            // we expect the method definition to contain the suffix type parameters
            // (added by CilMethod.ImportGenericParameters), so we subtract their
            // number to determine the index of the first type parameter.  if this
            // is an instance method, we add one to account for 'this' argument.
            //

            var argumentIndex = method.Parameters.Count - type.GenericParameters.Count;

            if (instanceMethod)
            {
                argumentIndex++;
            }

            foreach (var genericParameter in type.GenericParameters)
            {
                var item = new GenericStackItem();
                item.Name  = genericParameter.JavaName;
                item.Index = ++argumentIndex;   // index always +1
                items.Add(item);
            }
        }