| Index: preparser/preparser-process.cc
|
| diff --git a/preparser/preparser-process.cc b/preparser/preparser-process.cc
|
| index 486094617987be22b496fdce351038d53db9ea77..2dc98c057db19a089458f299ae305654e7e562d2 100644
|
| --- a/preparser/preparser-process.cc
|
| +++ b/preparser/preparser-process.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -203,74 +203,114 @@ void fail(v8::PreParserData* data, const char* message, ...) {
|
| };
|
|
|
|
|
| +bool IsFlag(const char* arg) {
|
| + // Anything starting with '-' is considered a flag.
|
| + // It's summarily ignored for now.
|
| + return arg[0] == '-';
|
| +}
|
| +
|
| +
|
| +struct ExceptionExpectation {
|
| + ExceptionExpectation()
|
| + : throws(false), type(NULL), beg_pos(-1), end_pos(-1) { }
|
| + bool throws;
|
| + const char* type;
|
| + int beg_pos;
|
| + int end_pos;
|
| +};
|
| +
|
| +
|
| void CheckException(v8::PreParserData* data,
|
| - bool throws,
|
| - const char* message,
|
| - int beg_pos,
|
| - int end_pos) {
|
| + ExceptionExpectation* expects) {
|
| PreparseDataInterpreter reader(data->data(), data->size());
|
| - if (throws) {
|
| + if (expects->throws) {
|
| if (!reader.throws()) {
|
| - if (message == NULL) {
|
| + if (expects->type == NULL) {
|
| fail(data, "Didn't throw as expected\n");
|
| } else {
|
| - fail(data, "Didn't throw \"%s\" as expected\n", message);
|
| + fail(data, "Didn't throw \"%s\" as expected\n", expects->type);
|
| }
|
| }
|
| - if (message != NULL) {
|
| + if (expects->type != NULL) {
|
| const char* actual_message = reader.message();
|
| - if (strcmp(message, actual_message)) {
|
| + if (strcmp(expects->type, actual_message)) {
|
| fail(data, "Wrong error message. Expected <%s>, found <%s>\n",
|
| - message, actual_message);
|
| + expects->type, actual_message);
|
| }
|
| }
|
| - if (beg_pos >= 0) {
|
| - if (beg_pos != reader.beg_pos()) {
|
| + if (expects->beg_pos >= 0) {
|
| + if (expects->beg_pos != reader.beg_pos()) {
|
| fail(data, "Wrong error start position: Expected %i, found %i\n",
|
| - beg_pos, reader.beg_pos());
|
| + expects->beg_pos, reader.beg_pos());
|
| }
|
| }
|
| - if (end_pos >= 0) {
|
| - if (end_pos != reader.end_pos()) {
|
| + if (expects->end_pos >= 0) {
|
| + if (expects->end_pos != reader.end_pos()) {
|
| fail(data, "Wrong error end position: Expected %i, found %i\n",
|
| - end_pos, reader.end_pos());
|
| + expects->end_pos, reader.end_pos());
|
| }
|
| }
|
| } else if (reader.throws()) {
|
| const char* message = reader.message();
|
| - fail(data, "Throws unexpectedly with message: %s\n",
|
| - message);
|
| + fail(data, "Throws unexpectedly with message: %s\n", message);
|
| }
|
| }
|
|
|
| -int main(int argc, char* argv[]) {
|
| - // Check for filename argument.
|
| - if (argc < 2) {
|
| - fail(NULL, "ERROR: No filename on command line.\n");
|
| - }
|
| - const char* filename = argv[1];
|
| -
|
| - // Parse expectations.
|
| - bool throws = false;
|
| - const char* throws_message = NULL;
|
| - int throws_beg_pos = -1;
|
| - int throws_end_pos = -1;
|
| - // Check for throws argument.
|
| - if (argc > 2) {
|
| - if (strncmp("throws", argv[2], 6)) {
|
| +
|
| +ExceptionExpectation ParseExpectation(int argc, const char* argv[]) {
|
| + ExceptionExpectation expects;
|
| +
|
| + // Parse exception expectations from (the remainder of) the command line.
|
| + int arg_index = 0;
|
| + // Skip any flags.
|
| + while (argc > arg_index && IsFlag(argv[arg_index])) arg_index++;
|
| + if (argc > arg_index) {
|
| + if (strncmp("throws", argv[arg_index], 7)) {
|
| + // First argument after filename, if present, must be the verbatim
|
| + // "throws", marking that the preparsing should fail with an exception.
|
| fail(NULL, "ERROR: Extra arguments not prefixed by \"throws\".\n");
|
| }
|
| - throws = true;
|
| - if (argc > 3) {
|
| - throws_message = argv[3];
|
| - }
|
| - if (argc > 4) {
|
| - throws_beg_pos = atoi(argv[4]);
|
| - }
|
| - if (argc > 5) {
|
| - throws_end_pos = atoi(argv[5]);
|
| + expects.throws = true;
|
| + do {
|
| + arg_index++;
|
| + } while (argc > arg_index && IsFlag(argv[arg_index]));
|
| + if (argc > arg_index) {
|
| + // Next argument is the exception type identifier.
|
| + expects.type = argv[arg_index];
|
| + do {
|
| + arg_index++;
|
| + } while (argc > arg_index && IsFlag(argv[arg_index]));
|
| + if (argc > arg_index) {
|
| + expects.beg_pos = atoi(argv[arg_index]);
|
| + do {
|
| + arg_index++;
|
| + } while (argc > arg_index && IsFlag(argv[arg_index]));
|
| + if (argc > arg_index) {
|
| + expects.end_pos = atoi(argv[arg_index]);
|
| + }
|
| + }
|
| }
|
| }
|
| + return expects;
|
| +}
|
| +
|
| +
|
| +int main(int argc, const char* argv[]) {
|
| + // Parse command line.
|
| + // Format: preparser <scriptfile> ["throws" [<exn-type> [<start> [<end>]]]]
|
| + // Any flags on the line are ignored.
|
| +
|
| + // Check for mandatory filename argument.
|
| + int arg_index = 1;
|
| + while (argc > arg_index && IsFlag(argv[arg_index])) arg_index++;
|
| + if (argc <= arg_index) {
|
| + fail(NULL, "ERROR: No filename on command line.\n");
|
| + }
|
| + const char* filename = argv[arg_index];
|
| + // Check remainder of command line for exception expectations.
|
| + arg_index++;
|
| + ExceptionExpectation expects =
|
| + ParseExpectation(argc - arg_index, argv + arg_index);
|
|
|
| // Open JS file.
|
| FILE* input = fopen(filename, "rb");
|
| @@ -310,8 +350,7 @@ int main(int argc, char* argv[]) {
|
|
|
| // Check that the expected exception is thrown, if an exception is
|
| // expected.
|
| - CheckException(&data, throws, throws_message,
|
| - throws_beg_pos, throws_end_pos);
|
| + CheckException(&data, &expects);
|
|
|
| return EXIT_SUCCESS;
|
| }
|
|
|