Ejemplo n.º 1
0
        public override void Compile(Emitter.Emitter emitter)
        {
            try
              {
            Resolve(emitter);

            if (!emitter.TypeIsParent(IdentifierType, Expression.GetExpressionType(emitter)))
              Error(String.Format(Resources.errAssignTypeMismatch, Expression.GetExpressionType(emitter), IdentifierType));
              }
              catch(CompilerException ex)
              {
            ex.AffixToLexem(Lexem);
            throw;
              }

              switch (Kind)
              {

            case IdentifierKind.StaticField:  Expression.Compile(emitter);
                                          emitter.EmitSaveField(emitter.FindField(OwnerType, Name)); break;

            case IdentifierKind.Field:        if (ExpressionPrefix != null)
                                            ExpressionPrefix.Compile(emitter);
                                          else
                                            emitter.EmitLoadThis();
                                          Expression.Compile(emitter);
                                          emitter.EmitSaveField(emitter.FindField(OwnerType, Name)); break;

            case IdentifierKind.Variable:     Expression.Compile(emitter);
                                          emitter.EmitSaveVariable(emitter.CurrentMethod.Scope.Find(Name)); break;

            case IdentifierKind.Parameter:    Expression.Compile(emitter);
                                          emitter.EmitSaveParameter(emitter.CurrentMethod.Parameters[Name].Id); break;
              }
        }
Ejemplo n.º 2
0
        public override void Compile(Emitter.Emitter emitter)
        {
            try
              {
            Resolve(emitter);
              }
              catch (CompilerException ex)
              {
            ex.AffixToLexem(Lexem);
            throw;
              }

              var method = emitter.FindMethod(OwnerType, Name, GetSignature(emitter));

              // load 'this'
              if (ExpressionPrefix != null)
            ExpressionPrefix.Compile(emitter);
              else if (!Static)
            emitter.EmitLoadThis();

              // load parameters
              for (int idx = 0; idx < Parameters.Count; idx++)
              {
            Parameters[idx].Compile(emitter);
            emitter.EmitUpcastBasicType(Parameters[idx].GetExpressionType(emitter), method.Parameters[idx].Type.Signature);
              }

              // invoke
              emitter.EmitCall(method);
        }
Ejemplo n.º 3
0
        public override void Compile(Emitter.Emitter emitter)
        {
            try
              {
            Resolve(emitter);
              }
              catch (CompilerException ex)
              {
            ex.AffixToLexem(Lexem);
            throw;
              }

              switch (Kind)
              {

            case IdentifierKind.StaticField:    emitter.EmitLoadField(emitter.FindField(OwnerType, Name)); break;

            case IdentifierKind.Field:          if(ExpressionPrefix != null)
                                              ExpressionPrefix.Compile(emitter);
                                            else
                                              emitter.EmitLoadThis();
                                            emitter.EmitLoadField(emitter.FindField(OwnerType, Name)); break;

            case IdentifierKind.StaticMethod:   emitter.EmitCall(emitter.FindMethod(OwnerType, Name)); break;

            case IdentifierKind.Method:         if (ExpressionPrefix != null)
                                              ExpressionPrefix.Compile(emitter);
                                            else
                                              emitter.EmitLoadThis();
                                            emitter.EmitCall(emitter.FindMethod(OwnerType, Name)); break;

            case IdentifierKind.Variable:       emitter.EmitLoadVariable(emitter.CurrentMethod.Scope.Find(Name)); break;

            case IdentifierKind.Parameter:      emitter.EmitLoadParameter(emitter.CurrentMethod.Parameters[Name].Id); break;

            case IdentifierKind.SizeProperty:   ExpressionPrefix.Compile(emitter);
                                            emitter.EmitLoadArraySize(); break;
              }
        }
Ejemplo n.º 4
0
        public override void Compile(Emitter.Emitter emitter)
        {
            if(Expression != null)
              {
            try
            {
              emitter.CurrentMethod = emitter.CurrentType.Methods[(Static ? ".cctor" : ".init")][0];
            }
            catch
            {
              emitter.CurrentMethod = Static ? emitter.CreateStaticCtor(emitter.CurrentType, true) : emitter.CreateInitializer(emitter.CurrentType, true);
            }

            if (!Static)
              emitter.EmitLoadThis();

            Expression.Compile(emitter);
            emitter.EmitSaveField(this);

            emitter.CurrentMethod = null;
              }
        }
Ejemplo n.º 5
0
        public override void Compile(Emitter.Emitter emitter)
        {
            if (!BuiltIn)
              {
            emitter.CurrentMethod = this;

            // special cases for constructors
            if(Name == ".ctor")
            {
              // invoke base constructor
              emitter.EmitLoadThis();
              if(emitter.CurrentType.Parent != "")
            emitter.EmitCall(emitter.FindMethod(emitter.CurrentType.Parent, ".ctor"));
              else
            emitter.EmitCall(emitter.AssemblyImport(typeof(object).GetConstructor(new Type[] { } )));

              // invoke initializer
              if (emitter.MethodNameExists(emitter.CurrentType.Name, ".init"))
              {
            emitter.EmitLoadThis();
            emitter.EmitCall(emitter.FindMethod(emitter.CurrentType.Name, ".init"));
              }
            }

            Body.Compile(emitter);
            if (!Body.AllPathsReturn)
            {
              if (Type.Signature == "void")
            emitter.EmitReturn();
              else
            Error(String.Format(Resources.errNotAllPathsReturn, Name));
            }

            emitter.CurrentMethod = null;
              }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Emit code for loading local variables from fields
        /// </summary>
        /// <param name="list">List of closures</param>
        private void LoadClosuredVariables(Dictionary<string, string> list, Emitter.Emitter emitter)
        {
            foreach (var curr in list)
              {
            emitter.EmitLoadThis();

            // load field
            var currField = emitter.FindField(PlannerID, "_" + curr.Key);
            emitter.EmitLoadField(currField);

            // save into variable
            var currVar = emitter.CurrentMethod.Scope.Introduce(curr.Value, emitter.ResolveType(curr.Value), curr.Key);
            emitter.EmitSaveVariable(currVar);
              }
        }
Ejemplo n.º 7
0
 public override void Compile(Emitter.Emitter emitter)
 {
     emitter.EmitLoadThis();
 }