public BeatVerb(IContextGeneratingVerb contextVerb, BuildObject beatobj, string appLabel) { this.contextVerb = contextVerb; this.beatobj = beatobj; this.appLabel = appLabel; this.abstractId = new AbstractId(this.GetType().Name, version, beatobj.ToString(), contextVerb.getPoundDefines(), concrete: appLabel); }
public BoogieVerb(IContextGeneratingVerb context, BuildObject bplInput, VerificationRequest.SymDiffMode symdiff) { if (bplInput.getExtension().Equals(BPL_EXTN)) { this.bplInput = bplInput; upstreamVerbs = new List <IVerb>(); // TODO this will probably break, since we don't know where this bplInput came from. Maybe that's okay, since the verb had to already exist to reach this point. } else if (symdiff == VerificationRequest.SymDiffMode.NoSymDiff) { IVerb boogieAsmVerb = new BoogieAsmVerifyVerb(context, bplInput, false); this.bplInput = boogieAsmVerb.getOutputs().First(); upstreamVerbs = new IVerb[] { boogieAsmVerb }; } else { IVerb workerVerb; SymDiffEngine.BuildPipeline(context, bplInput, out this.bplInput, out workerVerb); upstreamVerbs = new IVerb[] { workerVerb }; } this.abstractId = new AbstractId( this.GetType().Name, version, bplInput.ToString(), concrete: symdiff.ToString()); }
public static void propagatePrivateImports( WorkingDirectory workingDirectory, IContextGeneratingVerb contextVerb, BuildObject srcobj, BuildObject dstobj) { // Rewrite basm output to propagate any import statements from the beat file. // TODO this step really should be a beat function, not part of the build system. IEnumerable <BeatIncludes.LabeledInclude> beatImports = getBeatFlavoredShallowIncludesLabeled(contextVerb, srcobj); StringBuilder sb = new StringBuilder(); foreach (BeatIncludes.LabeledInclude li in beatImports) { sb.Append("//-"); sb.Append(li.importFilter == BeatIncludes.ImportFilter.ForBasmOnly ? "private-basmonly-import" : "private-import"); sb.Append(" "); sb.Append(li.buildObject.getFileNameWithoutExtension()); sb.AppendLine(";"); } // REVIEW: Improve upon this round-about way of prepending to a file? string beatOutput = File.ReadAllText(workingDirectory.PathTo(dstobj)); File.Delete(workingDirectory.PathTo(dstobj)); File.WriteAllText(workingDirectory.PathTo(dstobj), sb.ToString() + beatOutput); }
public BoogieVerb(IContextGeneratingVerb context, BuildObject bplInput, VerificationRequest.SymDiffMode symdiff) { if (bplInput.getExtension().Equals(BPL_EXTN)) { this.bplInput = bplInput; upstreamVerbs = new List<IVerb>(); // TODO this will probably break, since we don't know where this bplInput came from. Maybe that's okay, since the verb had to already exist to reach this point. } else if (symdiff == VerificationRequest.SymDiffMode.NoSymDiff) { IVerb boogieAsmVerb = new BoogieAsmVerifyVerb(context, bplInput, false); this.bplInput = boogieAsmVerb.getOutputs().First(); upstreamVerbs = new IVerb[] { boogieAsmVerb }; } else { IVerb workerVerb; SymDiffEngine.BuildPipeline(context, bplInput, out this.bplInput, out workerVerb); upstreamVerbs = new IVerb[] { workerVerb }; } this.abstractId = new AbstractId( this.GetType().Name, version, bplInput.ToString(), concrete: symdiff.ToString()); }
public BeatVerb(IContextGeneratingVerb contextVerb, BuildObject beatobj, string appLabel) { this.contextVerb = contextVerb; this.beatobj = beatobj; this.appLabel = appLabel; this.abstractId = new AbstractId(this.GetType().Name, version, beatobj.ToString(), contextVerb.getPoundDefines(), concrete: appLabel); }
public static IEnumerable <BuildObject> getBeatFlavoredShallowIncludes( IContextGeneratingVerb contextVerb, BuildObject rootObj, BeatIncludes.ImportFilter importFilter) { return(getBeatFlavoredShallowIncludesLabeled(contextVerb, rootObj) .Where(li => importFilter == BeatIncludes.ImportFilter.ForBasmOnly || li.importFilter == BeatIncludes.ImportFilter.ForBeatOrBasm) .Select(li => li.buildObject)); }
public EntryStitcherVerb(IContextGeneratingVerb context, string appLabel) { this.appLabel = appLabel; this.context = context; this.entryImpInput = new SourcePath("src\\Checked\\Nucleus\\Main\\Entry.imp.beat"); SourcePath mainBeatSrc = new SourcePath("src\\Checked\\Nucleus\\Main\\Main.ifc.beat"); this.mainBeatVerb = new BeatVerb(context, mainBeatSrc, appLabel); this.genericStitch = new SourcePath("src\\Trusted\\Spec\\Entry.ifc.basm.stitch"); this.appSpecificStitch = new SourcePath(string.Format("src\\Trusted\\Spec\\{0}\\AppRequirements.ifc.stitch", appLabel)); }
public EntryStitcherVerb(IContextGeneratingVerb context, string appLabel) { this.appLabel = appLabel; this.context = context; this.entryImpInput = new SourcePath("src\\Checked\\Nucleus\\Main\\Entry.imp.beat"); SourcePath mainBeatSrc = new SourcePath("src\\Checked\\Nucleus\\Main\\Main.ifc.beat"); this.mainBeatVerb = new BeatVerb(context, mainBeatSrc, appLabel); this.genericStitch = new SourcePath("src\\Trusted\\Spec\\Entry.ifc.basm.stitch"); this.appSpecificStitch = new SourcePath(string.Format("src\\Trusted\\Spec\\{0}\\AppRequirements.ifc.stitch", appLabel)); }
public EntryStitcherVerb(IContextGeneratingVerb context, string appLabel) { this.appLabel = appLabel; this.context = context; entryImpInput = new SourcePath("src/Checked/Nucleus/Main/Entry.imp.beat"); SourcePath mainBeatSrc = new SourcePath("src/Checked/Nucleus/Main/Main.ifc.beat"); mainBeatVerb = new BeatVerb(context, mainBeatSrc, appLabel); genericStitch = new SourcePath("src/Trusted/Spec/Entry.ifc.basm.stitch"); appSpecificStitch = new SourcePath(String.Format("src/Trusted/Spec/{0}/AppRequirements.ifc.stitch", appLabel)); }
public static void BuildPipeline(IContextGeneratingVerb context, BuildObject input, out BuildObject bplFile, out IVerb workerVerb) { BoogieAsmVerifyVerb basmVerb = new BoogieAsmVerifyVerb(context, input, true); SymDiffExtractVerb left = new SymDiffExtractVerb(basmVerb, SymDiffExtractVerb.Mode.LEFT); SymDiffExtractVerb right = new SymDiffExtractVerb(basmVerb, SymDiffExtractVerb.Mode.RIGHT); SymDiffInferVerb infer = new SymDiffInferVerb(left, right); SymDiffMergeConfigVerb mergeConfig = new SymDiffMergeConfigVerb(basmVerb, infer); SymDiffCombineVerb combiner = new SymDiffCombineVerb(left, right, mergeConfig); SymDiffMergeVerb merger = new SymDiffMergeVerb(basmVerb, combiner); bplFile = merger.getOutputFile(); workerVerb = merger; }
public static void BuildPipeline(IContextGeneratingVerb context, BuildObject input, out BuildObject bplFile, out IVerb workerVerb) { BoogieAsmVerifyVerb basmVerb = new BoogieAsmVerifyVerb(context, input, true); SymDiffExtractVerb left = new SymDiffExtractVerb(basmVerb, SymDiffExtractVerb.Mode.LEFT); SymDiffExtractVerb right = new SymDiffExtractVerb(basmVerb, SymDiffExtractVerb.Mode.RIGHT); SymDiffInferVerb infer = new SymDiffInferVerb(left, right); SymDiffMergeConfigVerb mergeConfig = new SymDiffMergeConfigVerb(basmVerb, infer); SymDiffCombineVerb combiner = new SymDiffCombineVerb(left, right, mergeConfig); SymDiffMergeVerb merger = new SymDiffMergeVerb(basmVerb, combiner); bplFile = merger.getOutputFile(); workerVerb = merger; }
private static IEnumerable <BeatIncludes.LabeledInclude> getBeatFlavoredShallowIncludesLabeled( IContextGeneratingVerb contextVerb, BuildObject rootObj) { ContextContents context = (ContextContents) BuildEngine.theEngine.getNuObjContents().openVirtual(contextVerb.getContextOutput()); BeatIncludes includes = new BeatIncludes(context.context); OrderPreservingSet <BeatIncludes.LabeledInclude> result = new OrderPreservingSet <BeatIncludes.LabeledInclude>( includes.getLabeledIncludes(rootObj)); if (BeatExtensions.whichPart(rootObj) == ModPart.Imp) { BuildObject rootIfc = context.context.search(rootObj.getFileNameWithoutExtension(), ModPart.Ifc); result.Add(new BeatIncludes.LabeledInclude(BeatIncludes.ImportFilter.ForBeatOrBasm, rootIfc)); } return(result); }
private static IEnumerable<BeatIncludes.LabeledInclude> getBeatFlavoredShallowIncludesLabeled( IContextGeneratingVerb contextVerb, BuildObject rootObj) { ContextContents context = (ContextContents) BuildEngine.theEngine.Repository.FetchVirtual(contextVerb.getContextOutput()); BeatIncludes includes = new BeatIncludes(context.Context); OrderPreservingSet<BeatIncludes.LabeledInclude> result = new OrderPreservingSet<BeatIncludes.LabeledInclude>( includes.getLabeledIncludes(rootObj)); if (BeatExtensions.whichPart(rootObj) == ModPart.Imp) { BuildObject rootIfc = context.Context.search(rootObj.getFileNameWithoutExtension(), ModPart.Ifc); result.Add(new BeatIncludes.LabeledInclude(BeatIncludes.ImportFilter.ForBeatOrBasm, rootIfc)); } return result; }
internal static IIncludePathContext fetchIfAvailable(this IContextGeneratingVerb verb, ref DependencyDisposition ddisp) { try { return(((ContextContents) BuildEngine.theEngine.Repository.FetchVirtual(verb.getContextOutput())).Context); } catch (ObjectNotReadyException) { // Oh, we don't even have the context object yet. ddisp = ddisp.combine(DependencyDisposition.Incomplete); } catch (ObjectFailedException) { ddisp = ddisp.combine(DependencyDisposition.Failed); } return(null); }
//- This used to use a BeatTransitiveDepsVerb, but we're going with shallow dependencies at the moment. //- We may want to restore that behavior later, if we can get some sane transitive dep tree worked out for //- Verve code. //- The returned list belongs to the caller to .Add() to as desired. //- TODO this really needs to be factored to supply the actual Beat-flavored references separately //- from the auxiliary deps (transitive dep objects and context dep objects), so we don't have //- client code trying to filter back out the part it wants. Brittle. public static OrderPreservingSet <BuildObject> getBeatFlavoredShallowDependencies( IContextGeneratingVerb contextVerb, BuildObject rootObj, out DependencyDisposition ddisp, BeatIncludes.ImportFilter filter) { OrderPreservingSet <BuildObject> result = new OrderPreservingSet <BuildObject>(); result.Add(contextVerb.getContextOutput()); try { result.AddRange(getBeatFlavoredShallowIncludes(contextVerb, rootObj, filter)); ddisp = DependencyDisposition.Complete; } catch (ObjNotReadyException) { ddisp = DependencyDisposition.Incomplete; } catch (ObjFailedException) { ddisp = DependencyDisposition.Failed; } result.Add(rootObj); //- root really needs to go at the end of the list. return(result); }
public static BasmTransitiveDepsVerb getBasmFlavoredTransitiveDepVerb(IContextGeneratingVerb context, BuildObject rootObj) { return new BasmTransitiveDepsVerb(context, rootObj); }
public BasmModuleAccumulator(IContextGeneratingVerb contextGenVerb, BuildObject upstreamObj, bool linkMode) { this._contextGenVerb = contextGenVerb; this._mutableVerbSet = new HashSet <IVerb>(); //- NB preserve module definition-dependency order this._basmModules = new OrderPreservingSet <BuildObject>(); this._auxiliaryDeps = new HashSet <BuildObject>(); _ddisp = DependencyDisposition.Complete; //-try //-{ _mutableVerbSet.Add(contextGenVerb); _auxiliaryDeps.UnionWith(contextGenVerb.getOutputs()); context = contextGenVerb.fetchIfAvailable(ref _ddisp); if (context != null) { OrderPreservingSet <BuildObject> deps; if (!linkMode) { deps = BeatExtensions.getBeatFlavoredShallowDependencies( contextGenVerb, upstreamObj, out _ddisp, BeatIncludes.ImportFilter.ForBasmOnly); } else { deps = BeatExtensions.getBasmFlavoredTransitiveDependencies(contextGenVerb, upstreamObj, out _ddisp); _mutableVerbSet.Add(BeatExtensions.getBasmFlavoredTransitiveDepVerb(_contextGenVerb, upstreamObj)); } string targetModName = upstreamObj.getFileNameWithoutExtension(); ModPart targetModPart = BeatExtensions.whichPart(upstreamObj); //- NB security policy note: When verifying X.imp, we must be sure to supply X.ifc //- to BoogieAsm, so that we know that we're actually verifying the promises //- that other modules are relying on when they say "X" (which is how X got on //- the verification obligation list). That property happens automatically here, //- because we make a list of modules (ignoring ifc/imp part), such as {A,B,X}, //- and include *every* .ifc. If we're verifying X.imp, a conditional test //- includes it at the time we consider module X. foreach (BuildObject dep in deps) { string depExtn = dep.getExtension(); if (depExtn == null || depExtn.EndsWith(TransitiveDepsVerb.TDEP_EXTN) || depExtn.EndsWith(ContextGeneratingVerb.CONTEXT_EXTN)) { _auxiliaryDeps.Add(dep); } else { Util.Assert(depExtn.Equals(BeatExtensions.BEATIFC_EXTN) || depExtn.Equals(BeatExtensions.BEATIMP_EXTN) || depExtn.Equals(BASMIFC_EXTN) || depExtn.Equals(BASMIMP_EXTN)); //- Burned too many times by this silly filter-out strategy. string modName = dep.getFileNameWithoutExtension(); ModPart modPart = BeatExtensions.whichPart(dep); getBasmModule(modName, ModPart.Ifc); if ((dep.Equals(upstreamObj) && modPart == ModPart.Imp) || linkMode) { getBasmModule(modName, ModPart.Imp); } } } } //-} //-catch (ObjNotReadyException) //-{ //- //- _ddisp = DependencyDisposition.Incomplete; //-} //-catch (ObjFailedException) //-{ //- _ddisp = DependencyDisposition.Failed; //-} }
public BoogieAsmWorkerBase(IContextGeneratingVerb context, BuildObject input) : base(context, input) { }
// The list belongs to the caller to .Add() to as desired. public static OrderPreservingSet<BuildObject> getBasmFlavoredTransitiveDependencies(IContextGeneratingVerb context, BuildObject rootObj, out DependencyDisposition ddisp) { OrderPreservingSet<BuildObject> result = new OrderPreservingSet<BuildObject>(); TransitiveDepsVerb depsVerb = getBasmFlavoredTransitiveDepVerb(context, rootObj); result.Add(depsVerb.depsObj()); result.AddRange(depsVerb.getAvailableDeps(out ddisp)); // NB add root object at end of list, to keep it in definition-dependency order. result.Add(rootObj); return result; }
public ConcatContextVerb(IContextGeneratingVerb parentA, IContextGeneratingVerb parentB, IContextGeneratingVerb parentC, PoundDefines poundDefines) : this(new IContextGeneratingVerb[] { parentA, parentB, parentC }, poundDefines) { }
//- The list belongs to the caller to .Add() to as desired. public static OrderPreservingSet <BuildObject> getBasmFlavoredTransitiveDependencies(IContextGeneratingVerb context, BuildObject rootObj, out DependencyDisposition ddisp) { OrderPreservingSet <BuildObject> result = new OrderPreservingSet <BuildObject>(); TransitiveDepsVerb depsVerb = getBasmFlavoredTransitiveDepVerb(context, rootObj); result.Add(depsVerb.depsObj()); result.AddRange(depsVerb.getAvailableDeps(out ddisp)); //- NB add root object at end of list, to keep it in definition-dependency order result.Add(rootObj); return(result); }
public ConcatContextVerb(IContextGeneratingVerb parentA, IContextGeneratingVerb parentB, IContextGeneratingVerb parentC, PoundDefines poundDefines) : this(new IContextGeneratingVerb[] { parentA, parentB, parentC }, poundDefines) { }
// This used to use a BeatTransitiveDepsVerb, but we're going with shallow dependencies at the moment. // We may want to restore that behavior later, if we can get some sane transitive dep tree worked out for // Verve code. // The returned list belongs to the caller to .Add() to as desired. // TODO this really needs to be factored to supply the actual Beat-flavored references separately // from the auxiliary deps (transitive dep objects and context dep objects), so we don't have // client code trying to filter back out the part it wants. Brittle. public static OrderPreservingSet<BuildObject> getBeatFlavoredShallowDependencies( IContextGeneratingVerb contextVerb, BuildObject rootObj, out DependencyDisposition ddisp, BeatIncludes.ImportFilter filter) { OrderPreservingSet<BuildObject> result = new OrderPreservingSet<BuildObject>(); result.Add(contextVerb.getContextOutput()); try { result.AddRange(getBeatFlavoredShallowIncludes(contextVerb, rootObj, filter)); ddisp = DependencyDisposition.Complete; } catch (ObjectNotReadyException) { ddisp = DependencyDisposition.Incomplete; } catch (ObjectFailedException) { ddisp = DependencyDisposition.Failed; } result.Add(rootObj); // root really needs to go at the end of the list. return result; }
public BoogieAsmLinkVerb(IContextGeneratingVerb context, BuildObject input) : base(context, input) { }
public static IEnumerable<BuildObject> getBeatFlavoredShallowIncludes( IContextGeneratingVerb contextVerb, BuildObject rootObj, BeatIncludes.ImportFilter importFilter) { return getBeatFlavoredShallowIncludesLabeled(contextVerb, rootObj) .Where(li => importFilter == BeatIncludes.ImportFilter.ForBasmOnly || li.importFilter == BeatIncludes.ImportFilter.ForBeatOrBasm) .Select(li => li.buildObject); }
public static void propagatePrivateImports( WorkingDirectory workingDirectory, IContextGeneratingVerb contextVerb, BuildObject srcobj, BuildObject dstobj) { // Rewrite basm output to propagate any import statements from the beat file. // TODO this step really should be a beat function, not part of the build system. IEnumerable<BeatIncludes.LabeledInclude> beatImports = getBeatFlavoredShallowIncludesLabeled(contextVerb, srcobj); StringBuilder sb = new StringBuilder(); foreach (BeatIncludes.LabeledInclude li in beatImports) { sb.Append("//-"); sb.Append(li.importFilter == BeatIncludes.ImportFilter.ForBasmOnly ? "private-basmonly-import" : "private-import"); sb.Append(" "); sb.Append(li.buildObject.getFileNameWithoutExtension()); sb.AppendLine(";"); } // REVIEW: Improve upon this round-about way of prepending to a file? string beatOutput = File.ReadAllText(workingDirectory.PathTo(dstobj)); File.Delete(workingDirectory.PathTo(dstobj)); File.WriteAllText(workingDirectory.PathTo(dstobj), sb.ToString() + beatOutput); }
public BoogieAsmWorkerBase(IContextGeneratingVerb context, BuildObject input) : base(context, input) { }
public BasmTransitiveDepsVerb(IContextGeneratingVerb contextVerb, BuildObject input) : base(input) { this.contextVerb = contextVerb; }
public BoogieAsmDepBase(IContextGeneratingVerb context, BuildObject input) { this.context = context; this.upstreamObj = input; this.basmInput = computeBasmInput(context.getPoundDefines(), input); }
public BasmModuleAccumulator(IContextGeneratingVerb contextGenVerb, BuildObject upstreamObj, bool linkMode) { this._contextGenVerb = contextGenVerb; this._mutableVerbSet = new HashSet<IVerb>(); // NB preserve module definition-dependency order. this._basmModules = new OrderPreservingSet<BuildObject>(); this._auxiliaryDeps = new HashSet<BuildObject>(); _ddisp = DependencyDisposition.Complete; ////try ////{ _mutableVerbSet.Add(contextGenVerb); _auxiliaryDeps.UnionWith(contextGenVerb.getOutputs()); context = contextGenVerb.fetchIfAvailable(ref _ddisp); if (context != null) { OrderPreservingSet<BuildObject> deps; if (!linkMode) { deps = BeatExtensions.getBeatFlavoredShallowDependencies( contextGenVerb, upstreamObj, out _ddisp, BeatIncludes.ImportFilter.ForBasmOnly); } else { deps = BeatExtensions.getBasmFlavoredTransitiveDependencies(contextGenVerb, upstreamObj, out _ddisp); _mutableVerbSet.Add(BeatExtensions.getBasmFlavoredTransitiveDepVerb(_contextGenVerb, upstreamObj)); } // REVIEW: The following two variables are unused. Remove? string targetModName = upstreamObj.getFileNameWithoutExtension(); ModPart targetModPart = BeatExtensions.whichPart(upstreamObj); // NB security policy note: When verifying X.imp, we must be sure to supply X.ifc // to BoogieAsm, so that we know that we're actually verifying the promises // that other modules are relying on when they say "X" (which is how X got on // the verification obligation list). That property happens automatically here, // because we make a list of modules (ignoring ifc/imp part), such as {A,B,X}, // and include *every* .ifc. If we're verifying X.imp, a conditional test // includes it at the time we consider module X. foreach (BuildObject dep in deps) { string depExtn = dep.getExtension(); if (depExtn == null || depExtn.EndsWith(TransitiveDepsVerb.TDEP_EXTN) || depExtn.EndsWith(ContextGeneratingVerb.CONTEXT_EXTN)) { _auxiliaryDeps.Add(dep); } else { Util.Assert(depExtn.Equals(BeatExtensions.BEATIFC_EXTN) || depExtn.Equals(BeatExtensions.BEATIMP_EXTN) || depExtn.Equals(BASMIFC_EXTN) || depExtn.Equals(BASMIMP_EXTN)); // Burned too many times by this silly filter-out strategy. string modName = dep.getFileNameWithoutExtension(); ModPart modPart = BeatExtensions.whichPart(dep); getBasmModule(modName, ModPart.Ifc); if ((dep.Equals(upstreamObj) && modPart == ModPart.Imp) || linkMode) { getBasmModule(modName, ModPart.Imp); } } } } ////} ////catch (ObjNotReadyException) ////{ //// // oh, we don't even have the context object yet. //// _ddisp = DependencyDisposition.Incomplete; ////} ////catch (ObjFailedException) ////{ //// _ddisp = DependencyDisposition.Failed; ////} }
public BoogieAsmVerifyVerb(IContextGeneratingVerb context, BuildObject input, bool buildSymDiffMutualSummary) : base(context, input) { this.buildSymDiffMutualSummary = buildSymDiffMutualSummary; this.enableSymdiff = BoogieAsmVerifyVerb.needs_symdiff(basmInput); }
public static BasmTransitiveDepsVerb getBasmFlavoredTransitiveDepVerb(IContextGeneratingVerb context, BuildObject rootObj) { return(new BasmTransitiveDepsVerb(context, rootObj)); }
public BoogieAsmVerificationObligationListVerb(IContextGeneratingVerb context, BuildObject input, VerificationRequest verificationRequest) : base(context, input) { this.verificationRequest = verificationRequest; obligations = input.makeOutputObject(BASM_EXTN + VerificationObligationList.VOL_EXTN); }
public BoogieAsmVerifyVerb(IContextGeneratingVerb context, BuildObject input, bool buildSymDiffMutualSummary) : base(context, input) { this.buildSymDiffMutualSummary = buildSymDiffMutualSummary; this.enableSymdiff = BoogieAsmVerifyVerb.needs_symdiff(basmInput); }
public BoogieAsmVerificationObligationListVerb(IContextGeneratingVerb context, BuildObject input, VerificationRequest verificationRequest) : base(context, input) { this.verificationRequest = verificationRequest; obligations = input.makeOutputObject(BASM_EXTN + VerificationObligationList.VOL_EXTN); }
public BoogieAsmDepBase(IContextGeneratingVerb context, BuildObject input) { this.context = context; this.upstreamObj = input; this.basmInput = computeBasmInput(context.getPoundDefines(), input); }
public BoogieAsmLinkVerb(IContextGeneratingVerb context, BuildObject input) : base(context, input) { }
public BasmTransitiveDepsVerb(IContextGeneratingVerb contextVerb, BuildObject input) : base(input) { this.contextVerb = contextVerb; }