utility_context_->SetSecurityToken(Undefined());
Context::Scope utility_scope(utility_context_);
- i::JSArguments js_args = i::FLAG_js_arguments;
- i::Handle<i::FixedArray> arguments_array =
- i::Factory::NewFixedArray(js_args.argc());
- for (int j = 0; j < js_args.argc(); j++) {
- i::Handle<i::String> arg =
- i::Factory::NewStringFromUtf8(i::CStrVector(js_args[j]));
- arguments_array->set(j, *arg);
- }
- i::Handle<i::JSArray> arguments_jsarray =
- i::Factory::NewJSArrayWithElements(arguments_array);
- global_template->Set(String::New("arguments"),
- Utils::ToLocal(arguments_jsarray));
-
// Install the debugger object in the utility scope
i::Debug::Load();
i::Debug::debug_context()->set_security_token(i::Heap::undefined_value());
#error No mode supplied when including flags.defs
#endif
-#ifdef FLAG_MODE_DECLARE
-// Structure used to hold a collection of arguments to the JavaScript code.
-struct JSArguments {
-public:
- JSArguments();
- JSArguments(int argc, const char** argv);
- int argc() const;
- const char** argv();
- const char*& operator[](int idx);
- JSArguments& operator=(JSArguments args);
-private:
- int argc_;
- const char** argv_;
-};
-#endif
-
#define DEFINE_bool(nam, def, cmt) FLAG(BOOL, bool, nam, def, cmt)
#define DEFINE_int(nam, def, cmt) FLAG(INT, int, nam, def, cmt)
#define DEFINE_float(nam, def, cmt) FLAG(FLOAT, double, nam, def, cmt)
#define DEFINE_string(nam, def, cmt) FLAG(STRING, const char*, nam, def, cmt)
-#define DEFINE_args(nam, def, cmt) FLAG(ARGS, JSArguments, nam, def, cmt)
//
// Flags in all modes.
DEFINE_bool(help, false, "Print usage message, including flags, on console")
DEFINE_bool(dump_counters, false, "Dump counters on exit")
-DEFINE_args(js_arguments, JSArguments(),
- "Pass all remaining arguments to the script. Alias for \"--\".")
//
// Debug only flags
// to the actual flag, default value, comment, etc. This is designed to be POD
// initialized as to avoid requiring static constructors.
struct Flag {
- enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS };
+ enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING };
FlagType type_; // What type of flag, bool, int, or string.
const char* name_; // Name of the flag, ex "my_flag".
return reinterpret_cast<const char**>(valptr_);
}
- JSArguments* args_variable() const {
- ASSERT(type_ == TYPE_ARGS);
- return reinterpret_cast<JSArguments*>(valptr_);
- }
-
bool bool_default() const {
ASSERT(type_ == TYPE_BOOL);
return *reinterpret_cast<const bool*>(defptr_);
return *reinterpret_cast<const char* const *>(defptr_);
}
- JSArguments args_default() const {
- ASSERT(type_ == TYPE_ARGS);
- return *reinterpret_cast<const JSArguments*>(defptr_);
- }
-
// Compare this flag's current value against the default.
bool IsDefault() const {
switch (type_) {
return *int_variable() == int_default();
case TYPE_FLOAT:
return *float_variable() == float_default();
- case TYPE_STRING: {
+ case TYPE_STRING:
const char* str1 = *string_variable();
const char* str2 = string_default();
if (str2 == NULL) return str1 == NULL;
if (str1 == NULL) return str2 == NULL;
return strcmp(str1, str2) == 0;
- }
- case TYPE_ARGS:
- return args_variable()->argc() == 0;
}
UNREACHABLE();
return true;
case TYPE_STRING:
*string_variable() = string_default();
break;
- case TYPE_ARGS:
- *args_variable() = args_default();
- break;
}
}
};
case Flag::TYPE_INT: return "int";
case Flag::TYPE_FLOAT: return "float";
case Flag::TYPE_STRING: return "string";
- case Flag::TYPE_ARGS: return "arguments";
}
UNREACHABLE();
return NULL;
value = Vector<char>::New(20);
OS::SNPrintF(value, "%f", *flag->float_variable());
break;
- case Flag::TYPE_STRING: {
+ case Flag::TYPE_STRING:
const char* str = *flag->string_variable();
if (str) {
int length = strlen(str) + 1;
OS::SNPrintF(value, "NULL");
}
break;
- }
- case Flag::TYPE_ARGS: {
- JSArguments args = *flag->args_variable();
- if (args.argc() == 0) {
- value = Vector<char>::New(0);
- break;
- }
- int len = args.argc() - 1;
- for (int i = 0; i < args.argc(); i++) {
- len += strlen(args[i]);
- }
- value = Vector<char>::New(len);
- for (int i = 0; i < args.argc(); i++) {
- if (i > 0) {
- OS::SNPrintF(value, " ");
- }
- OS::SNPrintF(value, "%s", args[i]);
- }
- break;
- }
}
ASSERT(!value.is_empty());
return value.start();
if (*arg == '-') {
// find the begin of the flag name
arg++; // remove 1st '-'
- if (*arg == '-') {
+ if (*arg == '-')
arg++; // remove 2nd '-'
- if (arg[0] == '\0') {
- const char* kJSArgumentsFlagName = "js_arguments";
- *name = kJSArgumentsFlagName;
- return;
- }
- }
if (arg[0] == 'n' && arg[1] == 'o') {
arg += 2; // remove "no"
*is_bool = true;
}
// if we still need a flag value, use the next argument if available
- if (flag->type() != Flag::TYPE_BOOL &&
- flag->type() != Flag::TYPE_ARGS &&
- value == NULL) {
+ if (flag->type() != Flag::TYPE_BOOL && value == NULL) {
if (i < *argc) {
value = argv[i++];
} else {
case Flag::TYPE_STRING:
*flag->string_variable() = value;
break;
- case Flag::TYPE_ARGS:
- int start_pos = (value == NULL) ? i : i - 1;
- int js_argc = *argc - start_pos;
- const char** js_argv = new const char*[js_argc];
- if (value != NULL) {
- js_argv[0] = value;
- }
- for (int k = i; k < *argc; k++) {
- js_argv[k - start_pos] = argv[k];
- }
- *flag->args_variable() = JSArguments(js_argc, js_argv);
- i = *argc; // Consume all arguments
- break;
}
// handle errors
}
}
-JSArguments::JSArguments()
- : argc_(0), argv_(NULL) {}
-JSArguments::JSArguments(int argc, const char** argv)
- : argc_(argc), argv_(argv) {}
-int JSArguments::argc() const { return argc_; }
-const char** JSArguments::argv() { return argv_; }
-const char*& JSArguments::operator[](int idx) { return argv_[idx]; }
-JSArguments& JSArguments::operator=(JSArguments args) {
- argc_ = args.argc_;
- argv_ = args.argv_;
- return *this;
-}
-
-
} } // namespace v8::internal
#define FLAG_MODE_DECLARE
#include "flag-definitions.h"
-
// The global list of all flags.
class FlagList {
public:
// set, the flags and associated values are removed from (argc,
// argv). Returns 0 if no error occurred. Otherwise, returns the argv
// index > 0 for the argument where an error occurred. In that case,
- // (argc, argv) will remain unchanged independent of the remove_flags
+ // (argc, argv) will remain unchanged indepdendent of the remove_flags
// value, and no assumptions about flag settings should be made.
//
// The following syntax for flags is accepted (both '-' and '--' are ok):
// --noflag (bool flags only)
// --flag=value (non-bool flags only, no spaces around '=')
// --flag value (non-bool flags only)
- // -- (equivalent to --js_arguments, captures all remaining args)
static int SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags);
// Set the flag values by parsing the string str. Splits string into argc
const char* str = " --testing-int-flag 0 --testing_float_flag ";
CHECK_EQ(3, FlagList::SetFlagsFromString(str, strlen(str)));
}
-
-
-TEST(FlagsJSArguments1) {
- SetFlagsToDefault();
- int argc = 6;
- const char* argv[] = {"TestJSArgs1",
- "--testing-int-flag", "42",
- "--", "testing-float-flag", "7"};
- CHECK_EQ(0, FlagList::SetFlagsFromCommandLine(&argc,
- const_cast<char **>(argv),
- true));
- CHECK_EQ(42, FLAG_testing_int_flag);
- CHECK_EQ(2.5, FLAG_testing_float_flag);
- CHECK_EQ(2, FLAG_js_arguments.argc());
- CHECK_EQ(0, strcmp(FLAG_js_arguments[0], "testing-float-flag"));
- CHECK_EQ(0, strcmp(FLAG_js_arguments[1], "7"));
- CHECK_EQ(1, argc);
-}
-
-
-TEST(FlagsJSArguments1b) {
- SetFlagsToDefault();
- const char* str = "--testing-int-flag 42 -- testing-float-flag 7";
- CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
- CHECK_EQ(42, FLAG_testing_int_flag);
- CHECK_EQ(2.5, FLAG_testing_float_flag);
- CHECK_EQ(2, FLAG_js_arguments.argc());
- CHECK_EQ(0, strcmp(FLAG_js_arguments[0], "testing-float-flag"));
- CHECK_EQ(0, strcmp(FLAG_js_arguments[1], "7"));
-}
-
-
-TEST(FlagsJSArguments2) {
- SetFlagsToDefault();
- const char* str = "--testing-int-flag 42 --js-arguments testing-float-flag 7";
- CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
- CHECK_EQ(42, FLAG_testing_int_flag);
- CHECK_EQ(2.5, FLAG_testing_float_flag);
- CHECK_EQ(2, FLAG_js_arguments.argc());
- CHECK_EQ(0, strcmp(FLAG_js_arguments[0], "testing-float-flag"));
- CHECK_EQ(0, strcmp(FLAG_js_arguments[1], "7"));
-}
-
-
-TEST(FlagsJSArguments3) {
- SetFlagsToDefault();
- const char* str = "--testing-int-flag 42 --js-arguments=testing-float-flag 7";
- CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
- CHECK_EQ(42, FLAG_testing_int_flag);
- CHECK_EQ(2.5, FLAG_testing_float_flag);
- CHECK_EQ(2, FLAG_js_arguments.argc());
- CHECK_EQ(0, strcmp(FLAG_js_arguments[0], "testing-float-flag"));
- CHECK_EQ(0, strcmp(FLAG_js_arguments[1], "7"));
-}
-
-
-TEST(FlagsJSArguments4) {
- SetFlagsToDefault();
- const char* str = "--testing-int-flag 42 --";
- CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
- CHECK_EQ(42, FLAG_testing_int_flag);
- CHECK_EQ(0, FLAG_js_arguments.argc());
-}
-