/** Preserve the state of an interpreter into this frame. */
 public void preserveState(List<Node> trail) {
   // Save the trail state
   int trailLen = trail.size();
   if (trailLen > trailLength) {
     trailValues = new Node[trailLen];
     trailVars = new Node_RuleVariable[trailLen];
   }
   trailLength = trailLen;
   for (int i = 0; i < trailLen; i++) {
     Node_RuleVariable var = (Node_RuleVariable) trail.get(i);
     trailVars[i] = var;
     trailValues[i] = var.getRawBoundValue();
   }
   // Save the permanent variables
   Node[] currentPVars = envFrame.pVars;
   if (currentPVars != null) {
     if (pVars == null || pVars.length < currentPVars.length) {
       pVars = new Node[currentPVars.length];
     }
     System.arraycopy(currentPVars, 0, pVars, 0, currentPVars.length);
   }
 }