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; } }
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); }
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; } }
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; } }
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; } }
/// <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); } }
public override void Compile(Emitter.Emitter emitter) { emitter.EmitLoadThis(); }