Revision: 20105
Author: [email protected]
Date: Thu Mar 20 09:38:10 2014 UTC
Log: Experimental parser: only read one file in lexer-shell
[email protected]
BUG=
Review URL: https://codereview.chromium.org/203103005
http://code.google.com/p/v8/source/detail?r=20105
Modified:
/branches/experimental/parser/src/lexer/lexer-shell.cc
=======================================
--- /branches/experimental/parser/src/lexer/lexer-shell.cc Mon Mar 17
15:57:19 2014 UTC
+++ /branches/experimental/parser/src/lexer/lexer-shell.cc Thu Mar 20
09:38:10 2014 UTC
@@ -80,10 +80,18 @@
};
+struct FileData {
+ const char* file_name;
+ unsigned length_in_bytes;
+ Encoding encoding;
+ const uint16_t* data;
+};
+
+
static uint16_t* ConvertUtf8ToUtf16(const uint16_t* const data_in,
- unsigned* length,
+ unsigned* length_in_bytes,
bool* is_one_byte) {
- const unsigned file_size = *length;
+ const unsigned file_size = *length_in_bytes;
const uint8_t* char_data = reinterpret_cast<const uint8_t*>(data_in);
const uint32_t kMaxUtf16Character = 0xffff;
// Get utf8 length.
@@ -128,38 +136,38 @@
data[i++] = static_cast<uc16>(c);
}
}
- *length = 2 * utf16_chars;
+ *length_in_bytes = 2 * utf16_chars;
return data;
}
static uint16_t* ConvertUtf16ToLatin1(const uint16_t* const data_in,
- unsigned* length) {
- const unsigned size = *length / 2 + *length % 2;
+ unsigned* length_in_bytes) {
+ const unsigned size = *length_in_bytes / 2 + *length_in_bytes % 2;
uint16_t* data = new uint16_t[size];
uint8_t* char_data = reinterpret_cast<uint8_t*>(data);
CopyChars(char_data, data_in, size);
- *length = size;
+ *length_in_bytes = size;
return data;
}
static uint16_t* Repeat(int repeat,
const uint16_t* const data_in,
- unsigned* length) {
- const unsigned file_size = *length;
+ unsigned* length_in_bytes) {
+ const unsigned file_size = *length_in_bytes;
unsigned size = file_size * repeat;
uint16_t* data = new uint16_t[size / 2 + size % 2];
uint8_t* char_data = reinterpret_cast<uint8_t*>(data);
for (int i = 0; i < repeat; i++) {
memcpy(&char_data[i * file_size], data_in, file_size);
}
- *length = size;
+ *length_in_bytes = size;
return data;
}
-static uint16_t* ReadFile(const char* name, unsigned* length) {
+static uint16_t* ReadFile(const char* name, unsigned* length_in_bytes) {
FILE* file = fopen(name, "rb");
CHECK(file != NULL);
// Get file size.
@@ -173,47 +181,50 @@
i += fread(&char_data[i], 1, file_size - i, file);
}
fclose(file);
- *length = file_size;
+ *length_in_bytes = file_size;
return data;
}
-static uint16_t* ReadFile(const char* name,
- const LexerShellSettings& settings,
- unsigned* length,
- Encoding* output_encoding) {
- uint16_t* data = ReadFile(name, length);
- CHECK_GE(*length, 0);
- if (*length == 0) return data;
+static FileData ReadFile(const char* file_name,
+ const LexerShellSettings& settings) {
+ unsigned length_in_bytes;
+ uint16_t* data = ReadFile(file_name, &length_in_bytes);
+ CHECK_GE(length_in_bytes, 0);
- *output_encoding = settings.encoding;
-
- if (settings.encoding == UTF8TO16 ||
- settings.encoding == UTF8TOLATIN1) {
+ Encoding encoding = settings.encoding;
+ if (encoding == UTF8TO16 || encoding == UTF8TOLATIN1) {
bool is_one_byte;
- uint16_t* new_data = ConvertUtf8ToUtf16(data, length, &is_one_byte);
- if (settings.encoding == UTF8TOLATIN1 && is_one_byte) {
- *output_encoding = LATIN1;
+ uint16_t* new_data = ConvertUtf8ToUtf16(
+ data, &length_in_bytes, &is_one_byte);
+ if (encoding == UTF8TOLATIN1 && is_one_byte) {
+ encoding = LATIN1;
} else {
- *output_encoding = UTF16;
+ encoding = UTF16;
}
delete data;
data = new_data;
}
- if (settings.encoding == UTF8TOLATIN1 && *output_encoding == LATIN1) {
- uint16_t* new_data = ConvertUtf16ToLatin1(data, length);
+ if (settings.encoding == UTF8TOLATIN1 && encoding == LATIN1) {
+ uint16_t* new_data = ConvertUtf16ToLatin1(data, &length_in_bytes);
delete data;
data = new_data;
}
if (settings.repeat > 1) {
- uint16_t* new_data = Repeat(settings.repeat, data, length);
+ uint16_t* new_data = Repeat(settings.repeat, data, &length_in_bytes);
delete data;
data = new_data;
}
- return data;
+ FileData file_data;
+ file_data.file_name = file_name;
+ file_data.data = data;
+ file_data.length_in_bytes = length_in_bytes;
+ file_data.encoding = encoding;
+
+ return file_data;
}
@@ -336,6 +347,7 @@
}
if (token == Token::ILLEGAL && settings.break_after_illegal) break;
} while (token != Token::EOS);
+ TimeDelta elapsed = timer.Elapsed();
// Dump tokens.
if (settings.print_tokens) {
if (!settings.print_tokens_for_compare) {
@@ -348,37 +360,31 @@
for (size_t i = 0; i < tokens.size(); ++i) {
delete tokens[i];
}
- return timer.Elapsed();
+ return elapsed;
}
static TimeDelta ProcessFile(
- const char* fname,
Isolate* isolate,
const LexerShellSettings& settings,
+ const FileData& file_data,
int truncate_by,
bool* can_truncate) {
if (settings.print_tokens && !settings.print_tokens_for_compare) {
- printf("Processing file %s, truncating by %d bytes\n", fname,
truncate_by);
+ printf("Processing file %s, truncating by %d bytes\n",
+ file_data.file_name, truncate_by);
}
HandleScope handle_scope(isolate);
+ const uint16_t* buffer = file_data.data;
+ const uint8_t* char_data = reinterpret_cast<const uint8_t*>(buffer);
+ const uint8_t* buffer_end = &char_data[file_data.length_in_bytes];
TimeDelta time;
- {
- unsigned length_in_bytes;
- Encoding output_encoding;
- const uint16_t* buffer =
- ReadFile(fname, settings, &length_in_bytes, &output_encoding);
- const uint8_t* char_data = reinterpret_cast<const uint8_t*>(buffer);
- const uint8_t* buffer_end = &char_data[length_in_bytes];
- if (truncate_by > buffer_end - char_data) {
- *can_truncate = false;
- } else {
- buffer_end -= truncate_by;
- time = RunLexer(buffer, buffer_end, isolate, output_encoding,
settings);
- }
- delete[] buffer;
+ if (truncate_by > buffer_end - char_data) {
+ *can_truncate = false;
+ } else {
+ buffer_end -= truncate_by;
+ time = RunLexer(buffer, buffer_end, isolate, file_data.encoding,
settings);
}
-
return time;
}
@@ -386,7 +392,7 @@
int main(int argc, char* argv[]) {
v8::V8::InitializeICU();
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
- std::vector<std::string> fnames;
+ std::string file_name;
LexerShellSettings settings;
for (int i = 0; i < argc; ++i) {
if (strcmp(argv[i], "--latin1") == 0) {
@@ -432,9 +438,11 @@
} else if (strcmp(argv[i], "--eos-test") == 0) {
settings.eos_test = true;
} else if (i > 0 && argv[i][0] != '-') {
- fnames.push_back(std::string(argv[i]));
+ file_name = std::string(argv[i]);
}
}
+ CHECK_NE(0, file_name.size());
+ FileData file_data = ReadFile(file_name.c_str(), settings);
{
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);
@@ -443,24 +451,22 @@
v8::Context::Scope scope(context);
Isolate* internal_isolate = Isolate::Current();
double total_time = 0;
- for (size_t i = 0; i < fnames.size(); i++) {
- std::pair<TimeDelta, TimeDelta> times;
- bool can_truncate = settings.eos_test;
- int truncate_by = 0;
- do {
- TimeDelta t = ProcessFile(fnames[i].c_str(),
- internal_isolate,
- settings,
- truncate_by,
- &can_truncate);
- total_time += t.InMillisecondsF();
- ++truncate_by;
- } while (can_truncate);
- }
+ bool can_truncate = settings.eos_test;
+ int truncate_by = 0;
+ do {
+ TimeDelta t = ProcessFile(internal_isolate,
+ settings,
+ file_data,
+ truncate_by,
+ &can_truncate);
+ total_time += t.InMillisecondsF();
+ ++truncate_by;
+ } while (can_truncate);
if (!settings.print_tokens_for_compare) {
printf("RunTime: %.f ms\n", total_time);
}
}
+ delete[] file_data.data;
v8::V8::Dispose();
return 0;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.