std::pair< bool, bool > parser::parse(const char* begin, const char* end) { assert( !state_.empty() ); for ( ; begin != end && !state_.empty(); ) { switch ( main_state( state_.top() ) ) { case idle_parsing: begin = eat_white_space(begin, end); if ( begin != end ) { state_.top() = parse_idle(*begin); } break; case start_number_parsing: begin = parse_number(begin, end); break; case start_array_parsing: begin = parse_array(begin, end); break; case start_object_parsing: begin = parse_object(begin, end); break; case start_string_parsing: begin = parse_string(begin, end); break; case start_true_parsing: case start_false_parsing: case start_null_parsing: begin = parse_literal(begin, end); break; default: assert(!"should not happen"); } } // consume trailing whitespaces if ( state_.empty() ) begin = eat_white_space(begin, end); return std::make_pair( begin == end, state_.empty() ); }
void Environment::boot() { state->shared().start_diagnostics(state); std::string codedb_path = system_prefix() + RBX_CODEDB_PATH; { timer::StopWatch<timer::microseconds> timer( state->shared().boot_metrics()->platform_us); load_platform_conf(codedb_path); } { timer::StopWatch<timer::microseconds> timer( state->shared().boot_metrics()->memory_us); shared->om = new Memory(state->vm(), *shared); } shared->set_initialized(); state->vm()->managed_phase(state); { timer::StopWatch<timer::microseconds> timer( state->shared().boot_metrics()->fields_us); TypeInfo::auto_learn_fields(state); } { timer::StopWatch<timer::microseconds> timer( state->shared().boot_metrics()->ontology_us); state->vm()->bootstrap_ontology(state); } start_finalizer(state); load_argv(argc_, argv_); // Start the main Ruby thread. Thread* main = 0; OnStack<1> os(state, main); { timer::StopWatch<timer::microseconds> timer( state->shared().boot_metrics()->main_thread_us); main = Thread::create(state, state->vm(), Thread::main_thread); main->start_thread(state, Thread::run); } VM* vm = SignalThread::new_vm(state); vm->set_stack_bounds(state->vm()->stack_size()); State main_state(vm); state->shared().start_signals(&main_state); state->shared().set_running(); }