예제 #1
0
        public static void UnpackArray(BooCodeBuilder codeBuilder, Method method, Block block, Expression expression, DeclarationCollection declarations)
        {
            ILocalEntity local = expression.Entity as ILocalEntity;

            if (null == local)
            {
                local = codeBuilder.DeclareTempLocal(method,
                                                     expression.ExpressionType);
                block.Add(
                    codeBuilder.CreateAssignment(
                        codeBuilder.CreateReference(local),
                        expression));
            }
            for (int i = 0; i < declarations.Count; ++i)
            {
                Declaration declaration = declarations[i];
                block.Add(
                    codeBuilder.CreateAssignment(
                        codeBuilder.CreateReference(
                            declaration.Entity),
                        codeBuilder.CreateSlicing(
                            codeBuilder.CreateReference(local),
                            i)));
            }
        }
예제 #2
0
		public BooMethodBuilder(BooCodeBuilder codeBuilder, Method method)
		{
			if (null == codeBuilder)
				throw new ArgumentNullException("codeBuilder");
			if (null == method)
				throw new ArgumentNullException("method");
			_codeBuilder = codeBuilder;
			_method = method;
		}
예제 #3
0
        Method CreateFieldAccessor(IField member)
        {
            BooCodeBuilder builder = _context.CodeBuilder;
            Method         method  = builder.CreateMethod("___" + member.Name, member.Type, TypeMemberModifiers.None);

            method.Body.Add(
                new ReturnStatement(
                    builder.CreateReference(member)));
            return(method);
        }
예제 #4
0
		public BooClassBuilder(string name)
		{
			if (name == null)
				throw new ArgumentNullException("name");
			
			_internalTypeSystemProvider = My<InternalTypeSystemProvider>.Instance;
			_codeBuilder = My<BooCodeBuilder>.Instance;
			_cd = new ClassDefinition { Name = name, IsSynthetic = true };
			EnsureEntityFor(_cd);
		}
예제 #5
0
		public BooMethodBuilder(BooCodeBuilder codeBuilder, string name, IType returnType, TypeMemberModifiers modifiers)
		{
			if (null == codeBuilder)
				throw new ArgumentNullException("codeBuilder");
			if (null == name)
				throw new ArgumentNullException("name");
			
			_codeBuilder = codeBuilder;			
			_method = _codeBuilder.CreateMethod(name, returnType, modifiers);
		}
예제 #6
0
            public AwaitCatchFrame(TypeSystemServices tss, BooCodeBuilder builder, Method currentMethod)
            {
                pendingCaughtException = builder.DeclareTempLocal(currentMethod, tss.ObjectType);
                pendingCatch           = builder.DeclareTempLocal(currentMethod, tss.IntType);

                handlers              = new List <Block>();
                _hoistedLocals        = new Dictionary <InternalLocal, InternalLocal>();
                _orderedHoistedLocals = new List <InternalLocal>();
                _currentMethod        = currentMethod;
            }
예제 #7
0
            public AwaitFinallyFrame(AwaitFinallyFrame parent, HashSet <InternalLabel> labelsOpt, TryStatement TryStatement, BooCodeBuilder builder, int depth)
            {
                Debug.Assert(parent != null);
                Debug.Assert(TryStatement != null);

                ParentOpt        = parent;
                _labelsOpt       = labelsOpt;
                _tryStatementOpt = TryStatement;
                _builder         = builder;
                _tryDepth        = depth;
            }
예제 #8
0
 private AsyncExceptionHandlerRewriter(
     Method containingMethod,
     BooCodeBuilder factory,
     AwaitInFinallyAnalysis analysis)
 {
     _F                        = factory;
     _analysis                 = analysis;
     _containingMethod         = containingMethod;
     _currentAwaitFinallyFrame = new AwaitFinallyFrame(factory);
     _tss                      = My <TypeSystemServices> .Instance;
 }
예제 #9
0
 public static void UnpackExpression(BooCodeBuilder codeBuilder, Method method, Block block, Expression expression, DeclarationCollection declarations)
 {
     if (expression.ExpressionType.IsArray)
     {
         UnpackArray(codeBuilder, method, block, expression, declarations);
     }
     else
     {
         UnpackEnumerable(codeBuilder, method, block, expression, declarations);
     }
 }
예제 #10
0
 public BooMethodBuilder(BooCodeBuilder codeBuilder, Method method)
 {
     if (null == codeBuilder)
     {
         throw new ArgumentNullException("codeBuilder");
     }
     if (null == method)
     {
         throw new ArgumentNullException("method");
     }
     _codeBuilder = codeBuilder;
     _method      = method;
 }
예제 #11
0
        public BooMethodBuilder(BooCodeBuilder codeBuilder, string name, IType returnType, TypeMemberModifiers modifiers)
        {
            if (null == codeBuilder)
            {
                throw new ArgumentNullException("codeBuilder");
            }
            if (null == name)
            {
                throw new ArgumentNullException("name");
            }

            _codeBuilder = codeBuilder;
            _method      = _codeBuilder.CreateMethod(name, returnType, modifiers);
        }
예제 #12
0
        Method CreateFieldSetter(IField member)
        {
            BooCodeBuilder       builder = _context.CodeBuilder;
            Method               method  = builder.CreateMethod("___" + member.Name, _context.TypeSystemServices.VoidType, TypeMemberModifiers.None);
            ParameterDeclaration value   = builder.CreateParameterDeclaration(1, "value", member.Type);

            method.Parameters.Add(value);
            method.Body.Add(
                builder.CreateFieldAssignment(
                    LexicalInfo.Empty,
                    member,
                    builder.CreateReference(value)));
            return(method);
        }
예제 #13
0
        public BooClassBuilder(string name)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            _internalTypeSystemProvider = My <InternalTypeSystemProvider> .Instance;
            _codeBuilder = My <BooCodeBuilder> .Instance;
            _cd          = new ClassDefinition {
                Name = name, IsSynthetic = true
            };
            EnsureEntityFor(_cd);
        }
예제 #14
0
        public static Expression CreateCallableFromMacroBody(BooCodeBuilder builder, MacroStatement macro)
        {
            // create closure for macro's body or null
            Expression macroBody = new NullLiteralExpression();

            if (macro.Block.Statements.Count > 0)
            {
                var callableExpr = new BlockExpression {
                    Body = macro.Block
                };
                callableExpr.Parameters.Add(
                    new ParameterDeclaration("OutputStream",
                                             builder.CreateTypeReference(typeof(TextWriter))));

                macroBody = callableExpr;
            }
            return(macroBody);
        }
예제 #15
0
        public static void UnpackEnumerable(BooCodeBuilder codeBuilder, Method method, Block block, Expression expression, DeclarationCollection declarations)
        {
            TypeSystemServices tss = codeBuilder.TypeSystemServices;

            InternalLocal local = codeBuilder.DeclareTempLocal(method,
                                                               tss.IEnumeratorType);

            IType expressionType = expression.ExpressionType;

            if (expressionType.IsSubclassOf(codeBuilder.TypeSystemServices.IEnumeratorType))
            {
                block.Add(
                    codeBuilder.CreateAssignment(
                        codeBuilder.CreateReference(local),
                        expression));
            }
            else
            {
                if (!expressionType.IsSubclassOf(codeBuilder.TypeSystemServices.IEnumerableType))
                {
                    expression = codeBuilder.CreateMethodInvocation(
                        RuntimeServices_GetEnumerable, expression);
                }

                block.Add(
                    codeBuilder.CreateAssignment(
                        block.LexicalInfo,
                        codeBuilder.CreateReference(local),
                        codeBuilder.CreateMethodInvocation(
                            expression, IEnumerable_GetEnumerator)));
            }

            for (int i = 0; i < declarations.Count; ++i)
            {
                Declaration declaration = declarations[i];

                block.Add(
                    codeBuilder.CreateAssignment(
                        codeBuilder.CreateReference(declaration.Entity),
                        codeBuilder.CreateMethodInvocation(RuntimeServices_MoveNext,
                                                           codeBuilder.CreateReference(local))));
            }
        }
예제 #16
0
            public void HoistLocal(InternalLocal local, BooCodeBuilder F)
            {
                if (!_hoistedLocals.Keys.Any(l => l.Name == local.Name && l.Type == local.Type))
                {
                    _hoistedLocals.Add(local, local);
                    _orderedHoistedLocals.Add(local);
                    return;
                }

                // code uses "await" in two sibling catches with exception filters
                // locals with same names and types may cause problems if they are lifted
                // and become fields with identical signatures.
                // To avoid such problems we will mangle the name of the second local.
                // This will only affect debugging of this extremely rare case.
                var newLocal = F.DeclareTempLocal(_currentMethod, local.Type);

                _hoistedLocals.Add(local, newLocal);
                _orderedHoistedLocals.Add(newLocal);
            }
예제 #17
0
        Method CreateMethodAccessor(IMethod member)
        {
            BooCodeBuilder builder = _context.CodeBuilder;
            Method         method  = builder.CreateMethodFromPrototype(LexicalInfo.Empty, member, TypeMemberModifiers.None);

            method.Name = "___" + member.Name;
            MethodInvocationExpression mie = builder.CreateMethodInvocation(member);

            foreach (ParameterDeclaration p in method.Parameters)
            {
                mie.Arguments.Add(builder.CreateReference(p));
            }
            if (member.ReturnType == _context.TypeSystemServices.VoidType)
            {
                method.Body.Add(mie);
            }
            else
            {
                method.Body.Add(new ReturnStatement(mie));
            }
            return(method);
        }
예제 #18
0
 public AwaitFinallyFrame(BooCodeBuilder builder)
 {
     _builder = builder;
 }
예제 #19
0
		public BooMethodBuilder(BooCodeBuilder codeBuilder, string name, IType returnType) : this(codeBuilder, name, returnType, TypeMemberModifiers.Public)
		{
		}
예제 #20
0
 public BooMethodBuilder(BooCodeBuilder codeBuilder, string name, IType returnType) : this(codeBuilder, name, returnType, TypeMemberModifiers.Public)
 {
 }
예제 #21
0
 private AwaitExpressionSpiller(Method method, TypeSystemServices tss)
 {
     _F             = My <BooCodeBuilder> .Instance;
     _currentMethod = method;
     _tss           = tss;
 }