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