// // Initializes all hoisted variables // public void EmitStoreyInstantiation (EmitContext ec) { // There can be only one instance variable for each storey type if (Instance != null) throw new InternalErrorException (); SymbolWriter.OpenCompilerGeneratedBlock (ec.ig); // // Create an instance of storey type // Expression storey_type_expr; if (is_generic) { // // Use current method type parameter (MVAR) for top level storey only. All // nested storeys use class type parameter (VAR) // TypeParameter[] tparams = ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.Storey != null ? ec.CurrentAnonymousMethod.Storey.TypeParameters : ec.CurrentTypeParameters; TypeArguments targs = new TypeArguments (); if (tparams.Length < CountTypeParameters) { TypeParameter[] parent_tparams = ec.MemberContext.CurrentTypeDefinition.TypeParameters; for (int i = 0; i < parent_tparams.Length; ++i) targs.Add (new TypeParameterExpr (parent_tparams[i], Location)); } for (int i = 0; i < tparams.Length; ++i) targs.Add (new TypeParameterExpr (tparams[i], Location)); storey_type_expr = new GenericTypeExpr (TypeBuilder, targs, Location); } else { storey_type_expr = new TypeExpression (TypeBuilder, Location); } ResolveContext rc = new ResolveContext (this); Expression e = new New (storey_type_expr, null, Location).Resolve (rc); e.Emit (ec); Instance = new LocalTemporary (storey_type_expr.Type); Instance.Store (ec); EmitHoistedFieldsInitialization (ec); SymbolWriter.DefineScopeVariable (ID, Instance.Builder); SymbolWriter.CloseCompilerGeneratedBlock (ec.ig); }
// // Initializes all hoisted variables // public void EmitStoreyInstantiation (EmitContext ec) { // There can be only one instance variable for each storey type if (Instance != null) throw new InternalErrorException (); SymbolWriter.OpenCompilerGeneratedBlock (ec); // // Create an instance of a storey // var storey_type_expr = CreateStoreyTypeExpression (ec); ResolveContext rc = new ResolveContext (ec.MemberContext); Expression e = new New (storey_type_expr, null, Location).Resolve (rc); e.Emit (ec); Instance = new LocalTemporary (storey_type_expr.Type); Instance.Store (ec); EmitHoistedFieldsInitialization (ec); SymbolWriter.DefineScopeVariable (ID, Instance.Builder); SymbolWriter.CloseCompilerGeneratedBlock (ec); }
public void EmitNew (EmitContext ec, New source, bool leave_copy) { if (!source.Emit (ec, this)) { if (leave_copy) throw new NotImplementedException (); return; } throw new NotImplementedException (); }