static void run(options_cptr &options) { console_kax_analyzer_cptr analyzer; try { if (!kax_analyzer_c::probe(options->m_file_name)) mxerror(boost::format("The file '%1%' is not a Matroska file or it could not be found.\n") % options->m_file_name); analyzer = console_kax_analyzer_cptr(new console_kax_analyzer_c(options->m_file_name)); } catch (mtx::mm_io::exception &ex) { mxerror(boost::format("The file '%1%' could not be opened for reading and writing: %1.\n") % options->m_file_name % ex); } mxinfo(boost::format("%1%\n") % Y("The file is being analyzed.")); analyzer->set_show_progress(options->m_show_progress); bool ok = false; try { ok = analyzer ->set_parse_mode(options->m_parse_mode) .set_open_mode(MODE_WRITE) .set_throw_on_error(true) .process(); } catch (mtx::mm_io::exception &ex) { mxerror(boost::format(Y("The file '%1%' could not be opened for reading and writing, or a read/write operation on it failed: %2%.\n")) % options->m_file_name % ex); } catch (...) { } if (!ok) mxerror(Y("This file could not be opened or parsed.\n")); options->find_elements(analyzer.get()); options->validate(); if (debugging_c::requested("dump_options")) { mxinfo("\nDumping options after file and element analysis\n\n"); options->dump_info(); } options->execute(*analyzer); if (has_content_been_modified(options)) { mxinfo(Y("The changes are written to the file.\n")); write_changes(options, analyzer.get()); mxinfo(Y("Done.\n")); } else mxinfo(Y("No changes were made.\n")); mxexit(); }
RawLocation::Actions RawLocation::do_conform_to(int my_index, RawLocation* other, int other_index, RawLocation::Actions allowed_actions) { // make sure object registers and locations have object values if (other->stack_type() == T_OBJECT && stack_type() != T_OBJECT) { // Conformance code makes it so that this is no longer necessary. SHOULD_NOT_REACH_HERE(); #if NOT_CURRENTLY_USED // if we clear an cached object location there's no need to clear // any registers, since the register cache (due to type conflicts) is // guaranteed never to be used again if (other.is_flushed() || other.is_cached()) { code_generator()->clear_object_location(index()); } else { GUARANTEE(other.is_changed(), "only case left"); Value other_value(other.type()); other.read_value(other_value); Oop::Raw null_obj; code_generator()->move(other_value, &null_obj); } return; #endif } // compute the merge action const Actions required_actions = merge_actions(other); const Actions actions = required_actions & allowed_actions; // handle loads/stores from/to locations if (actions & LOC_LOAD) { other->update_cache(other_index); } if (actions & LOC_STORE) { write_changes(my_index); } // handle register stores if (actions & REG_STORE && other->in_register()) { // declare & read values for both source and destination const Value this_value (this, my_index ); const Value other_value(other, other_index); // do the register store if (!other->is_register_identical_to(my_index, this, other_index)) { code_generator()->move(other_value, this_value); } } return required_actions & ~allowed_actions; }
static void run(options_cptr &options) { console_kax_analyzer_cptr analyzer; try { if (!kax_analyzer_c::probe(options->m_file_name)) mxerror(boost::format("The file '%1%' is not a Matroska file or it could not be found.\n") % options->m_file_name); analyzer = console_kax_analyzer_cptr(new console_kax_analyzer_c(options->m_file_name)); } catch (...) { mxerror(boost::format("The file '%1%' could not be opened for read/write access.\n") % options->m_file_name); } mxinfo(Y("The file is analyzed.\n")); analyzer->set_show_progress(options->m_show_progress); if (!analyzer->process(options->m_parse_mode)) mxerror(Y("This file could not be opened or parsed.\n")); options->find_elements(analyzer.get_object()); options->validate(); if (debugging_requested("dump_options")) { mxinfo("\nDumping options after file and element analysis\n\n"); options->dump_info(); } options->execute(); mxinfo(Y("The changes are written to the file.\n")); write_changes(options, analyzer.get_object()); mxinfo(Y("Done.\n")); mxexit(0); }
void write_changes(const Assembler::Register reg, const int index) { if (is_changed() && in_register() && uses_register(reg)) { write_changes(index); } }
void RawLocation::flush(int index) { // write any changes to memory write_changes(index); // mark the location as being flushed mark_as_flushed(); }