clojure.lang.CljCompiler.Ast.ObjExpr.EmitAssignLocal C# (CSharp) Method

EmitAssignLocal() private method

private EmitAssignLocal ( CljILGen ilg, LocalBinding lb, clojure.lang.CljCompiler.Ast.Expr val ) : void
ilg CljILGen
lb LocalBinding
val clojure.lang.CljCompiler.Ast.Expr
return void
        internal void EmitAssignLocal(CljILGen ilg, LocalBinding lb, Expr val)
        {
            if (!IsMutable(lb))
                throw new ArgumentException("Cannot assign to non-mutable: ", lb.Name);

            FieldBuilder fb = null;
            bool hasField = ClosedOverFieldsMap.TryGetValue(lb, out fb);

            ilg.Emit(OpCodes.Ldarg_0);  // this

            Type primt = lb.PrimitiveType;
            if (primt != null)
            {
                MaybePrimitiveExpr mbe = val as MaybePrimitiveExpr;
                if (!(mbe != null && mbe.CanEmitPrimitive))
                    throw new ArgumentException("Must assign primitive to primitive mutable", lb.Name);
                mbe.EmitUnboxed(RHC.Expression, this, ilg);

            }
            else
            {
                val.Emit(RHC.Expression, this, ilg);
            }

            if (hasField)
            {
                ilg.MaybeEmitVolatileOp(IsVolatile(lb));
                ilg.Emit(OpCodes.Stfld, fb);
            }
            else
                ilg.Emit(OpCodes.Stloc, lb.LocalVar);
        }

Usage Example

示例#1
0
 public void EmitAssign(RHC rhc, ObjExpr objx, CljILGen ilg, Expr val)
 {
     objx.EmitAssignLocal(ilg, _b, val);
     if (rhc != RHC.Statement)
     {
         objx.EmitLocal(ilg, _b);
     }
 }
All Usage Examples Of clojure.lang.CljCompiler.Ast.ObjExpr::EmitAssignLocal