executeEqual ::
  Options                                          ->
  SharedContext                                    ->
  JVMCrucibleContext                                  ->
  CrucibleMethodSpecIR                             ->
  SetupValue       {- ^ first value to compare  -} ->
  SetupValue       {- ^ second value to compare -} ->
  OverrideMatcher CJ.JVM w ()
executeEqual opts sc cc spec v1 v2 =
  do val1 <- resolveSetupValueJVM opts cc sc spec v1
     val2 <- resolveSetupValueJVM opts cc sc spec v2
     p <- liftIO (equalValsPred cc val1 val2)
     addAssume p

-- | Process a "crucible_postcond" statement from the postcondition
-- section of the CrucibleSetup block.
executeEqual ::
  Options                                          ->
  SharedContext                                    ->
  JVMCrucibleContext                                  ->
  CrucibleMethodSpecIR                             ->
  SetupValue       {- ^ first value to compare  -} ->
  SetupValue       {- ^ second value to compare -} ->
  OverrideMatcher CJ.JVM w ()
executeEqual opts sc cc spec v1 v2 =
  do val1 <- resolveSetupValueJVM opts cc sc spec v1
     val2 <- resolveSetupValueJVM opts cc sc spec v2
     p <- liftIO (equalValsPred cc val1 val2)
     addAssume p

-- | Process a "crucible_postcond" statement from the postcondition
-- section of the CrucibleSetup block.
executeEqual opts sc cc spec v1 v2 =
  do val1 <- resolveSetupValueJVM opts cc sc spec v1
     val2 <- resolveSetupValueJVM opts cc sc spec v2
     p <- liftIO (equalValsPred cc val1 val2)
     addAssume p

-- | Process a "crucible_postcond" statement from the postcondition
-- section of the CrucibleSetup block.