protected void ImplementCascadeLoadMode() { FieldInstance f_cascadeLoadMode = ImplementField(new FieldInstance(FieldAttributes.Private, "__cascadeLoadMode", typeof(CascadeLoadMode))); ImplementGetter(template_m_getCascadeLoadMode, f_cascadeLoadMode); ImplementSetter(template_m_setCascadeLoadMode, f_cascadeLoadMode); ConstructorInfo[] constructors = State.CurrentType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); for (int a = constructors.Length; a-- > 0;) { ConstructorInstance ci = new ConstructorInstance(constructors[a]); ci = new ConstructorInstance(MethodAttributes.Public, ci.Parameters); IMethodVisitor mv = VisitMethod(ci); mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuperOfCurrentMethod(); mv.PutThisField(f_cascadeLoadMode, delegate(IMethodVisitor mg) { mg.PushEnum(CascadeLoadMode.DEFAULT); }); mv.ReturnValue(); mv.EndMethod(); } }
public virtual void InvokeSuperOfCurrentMethod() { if (mv != null) { mv.InvokeSuperOfCurrentMethod(); } }
protected void ImplementDefaultConstructor() { IMethodVisitor mv = VisitMethod(ConstructorInstance.defaultConstructor); mv.LoadThis(); mv.InvokeSuperOfCurrentMethod(); mv.ReturnValue(); mv.EndMethod(); }
protected void ImplementConstructor(PropertyInstance p_embeddedMemberTemplate) { HashSet <Member> alreadyHandledFirstMembers = new HashSet <Member>(); List <Script> scripts = new List <Script>(); { Script script = HandleMember(p_embeddedMemberTemplate, metaData.IdMember, alreadyHandledFirstMembers); if (script != null) { scripts.Add(script); } } foreach (Member member in metaData.PrimitiveMembers) { Script script = HandleMember(p_embeddedMemberTemplate, member, alreadyHandledFirstMembers); if (script != null) { scripts.Add(script); } } foreach (RelationMember member in metaData.RelationMembers) { Script script = HandleMember(p_embeddedMemberTemplate, member, alreadyHandledFirstMembers); if (script != null) { scripts.Add(script); } } if (scripts.Count == 0) { return; } OverrideConstructors(delegate(IClassVisitor cv, ConstructorInstance superConstructor) { IMethodVisitor mv = cv.VisitMethod(superConstructor); mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuperOfCurrentMethod(); foreach (Script script in scripts) { script(mv); } mv.ReturnValue(); mv.EndMethod(); }); }
protected void ImplementPropertyChanged(PropertyInstance p_propertyChangeTemplate) { MethodInstance m_propertyChanged_super = MethodInstance.FindByTemplate(template_m_PropertyChanged, true); IMethodVisitor mv = VisitMethod(template_m_PropertyChanged); if (m_propertyChanged_super != null) { mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuperOfCurrentMethod(); } mv.CallThisGetter(p_propertyChangeTemplate); mv.LoadThis(); mv.LoadArgs(); // call PCT.HandlePropertyChange(this, sender, arg) mv.InvokeVirtual(m_handlePropertyChange); mv.ReturnValue(); mv.EndMethod(); }
protected void ImplementRelationSetter(String propertyName, MethodInstance m_set_template, FieldInstance f_initialized, FieldInstance f_objRefs) { // public void setPropertyName(String propertyName) // { // PropertyName$initialized = true; // PropertyName$objRefs = null; // super.setPropertyName(propertyName); // } MethodInstance m_set; { IMethodVisitor mg = base.VisitMethod(m_set_template); m_set = mg.Method; mg.PutThisField(f_initialized, delegate(IMethodVisitor mv2) { mg.PushEnum(ValueHolderState.INIT); }); mg.PutThisField(f_objRefs, delegate(IMethodVisitor mv2) { mv2.PushNull(); }); mg.LoadThis(); mg.LoadArgs(); mg.InvokeSuperOfCurrentMethod(); mg.ReturnVoidOrThis(); mg.EndMethod(); } // public void setPropertyName$NoInit(String propertyName) // { // super.setPropertyName(propertyName); // } { String noInitSetMethodName = ValueHolderIEC.GetSetterNameOfRelationPropertyWithNoInit(propertyName); IMethodVisitor mv = base.VisitMethod(m_set.Access, noInitSetMethodName, m_set.ReturnType, m_set.Parameters); mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuper(m_set); mv.ReturnVoidOrThis(); mv.EndMethod(); } }
protected void ImplementPropertyChangeConfigurable() { String fieldName = "__propertyChangeActive"; if (State.GetAlreadyImplementedField(fieldName) != null) { if (properties == null) { throw new Exception("It seems that this visitor has been executing twice"); } return; } else if (properties != null) { // do not apply in this case return; } FieldInstance f_propertyChangeActive = ImplementField(new FieldInstance(FieldAttributes.Private, fieldName, typeof(bool))); ConstructorInfo[] constructors = State.CurrentType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); for (int a = constructors.Length; a-- > 0;) { ConstructorInstance ci = new ConstructorInstance(constructors[a]); IMethodVisitor mv = VisitMethod(ci); mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuperOfCurrentMethod(); mv.PutThisField(f_propertyChangeActive, delegate(IMethodVisitor mg) { mg.Push(true); }); mv.ReturnValue(); mv.EndMethod(); } ImplementGetter(template_m_isPropertyChangeActive, f_propertyChangeActive); ImplementSetter(template_m_setPropertyChangeActive, f_propertyChangeActive); }
protected void ImplementRelationGetter(String propertyName, MethodInstance m_getMethod_template, MethodInstance m_setMethod, int relationIndex, PropertyInstance p_valueHolderContainerTemplate, PropertyInstance p_targetCache, PropertyInstance p_relationMembers, FieldInstance f_initialized, FieldInstance f_objRefs) { // public String getPropertyName() // { // if (!PropertyName$initialized) // { // setPropertyName(RelationsGetterVisitor.valueHolderContainer_getValue(this, $relationMembers, get__IndexOfPropertyName(), $targetCache, $beanContext, // propertyName$objRefs)); // } // return super.getPropertyName(); // } Script script_getVHC; if (EmbeddedEnhancementHint.HasMemberPath(State.Context)) { PropertyInstance p_rootEntity = EmbeddedTypeVisitor.GetRootEntityProperty(this); script_getVHC = delegate(IMethodVisitor mv) { mv.CallThisGetter(p_rootEntity); }; } else { script_getVHC = delegate(IMethodVisitor mv) { // this mv.LoadThis(); }; } MethodInstance m_getMethod; { PropertyInstance p_cacheModification = SetCacheModificationMethodCreator.GetCacheModificationPI(this); MethodInstance m_getMethod_scoped = new MethodInstance(State.NewType, MethodAttributes.HideBySig | MethodAttributes.Private | MethodAttributes.Final, NewType.VOID_TYPE, propertyName + "$DoInitialize"); { IMethodVisitor mg = VisitMethod(m_getMethod_scoped); // this => for this.setPropertyName(...) mg.LoadThis(); // call template.getValue(..) mg.CallThisGetter(p_valueHolderContainerTemplate); // getVhc() script_getVHC.Invoke(mg); // $relationMembers mg.CallThisGetter(p_relationMembers); // get__IndexOfPropertyName() mg.Push(relationIndex); // $targetCache mg.CallThisGetter(p_targetCache); // propertyName$objRefs mg.GetThisField(f_objRefs); mg.InvokeVirtual(m_template_getValue); mg.CheckCast(m_setMethod.Parameters[0].Type); mg.InvokeVirtual(m_setMethod); mg.ReturnValue(); mg.EndMethod(); } { IMethodVisitor mg = base.VisitMethod(m_getMethod_template); m_getMethod = mg.Method; HideFromDebug(m_getMethod); Label l_initialized = mg.NewLabel(); mg.GetThisField(f_initialized); mg.PushEnum(ValueHolderState.INIT); mg.IfCmp(typeof(ValueHolderState), CompareOperator.EQ, l_initialized); SetCacheModificationMethodCreator.CacheModificationInternalUpdate(p_cacheModification, mg, delegate(IMethodVisitor mv2) { mv2.LoadThis(); mv2.InvokeOnExactOwner(m_getMethod_scoped); }); mg.Mark(l_initialized); mg.LoadThis(); mg.InvokeSuperOfCurrentMethod(); mg.ReturnValue(); mg.EndMethod(); } } // public String getPropertyName$NoInit() // { // return super.getPropertyName(); // } { MethodInstance m_getNoInit = m_getMethod_template.DeriveName(ValueHolderIEC.GetGetterNameOfRelationPropertyWithNoInit(propertyName)); IMethodVisitor mg = base.VisitMethod(m_getNoInit); PropertyInstance p_getNoInit = PropertyInstance.FindByTemplate(propertyName + ValueHolderIEC.GetNoInitSuffix(), m_getNoInit.ReturnType, false); p_getNoInit.AddAnnotation(c_fireThisOPC, propertyName); p_getNoInit.AddAnnotation(c_fireTargetOPC, propertyName); mg.LoadThis(); mg.InvokeSuper(m_getMethod); mg.ReturnValue(); mg.EndMethod(); } }
protected void ImplementConstructors() { if (metaData.RelationMembers.Length == 0) { return; } RelationMember[] relationMembers = metaData.RelationMembers; List <FieldInstance[]> fieldsList = new List <FieldInstance[]>(); for (int a = relationMembers.Length; a-- > 0;) { RelationMember relationMember = relationMembers[a]; relationMember = (RelationMember)GetApplicableMember(relationMember); if (relationMember == null) { // member is handled in another type continue; } String propertyName = relationMember.Name; String fieldName = ValueHolderIEC.GetObjRefsFieldName(propertyName); FieldInstance field = State.GetAlreadyImplementedField(fieldName); String fieldName2 = ValueHolderIEC.GetInitializedFieldName(propertyName); FieldInstance field2 = State.GetAlreadyImplementedField(fieldName2); fieldsList.Add(new FieldInstance[] { field, field2 }); } if (fieldsList.Count == 0) { return; } PropertyInstance p_emptyRelations = ImplementAssignedReadonlyProperty("EmptyRelations", ObjRef.EMPTY_ARRAY); OverrideConstructors(delegate(IClassVisitor cv, ConstructorInstance superConstructor) { IMethodVisitor mv = cv.VisitMethod(superConstructor); mv.LoadThis(); mv.LoadArgs(); mv.InvokeSuperOfCurrentMethod(); LocalVariableInfo loc_emptyRelations = mv.NewLocal <IObjRef[]>(); LocalVariableInfo loc_lazyState = mv.NewLocal <ValueHolderState>(); mv.CallThisGetter(p_emptyRelations); mv.StoreLocal(loc_emptyRelations); mv.PushEnum(ValueHolderState.LAZY); mv.StoreLocal(loc_lazyState); foreach (FieldInstance[] fields in fieldsList) { mv.PutThisField(fields[0], delegate(IMethodVisitor mv2) { mv2.LoadLocal(loc_emptyRelations); }); mv.PutThisField(fields[1], delegate(IMethodVisitor mv2) { mv2.LoadLocal(loc_lazyState); }); } mv.ReturnValue(); mv.EndMethod(); }); }