Author: [EMAIL PROTECTED]
Date: Wed Nov 12 00:22:51 2008
New Revision: 737

Added:
    branches/experimental/toiger/tools/visual_studio/arm.vsprops
       - copied unchanged from r736,  
/branches/bleeding_edge/tools/visual_studio/arm.vsprops
    branches/experimental/toiger/tools/visual_studio/v8_arm.sln
       - copied unchanged from r736,  
/branches/bleeding_edge/tools/visual_studio/v8_arm.sln
    branches/experimental/toiger/tools/visual_studio/v8_base_arm.vcproj
       - copied unchanged from r736,  
/branches/bleeding_edge/tools/visual_studio/v8_base_arm.vcproj
    branches/experimental/toiger/tools/visual_studio/v8_cctest_arm.vcproj
       - copied unchanged from r736,  
/branches/bleeding_edge/tools/visual_studio/v8_cctest_arm.vcproj
Modified:
    branches/experimental/toiger/src/assembler-ia32.cc
    branches/experimental/toiger/src/assembler-ia32.h
    branches/experimental/toiger/src/bootstrapper.cc
    branches/experimental/toiger/src/bootstrapper.h
    branches/experimental/toiger/src/builtins-ia32.cc
    branches/experimental/toiger/src/codegen-arm.cc
    branches/experimental/toiger/src/codegen-ia32.cc
    branches/experimental/toiger/src/d8.cc
    branches/experimental/toiger/src/date-delay.js
    branches/experimental/toiger/src/debug-delay.js
    branches/experimental/toiger/src/debug.cc
    branches/experimental/toiger/src/debug.h
    branches/experimental/toiger/src/disassembler.cc
    branches/experimental/toiger/src/flag-definitions.h
    branches/experimental/toiger/src/flags.cc
    branches/experimental/toiger/src/flags.h
    branches/experimental/toiger/src/global-handles.cc
    branches/experimental/toiger/src/ic-ia32.cc
    branches/experimental/toiger/src/log.cc
    branches/experimental/toiger/src/macro-assembler-arm.cc
    branches/experimental/toiger/src/macro-assembler-ia32.cc
    branches/experimental/toiger/src/objects.cc
    branches/experimental/toiger/src/serialize.cc
    branches/experimental/toiger/src/string-stream.cc
    branches/experimental/toiger/src/string-stream.h
    branches/experimental/toiger/src/stub-cache-ia32.cc
    branches/experimental/toiger/test/cctest/test-flags.cc
    branches/experimental/toiger/tools/visual_studio/v8_base.vcproj

Log:
Merge [EMAIL PROTECTED] to the experimental code generator branch.

Modified: branches/experimental/toiger/src/assembler-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/assembler-ia32.cc  (original)
+++ branches/experimental/toiger/src/assembler-ia32.cc  Wed Nov 12 00:22:51  
2008
@@ -597,6 +597,14 @@
  }


+void Assembler::mov(Register dst, const Immediate& x) {
+  EnsureSpace ensure_space(this);
+  last_pc_ = pc_;
+  EMIT(0xB8 | dst.code());
+  emit(x);
+}
+
+
  void Assembler::mov(Register dst, Handle<Object> handle) {
    EnsureSpace ensure_space(this);
    last_pc_ = pc_;
@@ -610,6 +618,14 @@
    last_pc_ = pc_;
    EMIT(0x8B);
    emit_operand(dst, src);
+}
+
+
+void Assembler::mov(Register dst, Register src) {
+  EnsureSpace ensure_space(this);
+  last_pc_ = pc_;
+  EMIT(0x89);
+  EMIT(0xC0 | src.code() << 3 | dst.code());
  }



Modified: branches/experimental/toiger/src/assembler-ia32.h
==============================================================================
--- branches/experimental/toiger/src/assembler-ia32.h   (original)
+++ branches/experimental/toiger/src/assembler-ia32.h   Wed Nov 12 00:22:51  
2008
@@ -453,8 +453,10 @@
    void mov_w(const Operand& dst, Register src);

    void mov(Register dst, int32_t imm32);
+  void mov(Register dst, const Immediate& x);
    void mov(Register dst, Handle<Object> handle);
    void mov(Register dst, const Operand& src);
+  void mov(Register dst, Register src);
    void mov(const Operand& dst, const Immediate& x);
    void mov(const Operand& dst, Handle<Object> handle);
    void mov(const Operand& dst, Register src);

Modified: branches/experimental/toiger/src/bootstrapper.cc
==============================================================================
--- branches/experimental/toiger/src/bootstrapper.cc    (original)
+++ branches/experimental/toiger/src/bootstrapper.cc    Wed Nov 12 00:22:51  
2008
@@ -205,11 +205,20 @@
      Code* code = Code::cast(code_[i]);
      Address pc = code->instruction_start() + pc_[i];
      bool is_pc_relative =  
Bootstrapper::FixupFlagsIsPCRelative::decode(flags);
-    if (is_pc_relative) {
-      Assembler::set_target_address_at(pc, f->code()->instruction_start());
+    bool use_code_object =  
Bootstrapper::FixupFlagsUseCodeObject::decode(flags);
+
+    if (use_code_object) {
+      if (is_pc_relative) {
+        Assembler::set_target_address_at(
+            pc, reinterpret_cast<Address>(f->code()));
+      } else {
+        *reinterpret_cast<Object**>(pc) = f->code();
+      }
      } else {
-      *reinterpret_cast<Object**>(pc) = f->code();
+      ASSERT(is_pc_relative);
+      Assembler::set_target_address_at(pc, f->code()->instruction_start());
      }
+
      LOG(StringEvent("resolved", name));
    }
    Clear();

Modified: branches/experimental/toiger/src/bootstrapper.h
==============================================================================
--- branches/experimental/toiger/src/bootstrapper.h     (original)
+++ branches/experimental/toiger/src/bootstrapper.h     Wed Nov 12 00:22:51 2008
@@ -66,7 +66,8 @@

    // Encoding/decoding support for fixup flags.
    class FixupFlagsIsPCRelative: public BitField<bool, 0, 1> {};
-  class FixupFlagsArgumentsCount: public BitField<uint32_t, 1, 32-1> {};
+  class FixupFlagsUseCodeObject: public BitField<bool, 1, 1> {};
+  class FixupFlagsArgumentsCount: public BitField<uint32_t, 2, 32-2> {};
  };

  }}  // namespace v8::internal

Modified: branches/experimental/toiger/src/builtins-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/builtins-ia32.cc   (original)
+++ branches/experimental/toiger/src/builtins-ia32.cc   Wed Nov 12 00:22:51  
2008
@@ -129,7 +129,7 @@
      // ebx: JSObject
      // edi: start of next object
      __ mov(Operand(ebx, JSObject::kMapOffset), eax);
-    __ mov(Operand(ecx), Factory::empty_fixed_array());
+    __ mov(ecx, Factory::empty_fixed_array());
      __ mov(Operand(ebx, JSObject::kPropertiesOffset), ecx);
      __ mov(Operand(ebx, JSObject::kElementsOffset), ecx);
      // Set extra fields in the newly allocated object.
@@ -137,7 +137,7 @@
      // ebx: JSObject
      // edi: start of next object
      { Label loop, entry;
-      __ mov(Operand(edx), Factory::undefined_value());
+      __ mov(edx, Factory::undefined_value());
        __ lea(ecx, Operand(ebx, JSObject::kHeaderSize));
        __ jmp(&entry);
        __ bind(&loop);
@@ -198,7 +198,7 @@
      // edi: FixedArray
      // ecx: start of next object
      { Label loop, entry;
-      __ mov(Operand(edx), Factory::undefined_value());
+      __ mov(edx, Factory::undefined_value());
        __ lea(eax, Operand(edi, FixedArray::kHeaderSize));
        __ jmp(&entry);
        __ bind(&loop);
@@ -440,7 +440,7 @@
      __ push(edi);  // save edi across the call
      __ push(ebx);
      __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
-    __ mov(Operand(ebx), eax);
+    __ mov(ebx, eax);
      __ pop(edi);  // restore edi after the call

      // Get the arguments count and untag it.
@@ -778,7 +778,7 @@
    __ RecordComment("// Calling from debug break to runtime - come in -  
over");
  #endif
    __ Set(eax, Immediate(0));  // no arguments
-  __ mov(Operand(ebx), Immediate(ExternalReference::debug_break()));
+  __ mov(ebx, Immediate(ExternalReference::debug_break()));

    CEntryDebugBreakStub ceb;
    __ CallStub(&ceb);

Modified: branches/experimental/toiger/src/codegen-arm.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-arm.cc     (original)
+++ branches/experimental/toiger/src/codegen-arm.cc     Wed Nov 12 00:22:51 2008
@@ -3799,8 +3799,16 @@
    // Restore the stack to the address of the ENTRY handler
    __ mov(sp, Operand(r3));

-  // restore parameter- and frame-pointer and pop state.
-  __ ldm(ia_w, sp, r3.bit() | pp.bit() | fp.bit());
+  // Stack layout at this point. See also PushTryHandler
+  // r3, sp ->   next handler
+  //             state (ENTRY)
+  //             pp
+  //             fp
+  //             lr
+
+  // Discard ENTRY state (r2 is not used), and restore parameter-
+  // and frame-pointer and pop state.
+  __ ldm(ia_w, sp, r2.bit() | r3.bit() | pp.bit() | fp.bit());
    // Before returning we restore the context from the frame pointer if not  
NULL.
    // The frame pointer is NULL in the exception handler of a JS entry  
frame.
    __ cmp(fp, Operand(0));
@@ -4215,7 +4223,10 @@
    // Slow-case: Non-function called.
    __ bind(&slow);
    __ mov(r0, Operand(argc_));  // Setup the number of arguments.
-  __ InvokeBuiltin(Builtins::CALL_NON_FUNCTION, JUMP_JS);
+  __ mov(r2, Operand(0));
+  __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
+  __  
Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)),
+          RelocInfo::CODE_TARGET);
  }



Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc    (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc    Wed Nov 12 00:22:51  
2008
@@ -964,7 +964,7 @@
        } else {
          deferred = new DeferredInlinedSmiSubReversed(this, edx,  
overwrite_mode);
          __ mov(edx, Operand(eax));
-        __ mov(Operand(eax), Immediate(value));
+        __ mov(eax, Immediate(value));
          __ sub(eax, Operand(edx));
        }
        __ j(overflow, deferred->enter(), not_taken);
@@ -1018,7 +1018,7 @@
          __ j(not_zero, deferred->enter(), not_taken);
          // tag result and store it in TOS (eax)
          ASSERT(kSmiTagSize == times_2);  // adjust code if not the case
-        __ lea(eax, Operand(ebx, times_2, kSmiTag));
+        __ lea(eax, Operand(ebx, ebx, times_1, kSmiTag));
          __ bind(deferred->exit());
          frame_->Push(eax);
        }
@@ -1047,7 +1047,7 @@
          __ j(not_zero, deferred->enter(), not_taken);
          // tag result and store it in TOS (eax)
          ASSERT(kSmiTagSize == times_2);  // adjust code if not the case
-        __ lea(eax, Operand(ebx, times_2, kSmiTag));
+        __ lea(eax, Operand(ebx, ebx, times_1, kSmiTag));
          __ bind(deferred->exit());
          frame_->Push(eax);
        }
@@ -1189,7 +1189,7 @@
    CompareStub stub(cc_, strict_);
    // Setup parameters and call stub.
    __ mov(edx, Operand(eax));
-  __ mov(Operand(eax), Immediate(Smi::FromInt(value_)));
+  __ Set(eax, Immediate(Smi::FromInt(value_)));
    __ CallStub(&stub);
    __ cmp(eax, 0);
    // "result" is returned in the flags
@@ -1619,7 +1619,7 @@
    fail_label->Branch(greater_equal, not_taken);

    // 0 is placeholder.
-  __ jmp(Operand(eax, times_2, 0x0, RelocInfo::INTERNAL_REFERENCE));
+  __ jmp(Operand(eax, eax, times_1, 0x0, RelocInfo::INTERNAL_REFERENCE));
    // calculate address to overwrite later with actual address of table.
    int32_t jump_table_ref = __ pc_offset() - sizeof(int32_t);

@@ -4250,7 +4250,7 @@
        __ j(not_zero, slow);
        // Tag the result and store it in register eax.
        ASSERT(kSmiTagSize == times_2);  // adjust code if not the case
-      __ lea(eax, Operand(eax, times_2, kSmiTag));
+      __ lea(eax, Operand(eax, eax, times_1, kSmiTag));
        break;

      case Token::MOD:
@@ -4311,7 +4311,7 @@
        }
        // Tag the result and store it in register eax.
        ASSERT(kSmiTagSize == times_2);  // adjust code if not the case
-      __ lea(eax, Operand(eax, times_2, kSmiTag));
+      __ lea(eax, Operand(eax, eax, times_1, kSmiTag));
        break;

      default:
@@ -4438,7 +4438,7 @@

        // Tag smi result and return.
        ASSERT(kSmiTagSize == times_2);  // adjust code if not the case
-      __ lea(eax, Operand(eax, times_2, kSmiTag));
+      __ lea(eax, Operand(eax, eax, times_1, kSmiTag));
        __ ret(2 * kPointerSize);

        // All ops except SHR return a signed int32 that we load in a  
HeapNumber.
@@ -5172,7 +5172,7 @@
    // running with --gc-greedy set.
    if (FLAG_gc_greedy) {
      Failure* failure = Failure::RetryAfterGC(0);
-    __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure)));
+    __ mov(eax, Immediate(reinterpret_cast<int32_t>(failure)));
    }
    GenerateCore(masm, &throw_normal_exception,
                 &throw_out_of_memory_exception,
@@ -5190,7 +5190,7 @@

    // Do full GC and retry runtime call one final time.
    Failure* failure = Failure::InternalError();
-  __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure)));
+  __ mov(eax, Immediate(reinterpret_cast<int32_t>(failure)));
    GenerateCore(masm,
                 &throw_normal_exception,
                 &throw_out_of_memory_exception,
@@ -5256,10 +5256,10 @@
    // stub, because the builtin stubs may not have been generated yet.
    if (is_construct) {
      ExternalReference  
construct_entry(Builtins::JSConstructEntryTrampoline);
-    __ mov(Operand(edx), Immediate(construct_entry));
+    __ mov(edx, Immediate(construct_entry));
    } else {
      ExternalReference entry(Builtins::JSEntryTrampoline);
-    __ mov(Operand(edx), Immediate(entry));
+    __ mov(edx, Immediate(entry));
    }
    __ mov(edx, Operand(edx, 0));  // deref address
    __ lea(edx, FieldOperand(edx, Code::kHeaderSize));

Modified: branches/experimental/toiger/src/d8.cc
==============================================================================
--- branches/experimental/toiger/src/d8.cc      (original)
+++ branches/experimental/toiger/src/d8.cc      Wed Nov 12 00:22:51 2008
@@ -235,6 +235,19 @@
    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());

Modified: branches/experimental/toiger/src/date-delay.js
==============================================================================
--- branches/experimental/toiger/src/date-delay.js      (original)
+++ branches/experimental/toiger/src/date-delay.js      Wed Nov 12 00:22:51 2008
@@ -50,6 +50,8 @@
  // ECMA 262 - 5.2
  function Modulo(value, remainder) {
    var mod = value % remainder;
+  // Guard against returning -0.
+  if (mod == 0) return 0;
    return mod >= 0 ? mod : mod + remainder;
  }


Modified: branches/experimental/toiger/src/debug-delay.js
==============================================================================
--- branches/experimental/toiger/src/debug-delay.js     (original)
+++ branches/experimental/toiger/src/debug-delay.js     Wed Nov 12 00:22:51 2008
@@ -357,15 +357,6 @@
  }


-// Function called from the runtime to handle a debug request receiced  
from the
-// debugger. When this function is called the debugger is in the broken  
state
-// reflected by the exec_state parameter. When pending requests are  
handled the
-// parameter stopping indicate the expected running state.
-function ProcessDebugRequest(exec_state, request, stopping) {
-  return  
exec_state.debugCommandProcessor().processDebugJSONRequest(request,  
stopping);
-}
-
-
  Debug.addListener = function(listener, opt_data) {
    if (!IS_FUNCTION(listener)) throw new Error('Parameters have wrong  
types.');
    %AddDebugEventListener(listener, opt_data);

Modified: branches/experimental/toiger/src/debug.cc
==============================================================================
--- branches/experimental/toiger/src/debug.cc   (original)
+++ branches/experimental/toiger/src/debug.cc   Wed Nov 12 00:22:51 2008
@@ -1371,35 +1371,6 @@
  }


-Handle<String> Debugger::ProcessRequest(Handle<Object> exec_state,
-                                        Handle<Object> request,
-                                        bool stopped) {
-  // Get the function ProcessDebugRequest (declared in debug.js).
-  Handle<JSFunction> process_denbug_request =
-    Handle<JSFunction>(JSFunction::cast(
-    Debug::debug_context()->global()->GetProperty(
-        *Factory::LookupAsciiSymbol("ProcessDebugRequest"))));
-
-  // Call ProcessDebugRequest expect String result. The ProcessDebugRequest
-  // will never throw an exception (see debug.js).
-  bool caught_exception;
-  const int argc = 3;
-  Object** argv[argc] = { exec_state.location(),
-                          request.location(),
-                          stopped ? Factory::true_value().location() :
-                                    Factory::false_value().location()};
-  Handle<Object> result = Execution::TryCall(process_denbug_request,
-                                             Factory::undefined_value(),
-                                             argc, argv,
-                                             &caught_exception);
-  if (caught_exception) {
-    return Factory::empty_symbol();
-  }
-
-  return Handle<String>::cast(result);
-}
-
-
  void Debugger::OnException(Handle<Object> exception, bool uncaught) {
    HandleScope scope;


Modified: branches/experimental/toiger/src/debug.h
==============================================================================
--- branches/experimental/toiger/src/debug.h    (original)
+++ branches/experimental/toiger/src/debug.h    Wed Nov 12 00:22:51 2008
@@ -346,9 +346,6 @@
    static Handle<Object> MakeCompileEvent(Handle<Script> script,
                                           Handle<Object> script_function,
                                           bool* caught_exception);
-  static Handle<String> ProcessRequest(Handle<Object> exec_state,
-                                       Handle<Object> request,
-                                       bool stopped);
    static void OnDebugBreak(Handle<Object> break_points_hit);
    static void OnException(Handle<Object> exception, bool uncaught);
    static void OnBeforeCompile(Handle<Script> script);

Modified: branches/experimental/toiger/src/disassembler.cc
==============================================================================
--- branches/experimental/toiger/src/disassembler.cc    (original)
+++ branches/experimental/toiger/src/disassembler.cc    Wed Nov 12 00:22:51  
2008
@@ -217,7 +217,7 @@
          HeapStringAllocator allocator;
          StringStream accumulator(&allocator);
          relocinfo.target_object()->ShortPrint(&accumulator);
-        SmartPointer<char> obj_name = accumulator.ToCString();
+        SmartPointer<const char> obj_name = accumulator.ToCString();
          out.AddFormatted("    ;; object: %s", *obj_name);
        } else if (rmode == RelocInfo::EXTERNAL_REFERENCE) {
          const char* reference_name =

Modified: branches/experimental/toiger/src/flag-definitions.h
==============================================================================
--- branches/experimental/toiger/src/flag-definitions.h (original)
+++ branches/experimental/toiger/src/flag-definitions.h Wed Nov 12 00:22:51  
2008
@@ -69,10 +69,27 @@
  #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.
@@ -202,6 +219,8 @@

  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

Modified: branches/experimental/toiger/src/flags.cc
==============================================================================
--- branches/experimental/toiger/src/flags.cc   (original)
+++ branches/experimental/toiger/src/flags.cc   Wed Nov 12 00:22:51 2008
@@ -31,6 +31,9 @@
  #include "v8.h"

  #include "platform.h"
+#include "smart-pointer.h"
+#include "string-stream.h"
+

  namespace v8 { namespace internal {

@@ -48,7 +51,7 @@
  // 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 };
+  enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS  
};

    FlagType type_;           // What type of flag, bool, int, or string.
    const char* name_;        // Name of the flag, ex "my_flag".
@@ -82,6 +85,11 @@
      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_);
@@ -102,6 +110,11 @@
      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_) {
@@ -111,12 +124,15 @@
          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;
@@ -137,6 +153,9 @@
        case TYPE_STRING:
          *string_variable() = string_default();
          break;
+      case TYPE_ARGS:
+        *args_variable() = args_default();
+        break;
      }
    }
  };
@@ -157,67 +176,81 @@
      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;
  }


-static char* ToString(Flag* flag) {
-  Vector<char> value;
+static SmartPointer<const char> ToString(Flag* flag) {
+  HeapStringAllocator string_allocator;
+  StringStream buffer(&string_allocator);
    switch (flag->type()) {
      case Flag::TYPE_BOOL:
-      value = Vector<char>::New(6);
-      OS::SNPrintF(value, "%s",  
(*flag->bool_variable() ? "true" : "false"));
+      buffer.Add("%s", (*flag->bool_variable() ? "true" : "false"));
        break;
      case Flag::TYPE_INT:
-      value = Vector<char>::New(12);
-      OS::SNPrintF(value, "%d", *flag->int_variable());
+      buffer.Add("%d", *flag->int_variable());
        break;
      case Flag::TYPE_FLOAT:
-      value = Vector<char>::New(20);
-      OS::SNPrintF(value, "%f", *flag->float_variable());
+      buffer.Add("%f", FmtElm(*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;
-        value = Vector<char>::New(length);
-        OS::SNPrintF(value, "%s", str);
-      } else {
-        value = Vector<char>::New(5);
-        OS::SNPrintF(value, "NULL");
+      buffer.Add("%s", str ? str : "NULL");
+      break;
+    }
+    case Flag::TYPE_ARGS: {
+      JSArguments args = *flag->args_variable();
+      if (args.argc() > 0) {
+        buffer.Add("%s",  args[0]);
+        for (int i = 1; i < args.argc(); i++) {
+          buffer.Add(" %s", args[i]);
+        }
        }
        break;
+    }
    }
-  ASSERT(!value.is_empty());
-  return value.start();
+  return buffer.ToCString();
  }


  // static
-List<char *>* FlagList::argv() {
-  List<char *>* args = new List<char*>(8);
+List<const char*>* FlagList::argv() {
+  List<const char*>* args = new List<const char*>(8);
+  Flag* args_flag = NULL;
    for (size_t i = 0; i < num_flags; ++i) {
      Flag* f = &flags[i];
      if (!f->IsDefault()) {
-      Vector<char> cmdline_flag;
+      if (f->type() == Flag::TYPE_ARGS) {
+        ASSERT(args_flag == NULL);
+        args_flag = f;  // Must be last in arguments.
+        continue;
+      }
+      HeapStringAllocator string_allocator;
+      StringStream buffer(&string_allocator);
        if (f->type() != Flag::TYPE_BOOL || *(f->bool_variable())) {
-        int length = strlen(f->name()) + 2 + 1;
-        cmdline_flag = Vector<char>::New(length);
-        OS::SNPrintF(cmdline_flag, "--%s", f->name());
+        buffer.Add("--%s", f->name());
        } else {
-        int length = strlen(f->name()) + 4 + 1;
-        cmdline_flag = Vector<char>::New(length);
-        OS::SNPrintF(cmdline_flag, "--no%s", f->name());
+        buffer.Add("--no%s", f->name());
        }
-      args->Add(cmdline_flag.start());
+      args->Add(buffer.ToCString().Detach());
        if (f->type() != Flag::TYPE_BOOL) {
-        args->Add(ToString(f));
+        args->Add(ToString(f).Detach());
        }
      }
    }
-
+  if (args_flag != NULL) {
+    HeapStringAllocator string_allocator;
+    StringStream buffer(&string_allocator);
+    buffer.Add("--%s", args_flag->name());
+    args->Add(buffer.ToCString().Detach());
+    JSArguments jsargs = *args_flag->args_variable();
+    for (int j = 0; j < jsargs.argc(); j++) {
+      args->Add(OS::StrDup(jsargs[j]));
+    }
+  }
    return args;
  }

@@ -239,8 +272,14 @@
    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;
@@ -324,7 +363,9 @@
        }

        // if we still need a flag value, use the next argument if available
-      if (flag->type() != Flag::TYPE_BOOL && value == NULL) {
+      if (flag->type() != Flag::TYPE_BOOL &&
+          flag->type() != Flag::TYPE_ARGS &&
+          value == NULL) {
          if (i < *argc) {
            value = argv[i++];
          } else {
@@ -350,6 +391,20 @@
          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 = NewArray<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
@@ -363,9 +418,11 @@
        }

        // remove the flag & value from the command
-      if (remove_flags)
-        while (j < i)
+      if (remove_flags) {
+        while (j < i) {
            argv[j++] = NULL;
+        }
+      }
      }
    }

@@ -467,11 +524,24 @@
    printf("Options:\n");
    for (size_t i = 0; i < num_flags; ++i) {
      Flag* f = &flags[i];
-    char* value = ToString(f);
+    SmartPointer<const char> value = ToString(f);
      printf("  --%s (%s)\n        type: %s  default: %s\n",
-           f->name(), f->comment(), Type2String(f->type()), value);
-    DeleteArray(value);
+           f->name(), f->comment(), Type2String(f->type()), *value);
    }
  }
+
+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

Modified: branches/experimental/toiger/src/flags.h
==============================================================================
--- branches/experimental/toiger/src/flags.h    (original)
+++ branches/experimental/toiger/src/flags.h    Wed Nov 12 00:22:51 2008
@@ -43,14 +43,15 @@
    // argv array passed to the main function, e.g.
    // ("--prof", "--log-file", "v8.prof", "--nolazy").
    //
-  // The caller is responsible for disposing the list.
-  static List<char *>* argv();
+  // The caller is responsible for disposing the list, as well
+  // as every element of it.
+  static List<const char*>* argv();

    // Set the flag values by parsing the command line. If remove_flags is
    // 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 indepdendent of the remove_flags
+  // (argc, argv) will remain unchanged independent 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):
@@ -59,6 +60,7 @@
    //   --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

Modified: branches/experimental/toiger/src/global-handles.cc
==============================================================================
--- branches/experimental/toiger/src/global-handles.cc  (original)
+++ branches/experimental/toiger/src/global-handles.cc  Wed Nov 12 00:22:51  
2008
@@ -96,6 +96,7 @@
    // Make this handle weak.
    void MakeWeak(void* parameter, WeakReferenceCallback callback) {
      LOG(HandleEvent("GlobalHandle::MakeWeak", handle().location()));
+    ASSERT(state_ != DESTROYED);
      if (state_ != WEAK && !IsNearDeath()) {
        GlobalHandles::number_of_weak_handles_++;
        if (object_->IsJSGlobalObject()) {
@@ -109,6 +110,7 @@

    void ClearWeakness() {
      LOG(HandleEvent("GlobalHandle::ClearWeakness", handle().location()));
+    ASSERT(state_ != DESTROYED);
      if (state_ == WEAK || IsNearDeath()) {
        GlobalHandles::number_of_weak_handles_--;
        if (object_->IsJSGlobalObject()) {

Modified: branches/experimental/toiger/src/ic-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/ic-ia32.cc (original)
+++ branches/experimental/toiger/src/ic-ia32.cc Wed Nov 12 00:22:51 2008
@@ -543,12 +543,12 @@

    // Call the entry.
    CEntryStub stub;
-  __ mov(Operand(eax), Immediate(2));
-  __ mov(Operand(ebx), Immediate(f));
+  __ mov(eax, Immediate(2));
+  __ mov(ebx, Immediate(f));
    __ CallStub(&stub);

    // Move result to edi and exit the internal frame.
-  __ mov(Operand(edi), eax);
+  __ mov(edi, eax);
    __ LeaveInternalFrame();

    // Check if the receiver is a global object of some sort.

Modified: branches/experimental/toiger/src/log.cc
==============================================================================
--- branches/experimental/toiger/src/log.cc     (original)
+++ branches/experimental/toiger/src/log.cc     Wed Nov 12 00:22:51 2008
@@ -728,7 +728,7 @@
            stream.Put(*p);
          }
        }
-      SmartPointer<char> expanded = stream.ToCString();
+      SmartPointer<const char> expanded = stream.ToCString();
        logfile_ = OS::FOpen(*expanded, "w");
      } else {
        logfile_ = OS::FOpen(FLAG_logfile, "w");

Modified: branches/experimental/toiger/src/macro-assembler-arm.cc
==============================================================================
--- branches/experimental/toiger/src/macro-assembler-arm.cc     (original)
+++ branches/experimental/toiger/src/macro-assembler-arm.cc     Wed Nov 12  
00:22:51 2008
@@ -818,7 +818,8 @@
      int argc = Builtins::GetArgumentsCount(id);
      uint32_t flags =
          Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
-        Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+        Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+        Bootstrapper::FixupFlagsUseCodeObject::encode(false);
      Unresolved entry = { pc_offset() - sizeof(Instr), flags, name };
      unresolved_.Add(entry);
    }
@@ -835,10 +836,13 @@
      int argc = Builtins::GetArgumentsCount(id);
      uint32_t flags =
          Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
-        Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+        Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+        Bootstrapper::FixupFlagsUseCodeObject::encode(true);
      Unresolved entry = { pc_offset() - sizeof(Instr), flags, name };
      unresolved_.Add(entry);
    }
+
+  add(target, target, Operand(Code::kHeaderSize - kHeapObjectTag));
  }



Modified: branches/experimental/toiger/src/macro-assembler-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/macro-assembler-ia32.cc    (original)
+++ branches/experimental/toiger/src/macro-assembler-ia32.cc    Wed Nov 12  
00:22:51 2008
@@ -295,7 +295,7 @@
    if (x.is_zero()) {
      xor_(dst, Operand(dst));  // shorter than mov
    } else {
-    mov(Operand(dst), x);
+    mov(dst, x);
    }
  }

@@ -697,7 +697,7 @@
    if (num_arguments > 0) {
      add(Operand(esp), Immediate(num_arguments * kPointerSize));
    }
-  mov(Operand(eax), Immediate(Factory::undefined_value()));
+  mov(eax, Immediate(Factory::undefined_value()));
  }


@@ -728,14 +728,14 @@
    // arguments passed in because it is constant. At some point we
    // should remove this need and make the runtime routine entry code
    // smarter.
-  mov(Operand(eax), Immediate(num_arguments));
+  Set(eax, Immediate(num_arguments));
    JumpToBuiltin(ext);
  }


  void MacroAssembler::JumpToBuiltin(const ExternalReference& ext) {
    // Set the entry point and jump to the C entry runtime stub.
-  mov(Operand(ebx), Immediate(ext));
+  mov(ebx, Immediate(ext));
    CEntryStub ces;
    jmp(ces.GetCode(), RelocInfo::CODE_TARGET);
  }
@@ -789,7 +789,7 @@
      Handle<Code> adaptor =
           
Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline));
      if (!code_constant.is_null()) {
-      mov(Operand(edx), Immediate(code_constant));
+      mov(edx, Immediate(code_constant));
        add(Operand(edx), Immediate(Code::kHeaderSize - kHeapObjectTag));
      } else if (!code_operand.is_reg(edx)) {
        mov(edx, code_operand);
@@ -875,7 +875,8 @@
    if (!resolved) {
      uint32_t flags =
          Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
-        Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+        Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+        Bootstrapper::FixupFlagsUseCodeObject::encode(false);
      Unresolved entry = { pc_offset() - sizeof(int32_t), flags, name };
      unresolved_.Add(entry);
    }
@@ -893,7 +894,8 @@
    if (!resolved) {
      uint32_t flags =
          Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
-        Bootstrapper::FixupFlagsIsPCRelative::encode(false);
+        Bootstrapper::FixupFlagsIsPCRelative::encode(false) |
+        Bootstrapper::FixupFlagsUseCodeObject::encode(true);
      Unresolved entry = { pc_offset() - sizeof(int32_t), flags, name };
      unresolved_.Add(entry);
    }

Modified: branches/experimental/toiger/src/objects.cc
==============================================================================
--- branches/experimental/toiger/src/objects.cc (original)
+++ branches/experimental/toiger/src/objects.cc Wed Nov 12 00:22:51 2008
@@ -3848,7 +3848,7 @@
    const int kAlignmentMask = sizeof(uint32_t) - 1;  // NOLINT
    uint32_t pa_addr = reinterpret_cast<uint32_t>(pa);
    uint32_t pb_addr = reinterpret_cast<uint32_t>(pb);
-  if ((pa_addr & kAlignmentMask) | (pb_addr & kAlignmentMask) == 0) {
+  if (((pa_addr & kAlignmentMask) | (pb_addr & kAlignmentMask)) == 0) {
  #endif
      const int kStepSize = sizeof(int) / sizeof(Char);  // NOLINT
      int endpoint = length - kStepSize;

Modified: branches/experimental/toiger/src/serialize.cc
==============================================================================
--- branches/experimental/toiger/src/serialize.cc       (original)
+++ branches/experimental/toiger/src/serialize.cc       Wed Nov 12 00:22:51 2008
@@ -966,7 +966,7 @@

  void Serializer::PutFlags() {
    writer_->PutC('F');
-  List<char*>* argv = FlagList::argv();
+  List<const char*>* argv = FlagList::argv();
    writer_->PutInt(argv->length());
    writer_->PutC('[');
    for (int i = 0; i < argv->length(); i++) {

Modified: branches/experimental/toiger/src/string-stream.cc
==============================================================================
--- branches/experimental/toiger/src/string-stream.cc   (original)
+++ branches/experimental/toiger/src/string-stream.cc   Wed Nov 12 00:22:51  
2008
@@ -141,6 +141,13 @@
        Add(formatted.start());
        break;
      }
+    case 'f': case 'g': case 'G': case 'e': case 'E': {
+      double value = current.data_.u_double_;
+      EmbeddedVector<char, 28> formatted;
+      OS::SNPrintF(formatted, temp.start(), value);
+      Add(formatted.start());
+      break;
+    }
      default:
        UNREACHABLE();
        break;
@@ -207,11 +214,11 @@
  }


-SmartPointer<char> StringStream::ToCString() {
+SmartPointer<const char> StringStream::ToCString() {
    char* str = NewArray<char>(length_ + 1);
    memcpy(str, buffer_, length_);
    str[length_] = '\0';
-  return SmartPointer<char>(str);
+  return SmartPointer<const char>(str);
  }



Modified: branches/experimental/toiger/src/string-stream.h
==============================================================================
--- branches/experimental/toiger/src/string-stream.h    (original)
+++ branches/experimental/toiger/src/string-stream.h    Wed Nov 12 00:22:51  
2008
@@ -73,16 +73,18 @@
  class FmtElm {
   public:
    FmtElm(int value) : type_(INT) { data_.u_int_ = value; }  // NOLINT
+  explicit FmtElm(double value) : type_(DOUBLE) { data_.u_double_ = value;  
}  // NOLINT
    FmtElm(const char* value) : type_(C_STR) { data_.u_c_str_ = value; }  //  
NOLINT
    FmtElm(Object* value) : type_(OBJ) { data_.u_obj_ = value; }  // NOLINT
    FmtElm(Handle<Object> value) : type_(HANDLE) { data_.u_handle_ =  
value.location(); }  // NOLINT
    FmtElm(void* value) : type_(INT) { data_.u_int_ =  
reinterpret_cast<int>(value); }  // NOLINT
   private:
    friend class StringStream;
-  enum Type { INT, C_STR, OBJ, HANDLE };
+  enum Type { INT, DOUBLE, C_STR, OBJ, HANDLE };
    Type type_;
    union {
      int u_int_;
+    double u_double_;
      const char* u_c_str_;
      Object* u_obj_;
      Object** u_handle_;
@@ -116,7 +118,7 @@
    void OutputToStdOut();
    void Log();
    Handle<String> ToString();
-  SmartPointer<char> ToCString();
+  SmartPointer<const char> ToCString();

    // Object printing support.
    void PrintName(Object* o);

Modified: branches/experimental/toiger/src/stub-cache-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/stub-cache-ia32.cc (original)
+++ branches/experimental/toiger/src/stub-cache-ia32.cc Wed Nov 12 00:22:51  
2008
@@ -395,7 +395,7 @@
    if ((transition != NULL) && (object->map()->unused_property_fields() ==  
0)) {
      // The properties must be extended before we can store the value.
      // We jump to a runtime call that extends the propeties array.
-    __ mov(Operand(ecx), Immediate(Handle<Map>(transition)));
+    __ mov(ecx, Immediate(Handle<Map>(transition)));
      Handle<Code> ic(Builtins::builtin(storage_extend));
      __ jmp(ic, RelocInfo::CODE_TARGET);
      return;
@@ -628,7 +628,7 @@
    }

    // Get the function and setup the context.
-  __ mov(Operand(edi), Immediate(Handle<JSFunction>(function)));
+  __ mov(edi, Immediate(Handle<JSFunction>(function)));
    __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));

    // Jump to the cached code (tail call).
@@ -681,14 +681,14 @@
    // Perform call.
    ExternalReference load_interceptor =
        ExternalReference(IC_Utility(IC::kLoadInterceptorProperty));
-  __ mov(Operand(eax), Immediate(3));
-  __ mov(Operand(ebx), Immediate(load_interceptor));
+  __ mov(eax, Immediate(3));
+  __ mov(ebx, Immediate(load_interceptor));

    CEntryStub stub;
    __ CallStub(&stub);

    // Move result to edi and restore receiver.
-  __ mov(Operand(edi), eax);
+  __ mov(edi, eax);
    __ mov(edx, Operand(ebp, (argc + 2) * kPointerSize));  // receiver

    // Exit frame.
@@ -750,7 +750,7 @@

    // Handle store cache miss.
    __ bind(&miss);
-  __ mov(Operand(ecx), Immediate(Handle<String>(name)));  // restore name
+  __ mov(ecx, Immediate(Handle<String>(name)));  // restore name
    Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
    __ jmp(ic, RelocInfo::CODE_TARGET);

@@ -807,7 +807,7 @@

    // Handle store cache miss.
    __ bind(&miss);
-  __ mov(Operand(ecx), Immediate(Handle<String>(name)));  // restore name
+  __ mov(ecx, Immediate(Handle<String>(name)));  // restore name
    Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
    __ jmp(ic, RelocInfo::CODE_TARGET);

@@ -862,7 +862,7 @@

    // Handle store cache miss.
    __ bind(&miss);
-  __ mov(Operand(ecx), Immediate(Handle<String>(name)));  // restore name
+  __ mov(ecx, Immediate(Handle<String>(name)));  // restore name
    Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
    __ jmp(ic, RelocInfo::CODE_TARGET);


Modified: branches/experimental/toiger/test/cctest/test-flags.cc
==============================================================================
--- branches/experimental/toiger/test/cctest/test-flags.cc      (original)
+++ branches/experimental/toiger/test/cctest/test-flags.cc      Wed Nov 12  
00:22:51 2008
@@ -168,3 +168,67 @@
    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());
+}
+

Modified: branches/experimental/toiger/tools/visual_studio/v8_base.vcproj
==============================================================================
--- branches/experimental/toiger/tools/visual_studio/v8_base.vcproj      
(original)
+++ branches/experimental/toiger/tools/visual_studio/v8_base.vcproj     Wed Nov 
 
12 00:22:51 2008
@@ -285,14 +285,6 @@
                                >
                        </File>
                        <File
-                               RelativePath="..\..\src\assembler-arm-inl.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\src\assembler-arm.h"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\src\assembler-ia32-inl.h"
                                >
                        </File>
@@ -369,10 +361,6 @@
                                >
                        </File>
                        <File
-                               RelativePath="..\..\src\codegen-arm.h"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\src\codegen-ia32.cc"
                                >
                        </File>
@@ -493,14 +481,6 @@
                                >
                        </File>
                        <File
-                               RelativePath="..\..\src\frames-arm-inl.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\src\frames-arm.h"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\src\frames-ia32-inl.h"
                                >
                        </File>
@@ -610,10 +590,6 @@
                        </File>
                        <File
                                RelativePath="..\..\src\log.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\src\macro-assembler-arm.h"
                                >
                        </File>
                        <File

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to