1feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// Redistribution and use in source and binary forms, with or without
3feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// modification, are permitted provided that the following conditions are
4feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// met:
5feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//
6feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//     * Redistributions of source code must retain the above copyright
7feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       notice, this list of conditions and the following disclaimer.
8feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//     * Redistributions in binary form must reproduce the above
9feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       copyright notice, this list of conditions and the following
10feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       disclaimer in the documentation and/or other materials provided
11feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       with the distribution.
12feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
13feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       contributors may be used to endorse or promote products derived
14feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//       from this software without specific prior written permission.
15feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org//
16feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
28feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <assert.h>
29feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <string.h>
30feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <stdio.h>
31feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <stdlib.h>
32feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <string>
33feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#include <vector>
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
35feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
36d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org#include "include/libplatform/libplatform.h"
37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/api.h"
385de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/messages.h"
40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h"
41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scanner-character-streams.h"
42196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopeinfo.h"
43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "tools/shell-utils.h"
44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/string-stream.h"
45196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scanner.h"
46feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
47feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
48feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgusing namespace v8::internal;
49feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
50feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
51feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgclass BaselineScanner {
52feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org public:
53feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  BaselineScanner(const char* fname,
54feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                  Isolate* isolate,
55feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                  Encoding encoding,
565de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                  v8::base::ElapsedTimer* timer,
57feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                  int repeat)
58feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      : stream_(NULL) {
59feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    int length = 0;
60a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    source_ = ReadFileAndRepeat(fname, &length, repeat);
61feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    unicode_cache_ = new UnicodeCache();
62feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    scanner_ = new Scanner(unicode_cache_);
63feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    switch (encoding) {
64feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      case UTF8:
65feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        stream_ = new Utf8ToUtf16CharacterStream(source_, length);
66feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        break;
67feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      case UTF16: {
68feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        Handle<String> result = isolate->factory()->NewStringFromTwoByte(
69feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org            Vector<const uint16_t>(
70feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                reinterpret_cast<const uint16_t*>(source_),
718496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org                length / 2)).ToHandleChecked();
72feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        stream_ =
73feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org            new GenericStringUtf16CharacterStream(result, 0, result->length());
74feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        break;
75feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      }
76feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      case LATIN1: {
77feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        Handle<String> result = isolate->factory()->NewStringFromOneByte(
788496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org            Vector<const uint8_t>(source_, length)).ToHandleChecked();
79feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        stream_ =
80feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org            new GenericStringUtf16CharacterStream(result, 0, result->length());
81feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        break;
82feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      }
83feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    }
84feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    timer->Start();
85feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    scanner_->Initialize(stream_);
86feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
87feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
88feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  ~BaselineScanner() {
89feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    delete scanner_;
90feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    delete stream_;
91feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    delete unicode_cache_;
92feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    delete[] source_;
93feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
94feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
95feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  Token::Value Next(int* beg_pos, int* end_pos) {
96feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    Token::Value res = scanner_->Next();
97feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    *beg_pos = scanner_->location().beg_pos;
98feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    *end_pos = scanner_->location().end_pos;
99feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    return res;
100feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
101feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
102feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org private:
103feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  UnicodeCache* unicode_cache_;
104feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  Scanner* scanner_;
105feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  const byte* source_;
106feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  BufferedUtf16CharacterStream* stream_;
107feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org};
108feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
109feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
110feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgstruct TokenWithLocation {
111feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  Token::Value value;
112feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  size_t beg;
113feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  size_t end;
114feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  TokenWithLocation() : value(Token::ILLEGAL), beg(0), end(0) { }
115feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  TokenWithLocation(Token::Value value, size_t beg, size_t end) :
116feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      value(value), beg(beg), end(end) { }
117feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  bool operator==(const TokenWithLocation& other) {
118feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    return value == other.value && beg == other.beg && end == other.end;
119feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
120feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  bool operator!=(const TokenWithLocation& other) {
121feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    return !(*this == other);
122feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
123feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  void Print(const char* prefix) const {
124feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    printf("%s %11s at (%d, %d)\n",
125feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org           prefix, Token::Name(value),
126feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org           static_cast<int>(beg), static_cast<int>(end));
127feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
128feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org};
129feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
130feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
1315de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgv8::base::TimeDelta RunBaselineScanner(const char* fname, Isolate* isolate,
1325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                                       Encoding encoding, bool dump_tokens,
1335de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                                       std::vector<TokenWithLocation>* tokens,
1345de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                                       int repeat) {
1355de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  v8::base::ElapsedTimer timer;
136feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  BaselineScanner scanner(fname, isolate, encoding, &timer, repeat);
137feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  Token::Value token;
138feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  int beg, end;
139feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  do {
140feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    token = scanner.Next(&beg, &end);
141feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    if (dump_tokens) {
142feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      tokens->push_back(TokenWithLocation(token, beg, end));
143feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    }
144feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  } while (token != Token::EOS);
145feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  return timer.Elapsed();
146feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org}
147feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
148feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
149feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgvoid PrintTokens(const char* name,
150feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                 const std::vector<TokenWithLocation>& tokens) {
151feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  printf("No of tokens: %d\n",
152feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org         static_cast<int>(tokens.size()));
153feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  printf("%s:\n", name);
154feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  for (size_t i = 0; i < tokens.size(); ++i) {
155feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    tokens[i].Print("=>");
156feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
157feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org}
158feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
159feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
1605de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgv8::base::TimeDelta ProcessFile(
161feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    const char* fname,
162feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    Encoding encoding,
163feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    Isolate* isolate,
164feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    bool print_tokens,
165feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    int repeat) {
166feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  if (print_tokens) {
167feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    printf("Processing file %s\n", fname);
168feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
169feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  HandleScope handle_scope(isolate);
170feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  std::vector<TokenWithLocation> baseline_tokens;
1715de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  v8::base::TimeDelta baseline_time;
172feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  baseline_time = RunBaselineScanner(
173feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      fname, isolate, encoding, print_tokens,
174feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      &baseline_tokens, repeat);
175feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  if (print_tokens) {
176feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    PrintTokens("Baseline", baseline_tokens);
177feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
178feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  return baseline_time;
179feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org}
180feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
181feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
182feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgint main(int argc, char* argv[]) {
183a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
184feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  v8::V8::InitializeICU();
185d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  v8::Platform* platform = v8::platform::CreateDefaultPlatform();
186d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  v8::V8::InitializePlatform(platform);
187a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::V8::Initialize();
188feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  Encoding encoding = LATIN1;
189feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  bool print_tokens = false;
190feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  std::vector<std::string> fnames;
191feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  std::string benchmark;
192feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  int repeat = 1;
193feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  for (int i = 0; i < argc; ++i) {
194feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    if (strcmp(argv[i], "--latin1") == 0) {
195feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      encoding = LATIN1;
196feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (strcmp(argv[i], "--utf8") == 0) {
197feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      encoding = UTF8;
198feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (strcmp(argv[i], "--utf16") == 0) {
199feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      encoding = UTF16;
200feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (strcmp(argv[i], "--print-tokens") == 0) {
201feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      print_tokens = true;
202feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (strncmp(argv[i], "--benchmark=", 12) == 0) {
203feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      benchmark = std::string(argv[i]).substr(12);
204feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (strncmp(argv[i], "--repeat=", 9) == 0) {
205feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      std::string repeat_str = std::string(argv[i]).substr(9);
206feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      repeat = atoi(repeat_str.c_str());
207feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    } else if (i > 0 && argv[i][0] != '-') {
208feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      fnames.push_back(std::string(argv[i]));
209feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    }
210feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
211a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org  v8::Isolate* isolate = v8::Isolate::New();
212feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  {
213a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org    v8::Isolate::Scope isolate_scope(isolate);
214feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    v8::HandleScope handle_scope(isolate);
2159cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
216feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global);
217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!context.IsEmpty());
218feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    {
219feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      v8::Context::Scope scope(context);
220feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      double baseline_total = 0;
221feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      for (size_t i = 0; i < fnames.size(); i++) {
2225de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org        v8::base::TimeDelta time;
223a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org        time = ProcessFile(fnames[i].c_str(), encoding,
224a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org                           reinterpret_cast<Isolate*>(isolate), print_tokens,
225feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                           repeat);
226feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org        baseline_total += time.InMillisecondsF();
227feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      }
228feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      if (benchmark.empty()) benchmark = "Baseline";
229feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org      printf("%s(RunTime): %.f ms\n", benchmark.c_str(), baseline_total);
230feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org    }
231feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  }
232feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  v8::V8::Dispose();
233d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  v8::V8::ShutdownPlatform();
234d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  delete platform;
235feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  return 0;
236feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org}
237