-F Mnemonic: Failure. Used for plugins which print "Failure" to indicate error. Run phc with the plugin to determine failure. -Z Require script to return zero when run through interpreter Sample commands: reduce -v test/subjects/codegen/0001.php reduce "-c--run=plugins/tools/debug_zval.la -dump-xml=plugins/tools/debug_zval.la" test/subjects/codegen/0001.php reduce -v 0001.uhir.php reduce -F plugins/tests/limit_assignments.la test/subjects/codegen/bench_simple.php EOL ); } $filename = $arguments[0]; $reduce = new Reduce($filename); $reduce->set_phc("src/phc"); $reduce->set_comment($command_line); $reduce->set_plugin_path($opt_phc_prefix); $reduce->set_run_command_function("myrun"); $reduce->set_debug_function("mydebug"); $reduce->set_dump_function("mydump"); // Checking functions $reduce->set_checking_function("check_against_compiled"); if ($opt_failure) { $reduce->set_checking_function("check_for_failure_string"); } if ($opt_interpret) { $reduce->set_checking_function("check_against_interpreted"); } $input = file_get_contents($filename); // TODO: call this on the first instance
function reduce_failure($reason, $bundle) { inst("reduce failure: {$reason}, {$bundle->subject}"); global $phc; $subject = $bundle->subject; if (isset($this->is_special_reduction[$subject])) { // Found: we're already reducing, and the bug is kept in $this->reduction_result[$subject] = true; } else { // Start reducing try { $reduce = new Reduce(); $this->reductions[$subject] = $reduce; $reduce->set_checking_function(array($this, "reduce_checking_function")); $reduce->set_run_command_function(array($this, "reduce_run_function")); $reduce->set_phc($phc); $reduce->set_debug_function(array($this, "reduce_debug_function")); // Get the file, and send it to the reducer $contents = file_get_contents($subject); if (!$reduce->has_syntax_errors($contents)) { $final_contents = $reduce->run_on_php($contents); file_put_contents("{$subject}.{$this->get_name()}_reduced", $final_contents); } } catch (ReduceException $e) { // There can be lots of reasons for this, many benign. Ignore it. } $this->mark_failure($bundle->subject, $bundle->commands, $bundle->outs, $bundle->errs, $bundle->exits, $reason); } }