Esempio n. 1
0
    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() );
    }
Esempio n. 2
0
  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();
  }