internal void EmitLetFnInits(CljILGen ilg, LocalBuilder localBuilder, ObjExpr objx, IPersistentSet letFnLocals) { if (_typeBuilder != null) { // Full compile ilg.Emit(OpCodes.Castclass, _typeBuilder); for (ISeq s = RT.keys(Closes); s != null; s = s.next()) { LocalBinding lb = (LocalBinding)s.first(); if (letFnLocals.contains(lb)) { FieldBuilder fb; _closedOverFieldsMap.TryGetValue(lb, out fb); Type primt = lb.PrimitiveType; ilg.Emit(OpCodes.Dup); // this if (primt != null) { objx.EmitUnboxedLocal(ilg, lb); ilg.Emit(OpCodes.Stfld, fb); } else { objx.EmitLocal(ilg, lb); ilg.Emit(OpCodes.Stfld, fb); } } } ilg.Emit(OpCodes.Pop); } }
public virtual void Emit(RHC rhc, ObjExpr objx, CljILGen ilg) { //emitting a Fn means constructing an instance, feeding closed-overs from enclosing scope, if any //objx arg is enclosing objx, not this if (IsDefType) ilg.Emit(OpCodes.Ldnull); else { if (SupportsMeta) { ilg.Emit(OpCodes.Ldnull); ilg.Emit(OpCodes.Castclass, typeof(IPersistentMap)); } for (ISeq s = RT.keys(Closes); s != null; s = s.next()) { LocalBinding lb = (LocalBinding)s.first(); if (lb.PrimitiveType != null) objx.EmitUnboxedLocal(ilg, lb); else objx.EmitLocal(ilg, lb); } ilg.Emit(OpCodes.Newobj, CtorInfo); } if (rhc == RHC.Statement) ilg.Emit(OpCodes.Pop); }
internal void EmitLetFnInits(CljILGen ilg, LocalBuilder localBuilder, ObjExpr objx, IPersistentSet letFnLocals) { if (_typeBuilder != null) { // Full compile ilg.Emit(OpCodes.Castclass, _typeBuilder); for (ISeq s = RT.keys(Closes); s != null; s = s.next()) { LocalBinding lb = (LocalBinding)s.first(); if (letFnLocals.contains(lb)) { FieldBuilder fb; _closedOverFieldsMap.TryGetValue(lb, out fb); Type primt = lb.PrimitiveType; ilg.Emit(OpCodes.Dup); // this if (primt != null) { objx.EmitUnboxedLocal(ilg, lb); ilg.MaybeEmitVolatileOp(IsVolatile(lb)); ilg.Emit(OpCodes.Stfld, fb); } else { objx.EmitLocal(ilg, lb); ilg.MaybeEmitVolatileOp(IsVolatile(lb)); ilg.Emit(OpCodes.Stfld, fb); } } } ilg.Emit(OpCodes.Pop); } }
public virtual void Emit(RHC rhc, ObjExpr objx, CljILGen ilg) { //emitting a Fn means constructing an instance, feeding closed-overs from enclosing scope, if any //objx arg is enclosing objx, not this if (IsDefType) ilg.Emit(OpCodes.Ldnull); else { if (SupportsMeta) { ilg.Emit(OpCodes.Ldnull); ilg.Emit(OpCodes.Castclass, typeof(IPersistentMap)); } for (ISeq s = RT.keys(Closes); s != null; s = s.next()) { LocalBinding lb = (LocalBinding)s.first(); if (lb.PrimitiveType != null) objx.EmitUnboxedLocal(ilg, lb); else objx.EmitLocal(ilg, lb); } ilg.Emit(OpCodes.Newobj, _ctorInfo); } if (rhc == RHC.Statement) ilg.Emit(OpCodes.Pop); }
public void EmitUnboxed(RHC rhc, ObjExpr objx, CljILGen ilg) { objx.EmitUnboxedLocal(ilg, _b); }