Push version 1.2.1 to trunk.

Added EcmaScript 5 JSON object.

Fix bug in preemption support on ARM.


git-svn-id: http://v8.googlecode.com/svn/trunk@1797 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/ChangeLog b/ChangeLog
index 7e28abd..d59c5be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-04-27: Version 1.2.1
+
+        Added EcmaScript 5 JSON object.
+
+        Fix bug in preemption support on ARM.
+
+
 2009-04-23: Version 1.2.0
 
         Optimized floating-point operations on ARM.
diff --git a/SConstruct b/SConstruct
index 0c8e3c0..05cb625 100644
--- a/SConstruct
+++ b/SConstruct
@@ -83,7 +83,8 @@
 
 LIBRARY_FLAGS = {
   'all': {
-    'CPPDEFINES':   ['ENABLE_LOGGING_AND_PROFILING']
+    'CPPDEFINES':   ['ENABLE_LOGGING_AND_PROFILING'],
+    'CPPPATH': [join(root_dir, 'src')]
   },
   'gcc': {
     'all': {
@@ -580,13 +581,13 @@
 
   def AddRelevantFlags(self, initial, flags):
     result = initial.copy()
-    self.AppendFlags(result, flags.get('all'))
     toolchain = self.options['toolchain']
     if toolchain in flags:
       self.AppendFlags(result, flags[toolchain].get('all'))
       for option in sorted(self.options.keys()):
         value = self.options[option]
         self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
+    self.AppendFlags(result, flags.get('all'))
     return result
 
   def AddRelevantSubFlags(self, options, flags):
diff --git a/include/v8-debug.h b/include/v8-debug.h
index debeac1..5235495 100644
--- a/include/v8-debug.h
+++ b/include/v8-debug.h
@@ -138,9 +138,10 @@
   // Break execution of JavaScript.
   static void DebugBreak();
 
-  // Message based interface. The message protocol is JSON.
+  // Message based interface. The message protocol is JSON. NOTE the message
+  // handler thread is not supported any more parameter must be false.
   static void SetMessageHandler(MessageHandler handler,
-                                bool message_handler_thread = true);
+                                bool message_handler_thread = false);
   static void SendCommand(const uint16_t* command, int length,
                           ClientData* client_data = NULL);
 
diff --git a/src/SConscript b/src/SConscript
index 97fb7d6..b0a2933 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -53,20 +53,22 @@
     'v8.cc', 'v8threads.cc', 'variables.cc', 'virtual-frame.cc', 'zone.cc'
   ],
   'arch:arm': [
-    'assembler-arm.cc', 'builtins-arm.cc', 'codegen-arm.cc', 'cpu-arm.cc',
-    'disasm-arm.cc', 'debug-arm.cc', 'frames-arm.cc', 'ic-arm.cc',
-    'jump-target-arm.cc', 'macro-assembler-arm.cc',
-    'regexp-macro-assembler-arm.cc', 'register-allocator-arm.cc',
-    'stub-cache-arm.cc', 'virtual-frame-arm.cc'
+    'arm/assembler-arm.cc', 'arm/builtins-arm.cc',
+    'arm/codegen-arm.cc', 'arm/cpu-arm.cc', 'arm/disasm-arm.cc',
+    'arm/debug-arm.cc', 'arm/frames-arm.cc', 'arm/ic-arm.cc',
+    'arm/jump-target-arm.cc', 'arm/macro-assembler-arm.cc',
+    'arm/register-allocator-arm.cc', 'arm/stub-cache-arm.cc',
+    'arm/regexp-macro-assembler-arm.cc', 'arm/virtual-frame-arm.cc'
   ],
   'arch:ia32': [
-    'assembler-ia32.cc', 'builtins-ia32.cc', 'codegen-ia32.cc',
-    'cpu-ia32.cc', 'disasm-ia32.cc', 'debug-ia32.cc', 'frames-ia32.cc',
-    'ic-ia32.cc', 'jump-target-ia32.cc', 'macro-assembler-ia32.cc',
-    'regexp-macro-assembler-ia32.cc', 'register-allocator-ia32.cc',
-    'stub-cache-ia32.cc', 'virtual-frame-ia32.cc'
+    'ia32/assembler-ia32.cc', 'ia32/builtins-ia32.cc',
+    'ia32/codegen-ia32.cc', 'ia32/cpu-ia32.cc', 'ia32/disasm-ia32.cc',
+    'ia32/debug-ia32.cc', 'ia32/frames-ia32.cc', 'ia32/ic-ia32.cc',
+    'ia32/jump-target-ia32.cc', 'ia32/macro-assembler-ia32.cc',
+    'ia32/register-allocator-ia32.cc', 'ia32/stub-cache-ia32.cc',
+    'ia32/regexp-macro-assembler-ia32.cc', 'ia32/virtual-frame-ia32.cc'
   ],
-  'simulator:arm': ['simulator-arm.cc'],
+  'simulator:arm': ['arm/simulator-arm.cc'],
   'os:freebsd': ['platform-freebsd.cc', 'platform-posix.cc'],
   'os:linux':   ['platform-linux.cc', 'platform-posix.cc'],
   'os:android': ['platform-linux.cc', 'platform-posix.cc'],
@@ -121,6 +123,7 @@
 mirror-delay.js
 date-delay.js
 regexp-delay.js
+json-delay.js
 '''.split()
 
 
diff --git a/src/api.cc b/src/api.cc
index 449926c..860317d 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -2422,7 +2422,7 @@
 
 
 const char* v8::V8::GetVersion() {
-  return "1.2.0";
+  return "1.2.1";
 }
 
 
@@ -3264,7 +3264,10 @@
                               bool message_handler_thread) {
   EnsureInitialized("v8::Debug::SetMessageHandler");
   ENTER_V8;
-  i::Debugger::SetMessageHandler(handler, message_handler_thread);
+  // Message handler thread not supported any more. Parameter temporally left in
+  // the API for client compatability reasons.
+  CHECK(!message_handler_thread);
+  i::Debugger::SetMessageHandler(handler);
 }
 
 
diff --git a/src/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h
similarity index 99%
rename from src/assembler-arm-inl.h
rename to src/arm/assembler-arm-inl.h
index 315605e..65757e7 100644
--- a/src/assembler-arm-inl.h
+++ b/src/arm/assembler-arm-inl.h
@@ -37,7 +37,7 @@
 #ifndef V8_ASSEMBLER_ARM_INL_H_
 #define V8_ASSEMBLER_ARM_INL_H_
 
-#include "assembler-arm.h"
+#include "arm/assembler-arm.h"
 #include "cpu.h"
 
 
diff --git a/src/assembler-arm.cc b/src/arm/assembler-arm.cc
similarity index 99%
rename from src/assembler-arm.cc
rename to src/arm/assembler-arm.cc
index ba7638e..191c865 100644
--- a/src/assembler-arm.cc
+++ b/src/arm/assembler-arm.cc
@@ -36,7 +36,7 @@
 
 #include "v8.h"
 
-#include "assembler-arm-inl.h"
+#include "arm/assembler-arm-inl.h"
 #include "serialize.h"
 
 namespace v8 { namespace internal {
diff --git a/src/assembler-arm.h b/src/arm/assembler-arm.h
similarity index 96%
rename from src/assembler-arm.h
rename to src/arm/assembler-arm.h
index f965ebd..5edccbc 100644
--- a/src/assembler-arm.h
+++ b/src/arm/assembler-arm.h
@@ -164,23 +164,23 @@
 
 // Condition field in instructions
 enum Condition {
-  eq =  0 << 28,
-  ne =  1 << 28,
-  cs =  2 << 28,
-  hs =  2 << 28,
-  cc =  3 << 28,
-  lo =  3 << 28,
-  mi =  4 << 28,
-  pl =  5 << 28,
-  vs =  6 << 28,
-  vc =  7 << 28,
-  hi =  8 << 28,
-  ls =  9 << 28,
-  ge = 10 << 28,
-  lt = 11 << 28,
-  gt = 12 << 28,
-  le = 13 << 28,
-  al = 14 << 28
+  eq =  0 << 28,  // Z set            equal.
+  ne =  1 << 28,  // Z clear          not equal.
+  cs =  2 << 28,  // C set            unsigned higher or same.
+  hs =  2 << 28,  // C set            unsigned higher or same.
+  cc =  3 << 28,  // C clear          unsigned lower.
+  lo =  3 << 28,  // C clear          unsigned lower.
+  mi =  4 << 28,  // N set            negative.
+  pl =  5 << 28,  // N clear          positive or zero.
+  vs =  6 << 28,  // V set            overflow.
+  vc =  7 << 28,  // V clear          no overflow.
+  hi =  8 << 28,  // C set, Z clear   unsigned higher.
+  ls =  9 << 28,  // C clear or Z set unsigned lower or same.
+  ge = 10 << 28,  // N == V           greater or equal.
+  lt = 11 << 28,  // N != V           less than.
+  gt = 12 << 28,  // Z clear, N == V  greater than.
+  le = 13 << 28,  // Z set or N != V  less then or equal
+  al = 14 << 28   //                  always.
 };
 
 
diff --git a/src/builtins-arm.cc b/src/arm/builtins-arm.cc
similarity index 96%
rename from src/builtins-arm.cc
rename to src/arm/builtins-arm.cc
index 58eeca8..519c04a 100644
--- a/src/builtins-arm.cc
+++ b/src/arm/builtins-arm.cc
@@ -417,15 +417,35 @@
   __ push(r0);
   __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_JS);
 
-  // Eagerly check for stack-overflow before starting to push the arguments.
-  // r0: number of arguments
-  Label okay;
+  Label no_preemption, retry_preemption;
+  __ bind(&retry_preemption);
   ExternalReference stack_guard_limit_address =
       ExternalReference::address_of_stack_guard_limit();
   __ mov(r2, Operand(stack_guard_limit_address));
   __ ldr(r2, MemOperand(r2));
+  __ cmp(sp, r2);
+  __ b(hi, &no_preemption);
+
+  // We have encountered a preemption or stack overflow already before we push
+  // the array contents.  Save r0 which is the Smi-tagged length of the array.
+  __ push(r0);
+
+  // Runtime routines expect at least one argument, so give it a Smi.
+  __ mov(r0, Operand(Smi::FromInt(0)));
+  __ push(r0);
+  __ CallRuntime(Runtime::kStackGuard, 1);
+
+  // Since we returned, it wasn't a stack overflow.  Restore r0 and try again.
+  __ pop(r0);
+  __ b(&retry_preemption);
+
+  __ bind(&no_preemption);
+
+  // Eagerly check for stack-overflow before starting to push the arguments.
+  // r0: number of arguments.
+  // r2: stack limit.
+  Label okay;
   __ sub(r2, sp, r2);
-  __ sub(r2, r2, Operand(3 * kPointerSize));  // limit, index, receiver
 
   __ cmp(r2, Operand(r0, LSL, kPointerSizeLog2 - kSmiTagSize));
   __ b(hi, &okay);
diff --git a/src/codegen-arm.cc b/src/arm/codegen-arm.cc
similarity index 99%
rename from src/codegen-arm.cc
rename to src/arm/codegen-arm.cc
index 9337454..57e98c1 100644
--- a/src/codegen-arm.cc
+++ b/src/arm/codegen-arm.cc
@@ -4596,7 +4596,9 @@
   __ ldr(ip, MemOperand(ip));
   __ cmp(sp, Operand(ip));
   __ b(hs, &within_limit);
-  // Do tail-call to runtime routine.
+  // Do tail-call to runtime routine.  Runtime routines expect at least one
+  // argument, so give it a Smi.
+  __ mov(r0, Operand(Smi::FromInt(0)));
   __ push(r0);
   __ TailCallRuntime(ExternalReference(Runtime::kStackGuard), 1);
   __ bind(&within_limit);
diff --git a/src/codegen-arm.h b/src/arm/codegen-arm.h
similarity index 100%
rename from src/codegen-arm.h
rename to src/arm/codegen-arm.h
diff --git a/src/constants-arm.h b/src/arm/constants-arm.h
similarity index 100%
rename from src/constants-arm.h
rename to src/arm/constants-arm.h
diff --git a/src/cpu-arm.cc b/src/arm/cpu-arm.cc
similarity index 100%
rename from src/cpu-arm.cc
rename to src/arm/cpu-arm.cc
diff --git a/src/debug-arm.cc b/src/arm/debug-arm.cc
similarity index 100%
rename from src/debug-arm.cc
rename to src/arm/debug-arm.cc
diff --git a/src/disasm-arm.cc b/src/arm/disasm-arm.cc
similarity index 100%
rename from src/disasm-arm.cc
rename to src/arm/disasm-arm.cc
diff --git a/src/frames-arm.cc b/src/arm/frames-arm.cc
similarity index 98%
rename from src/frames-arm.cc
rename to src/arm/frames-arm.cc
index 121fb75..d26198a 100644
--- a/src/frames-arm.cc
+++ b/src/arm/frames-arm.cc
@@ -28,7 +28,7 @@
 #include "v8.h"
 
 #include "frames-inl.h"
-#include "assembler-arm-inl.h"
+#include "arm/assembler-arm-inl.h"
 
 
 namespace v8 { namespace internal {
diff --git a/src/frames-arm.h b/src/arm/frames-arm.h
similarity index 100%
rename from src/frames-arm.h
rename to src/arm/frames-arm.h
diff --git a/src/ic-arm.cc b/src/arm/ic-arm.cc
similarity index 95%
rename from src/ic-arm.cc
rename to src/arm/ic-arm.cc
index ad6eb2c..e418556 100644
--- a/src/ic-arm.cc
+++ b/src/arm/ic-arm.cc
@@ -127,27 +127,20 @@
 }
 
 
-// Helper function used to check that a value is either not a function
-// or is loaded if it is a function.
-static void GenerateCheckNonFunctionOrLoaded(MacroAssembler* masm,
-                                             Label* miss,
-                                             Register value,
-                                             Register scratch) {
+// Helper function used to check that a value is either not an object
+// or is loaded if it is an object.
+static void GenerateCheckNonObjectOrLoaded(MacroAssembler* masm,
+                                           Label* miss,
+                                           Register value,
+                                           Register scratch) {
   Label done;
   // Check if the value is a Smi.
   __ tst(value, Operand(kSmiTagMask));
   __ b(eq, &done);
-  // Check if the value is a function.
-  __ ldr(scratch, FieldMemOperand(value, HeapObject::kMapOffset));
-  __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset));
-  __ cmp(scratch, Operand(JS_FUNCTION_TYPE));
-  __ b(ne, &done);
-  // Check if the function has been loaded.
-  __ ldr(scratch,
-         FieldMemOperand(value, JSFunction::kSharedFunctionInfoOffset));
-  __ ldr(scratch,
-         FieldMemOperand(scratch, SharedFunctionInfo::kLazyLoadDataOffset));
-  __ cmp(scratch, Operand(Factory::undefined_value()));
+  // Check if the object has been loaded.
+  __ ldr(scratch, FieldMemOperand(value, JSObject::kMapOffset));
+  __ ldrb(scratch, FieldMemOperand(scratch, Map::kBitField2Offset));
+  __ tst(scratch, Operand(1 << Map::kNeedsLoading));
   __ b(ne, miss);
   __ bind(&done);
 }
@@ -284,9 +277,9 @@
   __ b(ne, miss);
 
   // Check that the function has been loaded.
-  __ ldr(r0, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
-  __ ldr(r0, FieldMemOperand(r0, SharedFunctionInfo::kLazyLoadDataOffset));
-  __ cmp(r0, Operand(Factory::undefined_value()));
+  __ ldr(r0, FieldMemOperand(r1, JSObject::kMapOffset));
+  __ ldrb(r0, FieldMemOperand(r0, Map::kBitField2Offset));
+  __ tst(r0, Operand(1 << Map::kNeedsLoading));
   __ b(ne, miss);
 
   // Patch the receiver with the global proxy if necessary.
@@ -470,7 +463,7 @@
 
   __ bind(&probe);
   GenerateDictionaryLoad(masm, &miss, r1, r0);
-  GenerateCheckNonFunctionOrLoaded(masm, &miss, r0, r1);
+  GenerateCheckNonObjectOrLoaded(masm, &miss, r0, r1);
   __ Ret();
 
   // Global object access: Check access rights.
diff --git a/src/jump-target-arm.cc b/src/arm/jump-target-arm.cc
similarity index 100%
rename from src/jump-target-arm.cc
rename to src/arm/jump-target-arm.cc
diff --git a/src/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
similarity index 100%
rename from src/macro-assembler-arm.cc
rename to src/arm/macro-assembler-arm.cc
diff --git a/src/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h
similarity index 100%
rename from src/macro-assembler-arm.h
rename to src/arm/macro-assembler-arm.h
diff --git a/src/regexp-macro-assembler-arm.cc b/src/arm/regexp-macro-assembler-arm.cc
similarity index 97%
rename from src/regexp-macro-assembler-arm.cc
rename to src/arm/regexp-macro-assembler-arm.cc
index bcfddf6..bf07f0e 100644
--- a/src/regexp-macro-assembler-arm.cc
+++ b/src/arm/regexp-macro-assembler-arm.cc
@@ -28,7 +28,7 @@
 #include "v8.h"
 #include "ast.h"
 #include "regexp-macro-assembler.h"
-#include "regexp-macro-assembler-arm.h"
+#include "arm/regexp-macro-assembler-arm.h"
 
 namespace v8 { namespace internal {
 
diff --git a/src/regexp-macro-assembler-arm.h b/src/arm/regexp-macro-assembler-arm.h
similarity index 100%
rename from src/regexp-macro-assembler-arm.h
rename to src/arm/regexp-macro-assembler-arm.h
diff --git a/src/register-allocator-arm.cc b/src/arm/register-allocator-arm.cc
similarity index 100%
rename from src/register-allocator-arm.cc
rename to src/arm/register-allocator-arm.cc
diff --git a/src/simulator-arm.cc b/src/arm/simulator-arm.cc
similarity index 99%
rename from src/simulator-arm.cc
rename to src/arm/simulator-arm.cc
index 7d96b3a..9737e95 100644
--- a/src/simulator-arm.cc
+++ b/src/arm/simulator-arm.cc
@@ -30,8 +30,8 @@
 #include "v8.h"
 
 #include "disasm.h"
-#include "constants-arm.h"
-#include "simulator-arm.h"
+#include "arm/constants-arm.h"
+#include "arm/simulator-arm.h"
 
 #if !defined(__arm__)
 
diff --git a/src/simulator-arm.h b/src/arm/simulator-arm.h
similarity index 100%
rename from src/simulator-arm.h
rename to src/arm/simulator-arm.h
diff --git a/src/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc
similarity index 100%
rename from src/stub-cache-arm.cc
rename to src/arm/stub-cache-arm.cc
diff --git a/src/virtual-frame-arm.cc b/src/arm/virtual-frame-arm.cc
similarity index 98%
rename from src/virtual-frame-arm.cc
rename to src/arm/virtual-frame-arm.cc
index b794d8b..43100f1 100644
--- a/src/virtual-frame-arm.cc
+++ b/src/arm/virtual-frame-arm.cc
@@ -71,6 +71,16 @@
 }
 
 
+void VirtualFrame::SyncRange(int begin, int end) {
+  // All elements are in memory on ARM (ie, synced).
+#ifdef DEBUG
+  for (int i = begin; i <= end; i++) {
+    ASSERT(elements_[i].is_synced());
+  }
+#endif
+}
+
+
 void VirtualFrame::MergeTo(VirtualFrame* expected) {
   Comment cmnt(masm_, "[ Merge frame");
   // We should always be merging the code generator's current frame to an
diff --git a/src/virtual-frame-arm.h b/src/arm/virtual-frame-arm.h
similarity index 100%
rename from src/virtual-frame-arm.h
rename to src/arm/virtual-frame-arm.h
diff --git a/src/ast.cc b/src/ast.cc
index 1a6010a..d19e3b3 100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -152,6 +152,27 @@
 }
 
 
+bool ObjectLiteral::IsValidJSON() {
+  int length = properties()->length();
+  for (int i = 0; i < length; i++) {
+    Property* prop = properties()->at(i);
+    if (!prop->value()->IsValidJSON())
+      return false;
+  }
+  return true;
+}
+
+
+bool ArrayLiteral::IsValidJSON() {
+  int length = values()->length();
+  for (int i = 0; i < length; i++) {
+    if (!values()->at(i)->IsValidJSON())
+      return false;
+  }
+  return true;
+}
+
+
 void TargetCollector::AddTarget(BreakTarget* target) {
   // Add the label to the collector, but discard duplicates.
   int length = targets_->length();
diff --git a/src/ast.h b/src/ast.h
index b496816..6a2f671 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -155,6 +155,7 @@
  public:
   virtual Expression* AsExpression()  { return this; }
 
+  virtual bool IsValidJSON() { return false; }
   virtual bool IsValidLeftHandSide() { return false; }
 
   // Mark the expression as being compiled as an expression
@@ -625,6 +626,8 @@
     return handle_.is_identical_to(other->handle_);
   }
 
+  virtual bool IsValidJSON() { return true; }
+
   // Identity testers.
   bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); }
   bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); }
@@ -653,6 +656,8 @@
   // constants and simple object and array literals.
   bool is_simple() const { return is_simple_; }
 
+  virtual bool IsValidJSON() { return true; }
+
   int depth() const { return depth_; }
 
  private:
@@ -704,6 +709,7 @@
 
   virtual ObjectLiteral* AsObjectLiteral() { return this; }
   virtual void Accept(AstVisitor* v);
+  virtual bool IsValidJSON();
 
   Handle<FixedArray> constant_properties() const {
     return constant_properties_;
@@ -751,6 +757,7 @@
 
   virtual void Accept(AstVisitor* v);
   virtual ArrayLiteral* AsArrayLiteral() { return this; }
+  virtual bool IsValidJSON();
 
   Handle<FixedArray> literals() const { return literals_; }
   ZoneList<Expression*>* values() const { return values_; }
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index eebec74..c434207 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -530,7 +530,7 @@
     global_context()->function_instance_map()->set_prototype(*empty_function);
 
     // Allocate the function map first and then patch the prototype later
-    Handle<Map> empty_fm = Factory::CopyMap(fm);
+    Handle<Map> empty_fm = Factory::CopyMapDropDescriptors(fm);
     empty_fm->set_instance_descriptors(*function_map_descriptors);
     empty_fm->set_prototype(global_context()->object_function()->prototype());
     empty_function->set_map(*empty_fm);
@@ -741,6 +741,19 @@
     global_context()->set_regexp_function(*regexp_fun);
   }
 
+  {  // -- J S O N
+    Handle<String> name = Factory::NewStringFromAscii(CStrVector("JSON"));
+    Handle<JSFunction> cons = Factory::NewFunction(
+        name,
+        Factory::the_hole_value());
+    cons->SetInstancePrototype(global_context()->initial_object_prototype());
+    cons->SetInstanceClassName(*name);
+    Handle<JSObject> json_object = Factory::NewJSObject(cons, TENURED);
+    ASSERT(json_object->IsJSObject());
+    SetProperty(global, name, json_object, DONT_ENUM);
+    global_context()->set_json_object(*json_object);
+  }
+
   {  // --- arguments_boilerplate_
     // Make sure we can recognize argument objects at runtime.
     // This is done by introducing an anonymous function with
@@ -1068,6 +1081,10 @@
               Natives::GetIndex("regexp"),
               Top::global_context(),
               Handle<Context>(Top::context()->runtime_context()));
+    SetupLazy(Handle<JSObject>(global_context()->json_object()),
+              Natives::GetIndex("json"),
+              Top::global_context(),
+              Handle<Context>(Top::context()->runtime_context()));
 
   } else if (strlen(FLAG_natives_file) != 0) {
     // Otherwise install natives from natives file if file exists and
@@ -1416,7 +1433,7 @@
 
   Handle<DescriptorArray> function_map_descriptors =
       ComputeFunctionInstanceDescriptor(false, true);
-  Handle<Map> fm = Factory::CopyMap(Top::function_map());
+  Handle<Map> fm = Factory::CopyMapDropDescriptors(Top::function_map());
   fm->set_instance_descriptors(*function_map_descriptors);
   Top::context()->global_context()->set_function_map(*fm);
 }
diff --git a/src/codegen.h b/src/codegen.h
index 54fe330..e9a5edd 100644
--- a/src/codegen.h
+++ b/src/codegen.h
@@ -77,9 +77,9 @@
 
 
 #ifdef ARM
-#include "codegen-arm.h"
+#include "arm/codegen-arm.h"
 #else
-#include "codegen-ia32.h"
+#include "ia32/codegen-ia32.h"
 #endif
 
 namespace v8 { namespace internal {
diff --git a/src/compiler.cc b/src/compiler.cc
index 62e838e..c16b938 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -80,8 +80,20 @@
 }
 
 
+static bool IsValidJSON(FunctionLiteral* lit) {
+  if (!lit->body()->length() == 1)
+    return false;
+  Statement* stmt = lit->body()->at(0);
+  if (stmt->AsExpressionStatement() == NULL)
+    return false;
+  Expression *expr = stmt->AsExpressionStatement()->expression();
+  return expr->IsValidJSON();
+}
+
+
 static Handle<JSFunction> MakeFunction(bool is_global,
                                        bool is_eval,
+                                       bool is_json,
                                        Handle<Script> script,
                                        Handle<Context> context,
                                        v8::Extension* extension,
@@ -109,6 +121,19 @@
     return Handle<JSFunction>::null();
   }
 
+  // When parsing JSON we do an ordinary parse and then afterwards
+  // check the AST to ensure it was well-formed.  If not we give a
+  // syntax error.
+  if (is_json && !IsValidJSON(lit)) {
+    HandleScope scope;
+    Handle<JSArray> args = Factory::NewJSArray(1);
+    Handle<Object> source(script->source());
+    SetElement(args, 0, source);
+    Handle<Object> result = Factory::NewSyntaxError("invalid_json", args);
+    Top::Throw(*result, NULL);
+    return Handle<JSFunction>::null();
+  }
+
   // Measure how long it takes to do the compilation; only take the
   // rest of the function into account to avoid overlap with the
   // parsing statistics.
@@ -215,6 +240,7 @@
     // Compile the function and add it to the cache.
     result = MakeFunction(true,
                           false,
+                          false,
                           script,
                           Handle<Context>::null(),
                           extension,
@@ -237,7 +263,8 @@
 Handle<JSFunction> Compiler::CompileEval(Handle<String> source,
                                          Handle<Context> context,
                                          int line_offset,
-                                         bool is_global) {
+                                         bool is_global,
+                                         bool is_json) {
   int source_length = source->length();
   Counters::total_eval_size.Increment(source_length);
   Counters::total_compile_size.Increment(source_length);
@@ -256,7 +283,13 @@
     // Create a script object describing the script to be compiled.
     Handle<Script> script = Factory::NewScript(source);
     script->set_line_offset(Smi::FromInt(line_offset));
-    result = MakeFunction(is_global, true, script, context, NULL, NULL);
+    result = MakeFunction(is_global,
+                          true,
+                          is_json,
+                          script,
+                          context,
+                          NULL,
+                          NULL);
     if (!result.is_null()) {
       CompilationCache::PutEval(source, context, entry, result);
     }
diff --git a/src/compiler.h b/src/compiler.h
index 4f589b7..8abe130 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -60,7 +60,8 @@
   static Handle<JSFunction> CompileEval(Handle<String> source,
                                         Handle<Context> context,
                                         int line_offset,
-                                        bool is_global);
+                                        bool is_global,
+                                        bool is_json);
 
   // Compile from function info (used for lazy compilation). Returns
   // true on success and false if the compilation resulted in a stack
diff --git a/src/contexts.h b/src/contexts.h
index 3c25bd3..ed4b1cf 100644
--- a/src/contexts.h
+++ b/src/contexts.h
@@ -64,6 +64,7 @@
   V(OBJECT_FUNCTION_INDEX, JSFunction, object_function) \
   V(ARRAY_FUNCTION_INDEX, JSFunction, array_function) \
   V(DATE_FUNCTION_INDEX, JSFunction, date_function) \
+  V(JSON_OBJECT_INDEX, JSObject, json_object) \
   V(REGEXP_FUNCTION_INDEX, JSFunction, regexp_function) \
   V(INITIAL_OBJECT_PROTOTYPE_INDEX, JSObject, initial_object_prototype) \
   V(CREATE_DATE_FUN_INDEX, JSFunction,  create_date_fun) \
@@ -186,6 +187,7 @@
     OBJECT_FUNCTION_INDEX,
     ARRAY_FUNCTION_INDEX,
     DATE_FUNCTION_INDEX,
+    JSON_OBJECT_INDEX,
     REGEXP_FUNCTION_INDEX,
     CREATE_DATE_FUN_INDEX,
     TO_NUMBER_FUN_INDEX,
diff --git a/src/date-delay.js b/src/date-delay.js
index 2421e5b..dbb9c2c 100644
--- a/src/date-delay.js
+++ b/src/date-delay.js
@@ -985,6 +985,25 @@
 }
 
 
+function PadInt(n) {
+  // Format integers to have at least two digits.
+  return n < 10 ? '0' + n : n;
+}
+
+
+function DateToISOString() {
+  return this.getUTCFullYear() + '-' + PadInt(this.getUTCMonth() + 1) +
+      '-' + PadInt(this.getUTCDate()) + 'T' + PadInt(this.getUTCHours()) +
+      ':' + PadInt(this.getUTCMinutes()) + ':' + PadInt(this.getUTCSeconds()) +
+      'Z';
+}
+
+
+function DateToJSON(key) {
+  return CheckJSONPrimitive(this.toISOString());
+}
+
+
 // -------------------------------------------------------------------
 
 function SetupDate() {
@@ -1044,7 +1063,9 @@
     "toGMTString", DateToGMTString,
     "toUTCString", DateToUTCString,
     "getYear", DateGetYear,
-    "setYear", DateSetYear
+    "setYear", DateSetYear,
+    "toISOString", DateToISOString,
+    "toJSON", DateToJSON
   ));
 }
 
diff --git a/src/debug-agent.cc b/src/debug-agent.cc
index 9838746..0fab188 100644
--- a/src/debug-agent.cc
+++ b/src/debug-agent.cc
@@ -107,7 +107,7 @@
 
   // Create a new session and hook up the debug message handler.
   session_ = new DebuggerAgentSession(this, client);
-  v8::Debug::SetMessageHandler(DebuggerAgentMessageHandler, this);
+  v8::Debug::SetMessageHandler(DebuggerAgentMessageHandler);
   session_->Start();
 }
 
diff --git a/src/debug-delay.js b/src/debug-delay.js
index 6cb5e7f..961f304 100644
--- a/src/debug-delay.js
+++ b/src/debug-delay.js
@@ -1133,7 +1133,7 @@
   try {
     try {
       // Convert the JSON string to an object.
-      request = %CompileString('(' + json_request + ')', 0)();
+      request = %CompileString('(' + json_request + ')', 0, false)();
 
       // Create an initial response.
       response = this.createResponse(request);
diff --git a/src/debug.cc b/src/debug.cc
index 32a96a8..239a373 100644
--- a/src/debug.cc
+++ b/src/debug.cc
@@ -1420,16 +1420,13 @@
 bool Debugger::compiling_natives_ = false;
 bool Debugger::is_loading_debugger_ = false;
 bool Debugger::never_unload_debugger_ = false;
-DebugMessageThread* Debugger::message_thread_ = NULL;
 v8::Debug::MessageHandler Debugger::message_handler_ = NULL;
 bool Debugger::message_handler_cleared_ = false;
 v8::Debug::HostDispatchHandler Debugger::host_dispatch_handler_ = NULL;
 int Debugger::host_dispatch_micros_ = 100 * 1000;
 DebuggerAgent* Debugger::agent_ = NULL;
-LockingMessageQueue Debugger::command_queue_(kQueueInitialSize);
-LockingMessageQueue Debugger::message_queue_(kQueueInitialSize);
+LockingCommandMessageQueue Debugger::command_queue_(kQueueInitialSize);
 Semaphore* Debugger::command_received_ = OS::CreateSemaphore(0);
-Semaphore* Debugger::message_received_ = OS::CreateSemaphore(0);
 
 
 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name,
@@ -1818,7 +1815,7 @@
   // Notify the debugger that a debug event has occurred unless auto continue is
   // active in which case no event is send.
   if (!auto_continue) {
-    bool success = SendEventMessage(event_data);
+    bool success = InvokeMessageHandlerWithEvent(event_data);
     if (!success) {
       // If failed to notify debugger just continue running.
       return;
@@ -1845,7 +1842,7 @@
     StackGuard::Continue(DEBUGCOMMAND);
 
     // Get the command from the queue.
-    Message command = command_queue_.Get();
+    CommandMessage command = command_queue_.Get();
     Logger::DebugTag("Got request from command queue, in interactive loop.");
     if (!Debugger::IsDebuggerActive()) {
       // Delete command text and user data.
@@ -1900,7 +1897,7 @@
     }
 
     // Return the result.
-    SendMessage(Message::NewOutput(response, command.client_data()));
+    InvokeMessageHandler(response, command.client_data());
 
     // Return from debug event processing if either the VM is put into the
     // runnning state (through a continue command) or auto continue is active
@@ -1946,17 +1943,11 @@
 }
 
 
-void Debugger::SetMessageHandler(v8::Debug::MessageHandler handler,
-                                 bool message_handler_thread) {
+void Debugger::SetMessageHandler(v8::Debug::MessageHandler handler) {
   ScopedLock with(debugger_access_);
 
   message_handler_ = handler;
-  if (handler != NULL) {
-    if (!message_thread_ && message_handler_thread) {
-      message_thread_ = new DebugMessageThread();
-      message_thread_->Start();
-    }
-  } else {
+  if (handler == NULL) {
     // Indicate that the message handler was recently cleared.
     message_handler_cleared_ = true;
 
@@ -1980,34 +1971,25 @@
 // public API. Messages are kept internally as Vector<uint16_t> strings, which
 // are allocated in various places and deallocated by the calling function
 // sometime after this call.
-void Debugger::InvokeMessageHandler(Message message) {
+void Debugger::InvokeMessageHandler(v8::Handle<v8::String> output,
+                                    v8::Debug::ClientData* data) {
   ScopedLock with(debugger_access_);
 
   if (message_handler_ != NULL) {
-    message_handler_(message.text().start(),
-                     message.text().length(),
-                     message.client_data());
+    Vector<uint16_t> text = Vector<uint16_t>::New(output->Length());
+    output->Write(text.start(), 0, output->Length());
+
+    message_handler_(text.start(),
+                     text.length(),
+                     data);
+
+    text.Dispose();
   }
-  message.Dispose();
+  delete data;
 }
 
 
-void Debugger::SendMessage(Message message) {
-  if (message_thread_ == NULL) {
-    // If there is no message thread just invoke the message handler from the
-    // V8 thread.
-    InvokeMessageHandler(message);
-  } else {
-    // Put the message coming from V8 on the queue. The text and user data will
-    // be destroyed by the message thread.
-    Logger::DebugTag("Put message on event message_queue.");
-    message_queue_.Put(message);
-    message_received_->Signal();
-  }
-}
-
-
-bool Debugger::SendEventMessage(Handle<Object> event_data) {
+bool Debugger::InvokeMessageHandlerWithEvent(Handle<Object> event_data) {
   v8::HandleScope scope;
   // Call toJSONProtocol on the debug event object.
   v8::Local<v8::Object> api_event_data =
@@ -2024,11 +2006,10 @@
       if (FLAG_trace_debug_json) {
         PrintLn(json_event_string);
       }
-      SendMessage(Message::NewOutput(
-          json_event_string,
-          NULL /* no user data since there was no request */));
+      InvokeMessageHandler(json_event_string,
+                           NULL /* no user data since there was no request */);
     } else {
-      SendMessage(Message::NewEmptyMessage());
+      InvokeMessageHandler(v8::String::Empty(), NULL);
     }
   } else {
     PrintLn(try_catch.Exception());
@@ -2041,13 +2022,11 @@
 // Puts a command coming from the public API on the queue.  Creates
 // a copy of the command string managed by the debugger.  Up to this
 // point, the command data was managed by the API client.  Called
-// by the API client thread.  This is where the API client hands off
-// processing of the command to the DebugMessageThread thread.
-// The new copy of the command is destroyed in HandleCommand().
+// by the API client thread.
 void Debugger::ProcessCommand(Vector<const uint16_t> command,
                               v8::Debug::ClientData* client_data) {
   // Need to cast away const.
-  Message message = Message::NewCommand(
+  CommandMessage message = CommandMessage::New(
       Vector<uint16_t>(const_cast<uint16_t*>(command.start()),
                        command.length()),
       client_data);
@@ -2122,99 +2101,51 @@
 }
 
 
-void Debugger::TearDown() {
-  if (message_thread_ != NULL) {
-    message_thread_->Stop();
-    delete message_thread_;
-    message_thread_ = NULL;
-  }
+CommandMessage::CommandMessage() : text_(Vector<uint16_t>::empty()),
+                                   client_data_(NULL) {
 }
 
 
-void DebugMessageThread::Run() {
-  // Sends debug events to an installed debugger message callback.
-  while (keep_running_) {
-    // Wait and Get are paired so that semaphore count equals queue length.
-    Debugger::message_received_->Wait();
-    Logger::DebugTag("Get message from event message_queue.");
-    Message message = Debugger::message_queue_.Get();
-    if (message.text().length() > 0) {
-      Debugger::InvokeMessageHandler(message);
-    } else {
-      message.Dispose();
-    }
-  }
-}
-
-
-void DebugMessageThread::Stop() {
-  keep_running_ = false;
-  Debugger::SendMessage(Message::NewEmptyMessage());
-  Join();
-}
-
-
-Message::Message() : text_(Vector<uint16_t>::empty()),
-                     client_data_(NULL) {
-}
-
-
-Message::Message(const Vector<uint16_t>& text,
-                 v8::Debug::ClientData* data)
+CommandMessage::CommandMessage(const Vector<uint16_t>& text,
+                               v8::Debug::ClientData* data)
     : text_(text),
       client_data_(data) {
 }
 
 
-Message::~Message() {
+CommandMessage::~CommandMessage() {
 }
 
 
-void Message::Dispose() {
+void CommandMessage::Dispose() {
   text_.Dispose();
   delete client_data_;
   client_data_ = NULL;
 }
 
 
-Message Message::NewCommand(const Vector<uint16_t>& command,
-                            v8::Debug::ClientData* data) {
-  return Message(command.Clone(), data);
+CommandMessage CommandMessage::New(const Vector<uint16_t>& command,
+                                   v8::Debug::ClientData* data) {
+  return CommandMessage(command.Clone(), data);
 }
 
 
-Message Message::NewOutput(v8::Handle<v8::String> output,
-                           v8::Debug::ClientData* data) {
-  Vector<uint16_t> text;
-  if (!output.IsEmpty()) {
-    // Do not include trailing '\0'.
-    text = Vector<uint16_t>::New(output->Length());
-    output->Write(text.start(), 0, output->Length());
-  }
-  return Message(text, data);
+CommandMessageQueue::CommandMessageQueue(int size) : start_(0), end_(0),
+                                                     size_(size) {
+  messages_ = NewArray<CommandMessage>(size);
 }
 
 
-Message Message::NewEmptyMessage() {
-  return Message();
-}
-
-
-MessageQueue::MessageQueue(int size) : start_(0), end_(0), size_(size) {
-  messages_ = NewArray<Message>(size);
-}
-
-
-MessageQueue::~MessageQueue() {
+CommandMessageQueue::~CommandMessageQueue() {
   while (!IsEmpty()) {
-    Message m = Get();
+    CommandMessage m = Get();
     m.Dispose();
   }
   DeleteArray(messages_);
 }
 
 
-Message MessageQueue::Get() {
+CommandMessage CommandMessageQueue::Get() {
   ASSERT(!IsEmpty());
   int result = start_;
   start_ = (start_ + 1) % size_;
@@ -2222,7 +2153,7 @@
 }
 
 
-void MessageQueue::Put(const Message& message) {
+void CommandMessageQueue::Put(const CommandMessage& message) {
   if ((end_ + 1) % size_ == start_) {
     Expand();
   }
@@ -2231,12 +2162,12 @@
 }
 
 
-void MessageQueue::Expand() {
-  MessageQueue new_queue(size_ * 2);
+void CommandMessageQueue::Expand() {
+  CommandMessageQueue new_queue(size_ * 2);
   while (!IsEmpty()) {
     new_queue.Put(Get());
   }
-  Message* array_to_free = messages_;
+  CommandMessage* array_to_free = messages_;
   *this = new_queue;
   new_queue.messages_ = array_to_free;
   // Make the new_queue empty so that it doesn't call Dispose on any messages.
@@ -2245,38 +2176,39 @@
 }
 
 
-LockingMessageQueue::LockingMessageQueue(int size) : queue_(size) {
+LockingCommandMessageQueue::LockingCommandMessageQueue(int size)
+    : queue_(size) {
   lock_ = OS::CreateMutex();
 }
 
 
-LockingMessageQueue::~LockingMessageQueue() {
+LockingCommandMessageQueue::~LockingCommandMessageQueue() {
   delete lock_;
 }
 
 
-bool LockingMessageQueue::IsEmpty() const {
+bool LockingCommandMessageQueue::IsEmpty() const {
   ScopedLock sl(lock_);
   return queue_.IsEmpty();
 }
 
 
-Message LockingMessageQueue::Get() {
+CommandMessage LockingCommandMessageQueue::Get() {
   ScopedLock sl(lock_);
-  Message result = queue_.Get();
+  CommandMessage result = queue_.Get();
   Logger::DebugEvent("Get", result.text());
   return result;
 }
 
 
-void LockingMessageQueue::Put(const Message& message) {
+void LockingCommandMessageQueue::Put(const CommandMessage& message) {
   ScopedLock sl(lock_);
   queue_.Put(message);
   Logger::DebugEvent("Put", message.text());
 }
 
 
-void LockingMessageQueue::Clear() {
+void LockingCommandMessageQueue::Clear() {
   ScopedLock sl(lock_);
   queue_.Clear();
 }
diff --git a/src/debug.h b/src/debug.h
index ffd3da9..8a50cd2 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -405,70 +405,65 @@
 // In addition to command text it may contain a pointer to some user data
 // which are expected to be passed along with the command reponse to message
 // handler.
-class Message {
+class CommandMessage {
  public:
-  static Message NewCommand(const Vector<uint16_t>& command,
+  static CommandMessage New(const Vector<uint16_t>& command,
                             v8::Debug::ClientData* data);
-  static Message NewOutput(v8::Handle<v8::String> output,
-                           v8::Debug::ClientData* data);
-  static Message NewEmptyMessage();
-  Message();
-  ~Message();
+  CommandMessage();
+  ~CommandMessage();
 
   // Deletes user data and disposes of the text.
   void Dispose();
   Vector<uint16_t> text() const { return text_; }
   v8::Debug::ClientData* client_data() const { return client_data_; }
  private:
-  Message(const Vector<uint16_t>& text,
-          v8::Debug::ClientData* data);
+  CommandMessage(const Vector<uint16_t>& text,
+                 v8::Debug::ClientData* data);
 
   Vector<uint16_t> text_;
   v8::Debug::ClientData* client_data_;
 };
 
-// A Queue of Vector<uint16_t> objects.  A thread-safe version is
-// LockingMessageQueue, based on this class.
-class MessageQueue BASE_EMBEDDED {
+// A Queue of CommandMessage objects.  A thread-safe version is
+// LockingCommandMessageQueue, based on this class.
+class CommandMessageQueue BASE_EMBEDDED {
  public:
-  explicit MessageQueue(int size);
-  ~MessageQueue();
+  explicit CommandMessageQueue(int size);
+  ~CommandMessageQueue();
   bool IsEmpty() const { return start_ == end_; }
-  Message Get();
-  void Put(const Message& message);
+  CommandMessage Get();
+  void Put(const CommandMessage& message);
   void Clear() { start_ = end_ = 0; }  // Queue is empty after Clear().
  private:
   // Doubles the size of the message queue, and copies the messages.
   void Expand();
 
-  Message* messages_;
+  CommandMessage* messages_;
   int start_;
   int end_;
   int size_;  // The size of the queue buffer.  Queue can hold size-1 messages.
 };
 
 
-// LockingMessageQueue is a thread-safe circular buffer of Vector<uint16_t>
-// messages.  The message data is not managed by LockingMessageQueue.
+// LockingCommandMessageQueue is a thread-safe circular buffer of CommandMessage
+// messages.  The message data is not managed by LockingCommandMessageQueue.
 // Pointers to the data are passed in and out. Implemented by adding a
-// Mutex to MessageQueue.  Includes logging of all puts and gets.
-class LockingMessageQueue BASE_EMBEDDED {
+// Mutex to CommandMessageQueue.  Includes logging of all puts and gets.
+class LockingCommandMessageQueue BASE_EMBEDDED {
  public:
-  explicit LockingMessageQueue(int size);
-  ~LockingMessageQueue();
+  explicit LockingCommandMessageQueue(int size);
+  ~LockingCommandMessageQueue();
   bool IsEmpty() const;
-  Message Get();
-  void Put(const Message& message);
+  CommandMessage Get();
+  void Put(const CommandMessage& message);
   void Clear();
  private:
-  MessageQueue queue_;
+  CommandMessageQueue queue_;
   Mutex* lock_;
-  DISALLOW_COPY_AND_ASSIGN(LockingMessageQueue);
+  DISALLOW_COPY_AND_ASSIGN(LockingCommandMessageQueue);
 };
 
 
-class DebugMessageThread;
-
 class Debugger {
  public:
   static void DebugRequest(const uint16_t* json_request, int length);
@@ -503,21 +498,16 @@
                                    Handle<Object> event_data,
                                    bool auto_continue);
   static void SetEventListener(Handle<Object> callback, Handle<Object> data);
-  static void SetMessageHandler(v8::Debug::MessageHandler handler,
-                                bool message_handler_thread);
-  static void TearDown();
+  static void SetMessageHandler(v8::Debug::MessageHandler handler);
   static void SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler,
                                      int period);
 
   // Invoke the message handler function.
-  static void InvokeMessageHandler(Message message);
-
-  // Send a message to the message handler eiher through the message thread or
-  // directly.
-  static void SendMessage(Message message);
+  static void InvokeMessageHandler(v8::Handle<v8::String> output,
+                                   v8::Debug::ClientData* data);
 
   // Send the JSON message for a debug event.
-  static bool SendEventMessage(Handle<Object> event_data);
+  static bool InvokeMessageHandlerWithEvent(Handle<Object> event_data);
 
   // Add a debugger command to the command queue.
   static void ProcessCommand(Vector<const uint16_t> command,
@@ -568,7 +558,6 @@
   static bool compiling_natives_;  // Are we compiling natives?
   static bool is_loading_debugger_;  // Are we loading the debugger?
   static bool never_unload_debugger_;  // Can we unload the debugger?
-  static DebugMessageThread* message_thread_;
   static v8::Debug::MessageHandler message_handler_;
   static bool message_handler_cleared_;  // Was message handler cleared?
   static v8::Debug::HostDispatchHandler host_dispatch_handler_;
@@ -577,32 +566,10 @@
   static DebuggerAgent* agent_;
 
   static const int kQueueInitialSize = 4;
-  static LockingMessageQueue command_queue_;
-  static LockingMessageQueue message_queue_;
+  static LockingCommandMessageQueue command_queue_;
   static Semaphore* command_received_;  // Signaled for each command received.
-  static Semaphore* message_received_;  // Signalled for each message send.
 
   friend class EnterDebugger;
-  friend class DebugMessageThread;
-};
-
-
-// Thread to read messages from the message queue and invoke the debug message
-// handler in another thread as the V8 thread. This thread is started if the
-// registration of the debug message handler requested to be called in a thread
-// seperate from the V8 thread.
-class DebugMessageThread: public Thread {
- public:
-  DebugMessageThread() : keep_running_(true) {}
-  virtual ~DebugMessageThread() {}
-
-  // Main function of DebugMessageThread thread.
-  void Run();
-  void Stop();
-
- private:
-  bool keep_running_;
-  DISALLOW_COPY_AND_ASSIGN(DebugMessageThread);
 };
 
 
diff --git a/src/execution.cc b/src/execution.cc
index 1d4d9ef..8fa059a 100644
--- a/src/execution.cc
+++ b/src/execution.cc
@@ -33,9 +33,9 @@
 #include "codegen-inl.h"
 
 #ifdef ARM
-#include "simulator-arm.h"
+#include "arm/simulator-arm.h"
 #else  // ia32
-#include "simulator-ia32.h"
+#include "ia32/simulator-ia32.h"
 #endif
 
 #include "debug.h"
diff --git a/src/factory.cc b/src/factory.cc
index c849ab7..c6b1d17 100644
--- a/src/factory.cc
+++ b/src/factory.cc
@@ -208,14 +208,14 @@
 }
 
 
-Handle<Map> Factory::CopyMap(Handle<Map> src) {
-  CALL_HEAP_FUNCTION(src->Copy(), Map);
+Handle<Map> Factory::CopyMapDropDescriptors(Handle<Map> src) {
+  CALL_HEAP_FUNCTION(src->CopyDropDescriptors(), Map);
 }
 
 
 Handle<Map> Factory::CopyMap(Handle<Map> src,
                              int extra_inobject_properties) {
-  Handle<Map> copy = CopyMap(src);
+  Handle<Map> copy = CopyMapDropDescriptors(src);
   // Check that we do not overflow the instance size when adding the
   // extra inobject properties.
   int instance_size_delta = extra_inobject_properties * kPointerSize;
diff --git a/src/factory.h b/src/factory.h
index 54f2089..6ac2706 100644
--- a/src/factory.h
+++ b/src/factory.h
@@ -153,7 +153,7 @@
 
   static Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
 
-  static Handle<Map> CopyMap(Handle<Map> map);
+  static Handle<Map> CopyMapDropDescriptors(Handle<Map> map);
 
   // Copy the map adding more inobject properties if possible without
   // overflowing the instance size.
diff --git a/src/frames-inl.h b/src/frames-inl.h
index cb03e2f..481b83b 100644
--- a/src/frames-inl.h
+++ b/src/frames-inl.h
@@ -30,9 +30,9 @@
 
 #include "frames.h"
 #ifdef ARM
-#include "frames-arm.h"
+#include "arm/frames-arm.h"
 #else
-#include "frames-ia32.h"
+#include "ia32/frames-ia32.h"
 #endif
 
 
diff --git a/src/handles.cc b/src/handles.cc
index 99161ce..773483d 100644
--- a/src/handles.cc
+++ b/src/handles.cc
@@ -627,9 +627,9 @@
 }
 
 
-void LoadLazy(Handle<JSFunction> fun, bool* pending_exception) {
+void LoadLazy(Handle<JSObject> obj, bool* pending_exception) {
   HandleScope scope;
-  Handle<FixedArray> info(FixedArray::cast(fun->shared()->lazy_load_data()));
+  Handle<FixedArray> info(FixedArray::cast(obj->map()->constructor()));
   int index = Smi::cast(info->get(0))->value();
   ASSERT(index >= 0);
   Handle<Context> compile_context(Context::cast(info->get(1)));
@@ -674,27 +674,39 @@
 
   // Reset the lazy load data before running the script to make sure
   // not to get recursive lazy loading.
-  fun->shared()->set_lazy_load_data(Heap::undefined_value());
+  obj->map()->set_needs_loading(false);
+  obj->map()->set_constructor(info->get(3));
 
   // Run the script.
   Handle<JSFunction> script_fun(
       Factory::NewFunctionFromBoilerplate(boilerplate, function_context));
   Execution::Call(script_fun, receiver, 0, NULL, pending_exception);
 
-  // If lazy loading failed, restore the unloaded state of fun.
-  if (*pending_exception) fun->shared()->set_lazy_load_data(*info);
+  // If lazy loading failed, restore the unloaded state of obj.
+  if (*pending_exception) {
+    obj->map()->set_needs_loading(true);
+    obj->map()->set_constructor(*info);
+  }
 }
 
 
-void SetupLazy(Handle<JSFunction> fun,
+void SetupLazy(Handle<JSObject> obj,
                int index,
                Handle<Context> compile_context,
                Handle<Context> function_context) {
-  Handle<FixedArray> arr = Factory::NewFixedArray(3);
+  Handle<FixedArray> arr = Factory::NewFixedArray(4);
   arr->set(0, Smi::FromInt(index));
   arr->set(1, *compile_context);  // Compile in this context
   arr->set(2, *function_context);  // Set function context to this
-  fun->shared()->set_lazy_load_data(*arr);
+  arr->set(3, obj->map()->constructor());  // Remember the constructor
+  Handle<Map> old_map(obj->map());
+  Handle<Map> new_map = Factory::CopyMapDropTransitions(old_map);
+  obj->set_map(*new_map);
+  new_map->set_needs_loading(true);
+  // Store the lazy loading info in the constructor field.  We'll
+  // reestablish the constructor from the fixed array after loading.
+  new_map->set_constructor(*arr);
+  ASSERT(!obj->IsLoaded());
 }
 
 } }  // namespace v8::internal
diff --git a/src/handles.h b/src/handles.h
index 9cc1db4..652d6c7 100644
--- a/src/handles.h
+++ b/src/handles.h
@@ -301,11 +301,11 @@
 bool CompileLazyInLoop(Handle<JSFunction> function, ClearExceptionFlag flag);
 
 // These deal with lazily loaded properties.
-void SetupLazy(Handle<JSFunction> fun,
+void SetupLazy(Handle<JSObject> obj,
                int index,
                Handle<Context> compile_context,
                Handle<Context> function_context);
-void LoadLazy(Handle<JSFunction> fun, bool* pending_exception);
+void LoadLazy(Handle<JSObject> obj, bool* pending_exception);
 
 class NoHandleAllocation BASE_EMBEDDED {
  public:
diff --git a/src/heap.cc b/src/heap.cc
index a57884c..0775a5d 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -939,6 +939,7 @@
   map->set_code_cache(empty_fixed_array());
   map->set_unused_property_fields(0);
   map->set_bit_field(0);
+  map->set_bit_field2(0);
   return map;
 }
 
@@ -1409,7 +1410,6 @@
   share->set_formal_parameter_count(0);
   share->set_instance_class_name(Object_symbol());
   share->set_function_data(undefined_value());
-  share->set_lazy_load_data(undefined_value());
   share->set_script(undefined_value());
   share->set_start_position_and_type(0);
   share->set_debug_info(undefined_value());
diff --git a/src/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h
similarity index 100%
rename from src/assembler-ia32-inl.h
rename to src/ia32/assembler-ia32-inl.h
diff --git a/src/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
similarity index 100%
rename from src/assembler-ia32.cc
rename to src/ia32/assembler-ia32.cc
diff --git a/src/assembler-ia32.h b/src/ia32/assembler-ia32.h
similarity index 100%
rename from src/assembler-ia32.h
rename to src/ia32/assembler-ia32.h
diff --git a/src/builtins-ia32.cc b/src/ia32/builtins-ia32.cc
similarity index 100%
rename from src/builtins-ia32.cc
rename to src/ia32/builtins-ia32.cc
diff --git a/src/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
similarity index 99%
rename from src/codegen-ia32.cc
rename to src/ia32/codegen-ia32.cc
index fb2f8bf..2d6fe83 100644
--- a/src/codegen-ia32.cc
+++ b/src/ia32/codegen-ia32.cc
@@ -5273,12 +5273,14 @@
   // instruction.
   ASSERT(value.is_register() && value.reg().is(eax));
   // The delta from the start of the map-compare instruction to the
-  // test eax instruction.  We use masm_ directly here instead of the
+  // test instruction.  We use masm_ directly here instead of the
   // double underscore macro because the macro sometimes uses macro
   // expansion to turn into something that can't return a value.  This
   // is encountered when doing generated code coverage tests.
   int delta_to_patch_site = masm_->SizeOfCodeGeneratedSince(patch_site());
-  __ test(value.reg(), Immediate(-delta_to_patch_site));
+  // Here we use masm_-> instead of the double underscore macro because this
+  // is the instruction that gets patched and coverage code gets in the way.
+  masm_->test(value.reg(), Immediate(-delta_to_patch_site));
   __ IncrementCounter(&Counters::keyed_load_inline_miss, 1);
 
   // The receiver and key were spilled by the call, so their state as
diff --git a/src/codegen-ia32.h b/src/ia32/codegen-ia32.h
similarity index 100%
rename from src/codegen-ia32.h
rename to src/ia32/codegen-ia32.h
diff --git a/src/cpu-ia32.cc b/src/ia32/cpu-ia32.cc
similarity index 100%
rename from src/cpu-ia32.cc
rename to src/ia32/cpu-ia32.cc
diff --git a/src/debug-ia32.cc b/src/ia32/debug-ia32.cc
similarity index 100%
rename from src/debug-ia32.cc
rename to src/ia32/debug-ia32.cc
diff --git a/src/disasm-ia32.cc b/src/ia32/disasm-ia32.cc
similarity index 100%
rename from src/disasm-ia32.cc
rename to src/ia32/disasm-ia32.cc
diff --git a/src/frames-ia32.cc b/src/ia32/frames-ia32.cc
similarity index 100%
rename from src/frames-ia32.cc
rename to src/ia32/frames-ia32.cc
diff --git a/src/frames-ia32.h b/src/ia32/frames-ia32.h
similarity index 100%
rename from src/frames-ia32.h
rename to src/ia32/frames-ia32.h
diff --git a/src/ic-ia32.cc b/src/ia32/ic-ia32.cc
similarity index 96%
rename from src/ic-ia32.cc
rename to src/ia32/ic-ia32.cc
index 664303f..559ac24 100644
--- a/src/ic-ia32.cc
+++ b/src/ia32/ic-ia32.cc
@@ -123,23 +123,19 @@
 }
 
 
-// Helper function used to check that a value is either not a function
-// or is loaded if it is a function.
-static void GenerateCheckNonFunctionOrLoaded(MacroAssembler* masm, Label* miss,
-                                             Register value, Register scratch) {
+// Helper function used to check that a value is either not an object
+// or is loaded if it is an object.
+static void GenerateCheckNonObjectOrLoaded(MacroAssembler* masm, Label* miss,
+                                           Register value, Register scratch) {
   Label done;
   // Check if the value is a Smi.
   __ test(value, Immediate(kSmiTagMask));
   __ j(zero, &done, not_taken);
-  // Check if the value is a function.
-  __ CmpObjectType(value, JS_FUNCTION_TYPE, scratch);
-  __ j(not_equal, &done, taken);
-  // Check if the function has been loaded.
-  __ mov(scratch, FieldOperand(value, JSFunction::kSharedFunctionInfoOffset));
-  __ mov(scratch,
-         FieldOperand(scratch, SharedFunctionInfo::kLazyLoadDataOffset));
-  __ cmp(scratch, Factory::undefined_value());
-  __ j(not_equal, miss, not_taken);
+  // Check if the object has been loaded.
+  __ mov(scratch, FieldOperand(value, JSFunction::kMapOffset));
+  __ mov(scratch, FieldOperand(scratch, Map::kBitField2Offset));
+  __ test(scratch, Immediate(1 << Map::kNeedsLoading));
+  __ j(not_zero, miss, not_taken);
   __ bind(&done);
 }
 
@@ -268,7 +264,7 @@
   __ j(not_zero, &slow, not_taken);
   // Probe the dictionary leaving result in ecx.
   GenerateDictionaryLoad(masm, &slow, ebx, ecx, edx, eax);
-  GenerateCheckNonFunctionOrLoaded(masm, &slow, ecx, edx);
+  GenerateCheckNonObjectOrLoaded(masm, &slow, ecx, edx);
   __ mov(eax, Operand(ecx));
   __ IncrementCounter(&Counters::keyed_load_generic_symbol, 1);
   __ ret(0);
@@ -493,10 +489,10 @@
   __ j(not_equal, miss, not_taken);
 
   // Check that the function has been loaded.
-  __ mov(edx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
-  __ mov(edx, FieldOperand(edx, SharedFunctionInfo::kLazyLoadDataOffset));
-  __ cmp(edx, Factory::undefined_value());
-  __ j(not_equal, miss, not_taken);
+  __ mov(edx, FieldOperand(edi, JSFunction::kMapOffset));
+  __ mov(edx, FieldOperand(edx, Map::kBitField2Offset));
+  __ test(edx, Immediate(1 << Map::kNeedsLoading));
+  __ j(not_zero, miss, not_taken);
 
   // Patch the receiver with the global proxy if necessary.
   if (is_global_object) {
@@ -683,7 +679,7 @@
   // Search the dictionary placing the result in eax.
   __ bind(&probe);
   GenerateDictionaryLoad(masm, &miss, edx, eax, ebx, ecx);
-  GenerateCheckNonFunctionOrLoaded(masm, &miss, eax, edx);
+  GenerateCheckNonObjectOrLoaded(masm, &miss, eax, edx);
   __ ret(0);
 
   // Global object access: Check access rights.
diff --git a/src/jump-target-ia32.cc b/src/ia32/jump-target-ia32.cc
similarity index 100%
rename from src/jump-target-ia32.cc
rename to src/ia32/jump-target-ia32.cc
diff --git a/src/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
similarity index 100%
rename from src/macro-assembler-ia32.cc
rename to src/ia32/macro-assembler-ia32.cc
diff --git a/src/macro-assembler-ia32.h b/src/ia32/macro-assembler-ia32.h
similarity index 100%
rename from src/macro-assembler-ia32.h
rename to src/ia32/macro-assembler-ia32.h
diff --git a/src/regexp-macro-assembler-ia32.cc b/src/ia32/regexp-macro-assembler-ia32.cc
similarity index 99%
rename from src/regexp-macro-assembler-ia32.cc
rename to src/ia32/regexp-macro-assembler-ia32.cc
index 8c92091..83dac54 100644
--- a/src/regexp-macro-assembler-ia32.cc
+++ b/src/ia32/regexp-macro-assembler-ia32.cc
@@ -32,8 +32,8 @@
 #include "regexp-stack.h"
 #include "macro-assembler.h"
 #include "regexp-macro-assembler.h"
-#include "macro-assembler-ia32.h"
-#include "regexp-macro-assembler-ia32.h"
+#include "ia32/macro-assembler-ia32.h"
+#include "ia32/regexp-macro-assembler-ia32.h"
 
 namespace v8 { namespace internal {
 
diff --git a/src/regexp-macro-assembler-ia32.h b/src/ia32/regexp-macro-assembler-ia32.h
similarity index 100%
rename from src/regexp-macro-assembler-ia32.h
rename to src/ia32/regexp-macro-assembler-ia32.h
diff --git a/src/register-allocator-ia32.cc b/src/ia32/register-allocator-ia32.cc
similarity index 100%
rename from src/register-allocator-ia32.cc
rename to src/ia32/register-allocator-ia32.cc
diff --git a/src/simulator-ia32.cc b/src/ia32/simulator-ia32.cc
similarity index 100%
rename from src/simulator-ia32.cc
rename to src/ia32/simulator-ia32.cc
diff --git a/src/simulator-ia32.h b/src/ia32/simulator-ia32.h
similarity index 100%
rename from src/simulator-ia32.h
rename to src/ia32/simulator-ia32.h
diff --git a/src/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc
similarity index 100%
rename from src/stub-cache-ia32.cc
rename to src/ia32/stub-cache-ia32.cc
diff --git a/src/virtual-frame-ia32.cc b/src/ia32/virtual-frame-ia32.cc
similarity index 97%
rename from src/virtual-frame-ia32.cc
rename to src/ia32/virtual-frame-ia32.cc
index 3647ca5..656ef21 100644
--- a/src/virtual-frame-ia32.cc
+++ b/src/ia32/virtual-frame-ia32.cc
@@ -158,6 +158,28 @@
 }
 
 
+// Clear the dirty bits for the range of elements in
+// [min(stack_pointer_ + 1,begin), end].
+void VirtualFrame::SyncRange(int begin, int end) {
+  ASSERT(begin >= 0);
+  ASSERT(end < elements_.length());
+  // Sync elements below the range if they have not been materialized
+  // on the stack.
+  int start = Min(begin, stack_pointer_ + 1);
+
+  // If positive we have to adjust the stack pointer.
+  int delta = end - stack_pointer_;
+  if (delta > 0) {
+    stack_pointer_ = end;
+    __ sub(Operand(esp), Immediate(delta * kPointerSize));
+  }
+
+  for (int i = start; i <= end; i++) {
+    if (!elements_[i].is_synced()) SyncElementBelowStackPointer(i);
+  }
+}
+
+
 void VirtualFrame::MergeTo(VirtualFrame* expected) {
   Comment cmnt(masm_, "[ Merge frame");
   // We should always be merging the code generator's current frame to an
@@ -467,7 +489,7 @@
     // we sync them with the actual frame to allocate space for spilling
     // them later.  First sync everything above the stack pointer so we can
     // use pushes to allocate and initialize the locals.
-    SyncRange(stack_pointer_ + 1, elements_.length());
+    SyncRange(stack_pointer_ + 1, elements_.length() - 1);
     Handle<Object> undefined = Factory::undefined_value();
     FrameElement initial_value =
         FrameElement::ConstantElement(undefined, FrameElement::SYNCED);
diff --git a/src/virtual-frame-ia32.h b/src/ia32/virtual-frame-ia32.h
similarity index 100%
rename from src/virtual-frame-ia32.h
rename to src/ia32/virtual-frame-ia32.h
diff --git a/src/json-delay.js b/src/json-delay.js
new file mode 100644
index 0000000..90150c6
--- /dev/null
+++ b/src/json-delay.js
@@ -0,0 +1,254 @@
+// Copyright 2009 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:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var $JSON = global.JSON;
+
+function ParseJSONUnfiltered(text) {
+  var s = $String(text);
+  var f = %CompileString("(" + text + ")", -1, true);
+  return f();
+}
+
+function Revive(holder, name, reviver) {
+  var val = holder[name];
+  if (IS_OBJECT(val)) {
+    if (IS_ARRAY(val)) {
+      var length = val.length;
+      for (var i = 0; i < length; i++) {
+        var newElement = Revive(val, $String(i), reviver);
+        val[i] = newElement;
+      }
+    } else {
+      for (var p in val) {
+        if (ObjectHasOwnProperty.call(val, p)) {
+          var newElement = Revive(val, p, reviver);
+          if (IS_UNDEFINED(newElement)) {
+            delete val[p];
+          } else {
+            val[p] = newElement;
+          }
+        }
+      }
+    }
+  }
+  return reviver.call(holder, name, val);
+}
+
+function JSONParse(text, reviver) {
+  var unfiltered = ParseJSONUnfiltered(text);
+  if (IS_FUNCTION(reviver)) {
+    return Revive({'': unfiltered}, '', reviver);
+  } else {
+    return unfiltered;
+  }
+}
+
+var characterQuoteCache = {
+  '\"': '\\"',
+  '\\': '\\\\',
+  '/': '\\/',
+  '\b': '\\b',
+  '\f': '\\f',
+  '\n': '\\n',
+  '\r': '\\r',
+  '\t': '\\t',
+  '\x0B': '\\u000b'
+};
+
+function QuoteSingleJSONCharacter(c) {
+  if (c in characterQuoteCache)
+    return characterQuoteCache[c];
+  var charCode = c.charCodeAt(0);
+  var result;
+  if (charCode < 16) result = '\\u000';
+  else if (charCode < 256) result = '\\u00';
+  else if (charCode < 4096) result = '\\u0';
+  else result = '\\u';
+  result += charCode.toString(16);
+  characterQuoteCache[c] = result;
+  return result;
+}
+
+function QuoteJSONString(str) {
+  var quotable = /[\\\"\x00-\x1f\x80-\uffff]/g;
+  return '"' + str.replace(quotable, QuoteSingleJSONCharacter) + '"';
+}
+
+function StackContains(stack, val) {
+  var length = stack.length;
+  for (var i = 0; i < length; i++) {
+    if (stack[i] === val)
+      return true;
+  }
+  return false;
+}
+
+function SerializeArray(value, replacer, stack, indent, gap) {
+  if (StackContains(stack, value))
+    throw MakeTypeError('circular_structure', []);
+  stack.push(value);
+  var stepback = indent;
+  indent += gap;
+  var partial = [];
+  var len = value.length;
+  for (var i = 0; i < len; i++) {
+    var strP = JSONSerialize($String(i), value, replacer, stack,
+        indent, gap);
+    if (IS_UNDEFINED(strP))
+      strP = "null";
+    partial.push(strP);
+  }
+  var final;
+  if (gap == "") {
+    final = "[" + partial.join(",") + "]";
+  } else if (partial.length > 0) {
+    var separator = ",\n" + indent;
+    final = "[\n" + indent + partial.join(separator) + "\n" +
+        stepback + "]";
+  } else {
+    final = "[]";
+  }
+  stack.pop();
+  return final;
+}
+
+function SerializeObject(value, replacer, stack, indent, gap) {
+  if (StackContains(stack, value))
+    throw MakeTypeError('circular_structure', []);
+  stack.push(value);
+  var stepback = indent;
+  indent += gap;
+  var partial = [];
+  if (IS_ARRAY(replacer)) {
+    var length = replacer.length;
+    for (var i = 0; i < length; i++) {
+      if (ObjectHasOwnProperty.call(replacer, i)) {
+        var p = replacer[i];
+        var strP = JSONSerialize(p, value, replacer, stack, indent, gap);
+        if (!IS_UNDEFINED(strP)) {
+          var member = QuoteJSONString(p) + ":";
+          if (gap != "") member += " ";
+          member += strP;
+          partial.push(member);
+        }
+      }
+    }
+  } else {
+    for (var p in value) {
+      if (ObjectHasOwnProperty.call(value, p)) {
+        var strP = JSONSerialize(p, value, replacer, stack, indent, gap);
+        if (!IS_UNDEFINED(strP)) {
+          var member = QuoteJSONString(p) + ":";
+          if (gap != "") member += " ";
+          member += strP;
+          partial.push(member);
+        }
+      }
+    }
+  }
+  var final;
+  if (gap == "") {
+    final = "{" + partial.join(",") + "}";
+  } else if (partial.length > 0) {
+    var separator = ",\n" + indent;
+    final = "{\n" + indent + partial.join(separator) + "\n" +
+        stepback + "}";
+  } else {
+    final = "{}";
+  }
+  stack.pop();
+  return final;
+}
+
+function JSONSerialize(key, holder, replacer, stack, indent, gap) {
+  var value = holder[key];
+  if (IS_OBJECT(value) && value) {
+    var toJSON = value.toJSON;
+    if (IS_FUNCTION(toJSON))
+      value = toJSON.call(value, key);
+  }
+  if (IS_FUNCTION(replacer))
+    value = replacer.call(holder, key, value);
+  // Unwrap value if necessary
+  if (IS_OBJECT(value)) {
+    if (IS_NUMBER_WRAPPER(value)) {
+      value = $Number(value);
+    } else if (IS_STRING_WRAPPER(value)) {
+      value = $String(value);
+    }
+  }
+  switch (typeof value) {
+    case "string":
+      return QuoteJSONString(value);
+    case "object":
+      if (!value) {
+        return "null";
+      } else if (IS_ARRAY(value)) {
+        return SerializeArray(value, replacer, stack, indent, gap);
+      } else {
+        return SerializeObject(value, replacer, stack, indent, gap);
+      }
+    case "number":
+      return $isFinite(value) ? $String(value) : "null";
+    case "boolean":
+      return value ? "true" : "false";
+  }
+}
+
+function JSONStringify(value, replacer, space) {
+  var stack = [];
+  var indent = "";
+  if (IS_OBJECT(space)) {
+    // Unwrap 'space' if it is wrapped
+    if (IS_NUMBER_WRAPPER(space)) {
+      space = $Number(space);
+    } else if (IS_STRING_WRAPPER(space)) {
+      space = $String(space);
+    }
+  }
+  var gap;
+  if (IS_NUMBER(space)) {
+    space = $Math.min(space, 100);
+    gap = "";
+    for (var i = 0; i < space; i++)
+      gap += " ";
+  } else if (IS_STRING(space)) {
+    gap = space;
+  } else {
+    gap = "";
+  }
+  return JSONSerialize('', {'': value}, replacer, stack, indent, gap);
+}
+
+function SetupJSON() {
+  InstallFunctions($JSON, DONT_ENUM, $Array(
+    "parse", JSONParse,
+    "stringify", JSONStringify
+  ));
+}
+
+SetupJSON();
diff --git a/src/jsregexp.cc b/src/jsregexp.cc
index 40241e6..89d11eb 100644
--- a/src/jsregexp.cc
+++ b/src/jsregexp.cc
@@ -43,10 +43,10 @@
 #include "regexp-stack.h"
 
 #ifdef ARM
-#include "regexp-macro-assembler-arm.h"
+#include "arm/regexp-macro-assembler-arm.h"
 #else  // IA32
-#include "macro-assembler-ia32.h"
-#include "regexp-macro-assembler-ia32.h"
+#include "ia32/macro-assembler-ia32.h"
+#include "ia32/regexp-macro-assembler-ia32.h"
 #endif
 
 #include "interpreter-irregexp.h"
diff --git a/src/macro-assembler.h b/src/macro-assembler.h
index 84a1eef..d21f479 100644
--- a/src/macro-assembler.h
+++ b/src/macro-assembler.h
@@ -30,20 +30,20 @@
 
 #ifdef ARM
 
-#include "constants-arm.h"
+#include "arm/constants-arm.h"
 #include "assembler.h"
-#include "assembler-arm.h"
-#include "assembler-arm-inl.h"
+#include "arm/assembler-arm.h"
+#include "arm/assembler-arm-inl.h"
 #include "code.h"  // must be after assembler_*.h
-#include "macro-assembler-arm.h"
+#include "arm/macro-assembler-arm.h"
 
 #else  // ia32
 
 #include "assembler.h"
-#include "assembler-ia32.h"
-#include "assembler-ia32-inl.h"
+#include "ia32/assembler-ia32.h"
+#include "ia32/assembler-ia32-inl.h"
 #include "code.h"  // must be after assembler_*.h
-#include "macro-assembler-ia32.h"
+#include "ia32/macro-assembler-ia32.h"
 
 #endif
 
diff --git a/src/macros.py b/src/macros.py
index d78ecd9..ebfd816 100644
--- a/src/macros.py
+++ b/src/macros.py
@@ -84,6 +84,8 @@
 macro IS_REGEXP(arg)            = %HasRegExpClass(arg);
 macro IS_ARRAY(arg)             = %HasArrayClass(arg);
 macro IS_DATE(arg)              = %HasDateClass(arg);
+macro IS_NUMBER_WRAPPER(arg)    = %HasNumberClass(arg);
+macro IS_STRING_WRAPPER(arg)    = %HasStringClass(arg);
 macro IS_ERROR(arg)             = (%ClassOf(arg) === 'Error');
 macro IS_SCRIPT(arg)            = (%ClassOf(arg) === 'Script');
 macro FLOOR(arg)                = %Math_floor(arg);
diff --git a/src/messages.js b/src/messages.js
index fa6fb1f..df8a2d1 100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -114,6 +114,9 @@
   illegal_return:               "Illegal return statement",
   error_loading_debugger:       "Error loading debugger %0",
   no_input_to_regexp:           "No input to %0",
+  result_not_primitive:         "Result of %0 must be a primitive, was %1",
+  invalid_json:                 "String '%0' is not valid JSON",
+  circular_structure:           "Converting circular structure to JSON"
 };
 
 
diff --git a/src/objects-debug.cc b/src/objects-debug.cc
index 635ef0f..e172014 100644
--- a/src/objects-debug.cc
+++ b/src/objects-debug.cc
@@ -558,8 +558,6 @@
   code()->ShortPrint();
   PrintF("\n - source code = ");
   GetSourceCode()->ShortPrint();
-  PrintF("\n - lazy load: %s",
-         lazy_load_data() == Heap::undefined_value() ? "no" : "yes");
   // Script files are often large, hard to read.
   // PrintF("\n - script =");
   // script()->Print();
@@ -579,7 +577,6 @@
   VerifyObjectField(kCodeOffset);
   VerifyObjectField(kInstanceClassNameOffset);
   VerifyObjectField(kExternalReferenceDataOffset);
-  VerifyObjectField(kLazyLoadDataOffset);
   VerifyObjectField(kScriptOffset);
   VerifyObjectField(kDebugInfoOffset);
 }
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 73b9c84..ff64d65 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1811,6 +1811,16 @@
 }
 
 
+byte Map::bit_field2() {
+  return READ_BYTE_FIELD(this, kBitField2Offset);
+}
+
+
+void Map::set_bit_field2(byte value) {
+  WRITE_BYTE_FIELD(this, kBitField2Offset, value);
+}
+
+
 void Map::set_non_instance_prototype(bool value) {
   if (value) {
     set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
@@ -2075,7 +2085,6 @@
           kInstanceClassNameOffset)
 ACCESSORS(SharedFunctionInfo, function_data, Object,
           kExternalReferenceDataOffset)
-ACCESSORS(SharedFunctionInfo, lazy_load_data, Object, kLazyLoadDataOffset)
 ACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
 ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
 ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
@@ -2141,8 +2150,8 @@
 }
 
 
-bool JSFunction::IsLoaded() {
-  return shared()->lazy_load_data() == Heap::undefined_value();
+bool JSObject::IsLoaded() {
+  return !map()->needs_loading();
 }
 
 
diff --git a/src/objects.cc b/src/objects.cc
index 31c5bab..55fc971 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -358,7 +358,7 @@
   Handle<Object> receiver_handle(receiver);
   Handle<String> name_handle(name);
   bool pending_exception;
-  LoadLazy(Handle<JSFunction>(JSFunction::cast(result->GetValue())),
+  LoadLazy(Handle<JSObject>(JSObject::cast(result->GetLazyValue())),
            &pending_exception);
   if (pending_exception) return Failure::Exception();
   return this_handle->GetPropertyWithReceiver(*receiver_handle,
@@ -377,7 +377,7 @@
   Handle<String> name_handle(name);
   Handle<Object> value_handle(value);
   bool pending_exception;
-  LoadLazy(Handle<JSFunction>(JSFunction::cast(result->GetValue())),
+  LoadLazy(Handle<JSObject>(JSObject::cast(result->GetLazyValue())),
            &pending_exception);
   if (pending_exception) return Failure::Exception();
   return this_handle->SetProperty(*name_handle, *value_handle, attributes);
@@ -389,7 +389,7 @@
   Handle<JSObject> this_handle(this);
   Handle<String> name_handle(name);
   bool pending_exception;
-  LoadLazy(Handle<JSFunction>(JSFunction::cast(result->GetValue())),
+  LoadLazy(Handle<JSObject>(JSObject::cast(result->GetLazyValue())),
            &pending_exception);
   if (pending_exception) return Failure::Exception();
   return this_handle->DeleteProperty(*name_handle);
@@ -1158,7 +1158,7 @@
          (index - map()->inobject_properties()) < properties()->length() ||
          map()->unused_property_fields() == 0);
   // Allocate a new map for the object.
-  Object* r = map()->Copy();
+  Object* r = map()->CopyDropDescriptors();
   if (r->IsFailure()) return r;
   Map* new_map = Map::cast(r);
   if (allow_map_transition) {
@@ -1203,7 +1203,7 @@
   if (new_descriptors->IsFailure()) return new_descriptors;
 
   // Allocate a new map for the object.
-  Object* new_map = map()->Copy();
+  Object* new_map = map()->CopyDropDescriptors();
   if (new_map->IsFailure()) return new_map;
 
   DescriptorArray* descriptors = DescriptorArray::cast(new_descriptors);
@@ -1361,7 +1361,7 @@
       DescriptorArray::cast(descriptors_unchecked);
 
   // Make a new map for the object.
-  Object* new_map_unchecked = map()->Copy();
+  Object* new_map_unchecked = map()->CopyDropDescriptors();
   if (new_map_unchecked->IsFailure()) return new_map_unchecked;
   Map* new_map = Map::cast(new_map_unchecked);
   new_map->set_instance_descriptors(new_descriptors);
@@ -2032,7 +2032,7 @@
   dictionary->SetNextEnumerationIndex(index);
 
   // Allocate new map.
-  obj = map()->Copy();
+  obj = map()->CopyDropDescriptors();
   if (obj->IsFailure()) return obj;
   Map* new_map = Map::cast(obj);
 
@@ -2704,24 +2704,29 @@
 }
 
 
-Object* Map::Copy() {
+Object* Map::CopyDropDescriptors() {
   Object* result = Heap::AllocateMap(instance_type(), instance_size());
   if (result->IsFailure()) return result;
   Map::cast(result)->set_prototype(prototype());
   Map::cast(result)->set_constructor(constructor());
   // Don't copy descriptors, so map transitions always remain a forest.
+  // If we retained the same descriptors we would have two maps
+  // pointing to the same transition which is bad because the garbage
+  // collector relies on being able to reverse pointers from transitions
+  // to maps.  If properties need to be retained use CopyDropTransitions.
   Map::cast(result)->set_instance_descriptors(Heap::empty_descriptor_array());
   // Please note instance_type and instance_size are set when allocated.
   Map::cast(result)->set_inobject_properties(inobject_properties());
   Map::cast(result)->set_unused_property_fields(unused_property_fields());
   Map::cast(result)->set_bit_field(bit_field());
+  Map::cast(result)->set_bit_field2(bit_field2());
   Map::cast(result)->ClearCodeCache();
   return result;
 }
 
 
 Object* Map::CopyDropTransitions() {
-  Object* new_map = Copy();
+  Object* new_map = CopyDropDescriptors();
   if (new_map->IsFailure()) return new_map;
   Object* descriptors = instance_descriptors()->RemoveTransitions();
   if (descriptors->IsFailure()) return descriptors;
@@ -7153,7 +7158,7 @@
 
   descriptors->Sort();
   // Allocate new map.
-  Object* new_map = obj->map()->Copy();
+  Object* new_map = obj->map()->CopyDropDescriptors();
   if (new_map->IsFailure()) return new_map;
 
   // Transform the object.
diff --git a/src/objects.h b/src/objects.h
index db3c449..8e76591 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1242,6 +1242,9 @@
                           String* name,
                           PropertyAttributes* attributes);
 
+  // Tells whether this object needs to be loaded.
+  inline bool IsLoaded();
+
   bool HasProperty(String* name) {
     return GetPropertyAttribute(name) != ABSENT;
   }
@@ -2397,6 +2400,10 @@
   inline byte bit_field();
   inline void set_bit_field(byte value);
 
+  // Bit field 2.
+  inline byte bit_field2();
+  inline void set_bit_field2(byte value);
+
   // Tells whether the object in the prototype property will be used
   // for instances created from this function.  If the prototype
   // property is set to a value that is not a JSObject, the prototype
@@ -2447,6 +2454,20 @@
     return ((1 << kIsUndetectable) & bit_field()) != 0;
   }
 
+  inline void set_needs_loading(bool value) {
+    if (value) {
+      set_bit_field2(bit_field2() | (1 << kNeedsLoading));
+    } else {
+      set_bit_field2(bit_field2() & ~(1 << kNeedsLoading));
+    }
+  }
+
+  // Does this object or function require a lazily loaded script to be
+  // run before being used?
+  inline bool needs_loading() {
+    return ((1 << kNeedsLoading) & bit_field2()) != 0;
+  }
+
   // Tells whether the instance has a call-as-function handler.
   inline void set_has_instance_call_handler() {
     set_bit_field(bit_field() | (1 << kHasInstanceCallHandler));
@@ -2474,7 +2495,7 @@
   DECL_ACCESSORS(code_cache, FixedArray)
 
   // Returns a copy of the map.
-  Object* Copy();
+  Object* CopyDropDescriptors();
 
   // Returns a copy of the map, with all transitions dropped from the
   // instance descriptors.
@@ -2550,7 +2571,7 @@
   static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0;
   static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 1;
   static const int kBitFieldOffset = kInstanceAttributesOffset + 2;
-  // The  byte at position 3 is not in use at the moment.
+  static const int kBitField2Offset = kInstanceAttributesOffset + 3;
 
   // Bit positions for bit field.
   static const int kUnused = 0;  // To be used for marking recently used maps.
@@ -2561,6 +2582,10 @@
   static const int kIsUndetectable = 5;
   static const int kHasInstanceCallHandler = 6;
   static const int kIsAccessCheckNeeded = 7;
+
+  // Bit positions for but field 2
+  static const int kNeedsLoading = 0;
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(Map);
 };
@@ -2677,10 +2702,6 @@
   // on objects.
   DECL_ACCESSORS(function_data, Object)
 
-  // [lazy load data]: If the function has lazy loading, this field
-  // contains contexts and other data needed to load it.
-  DECL_ACCESSORS(lazy_load_data, Object)
-
   // [script info]: Script from which the function originates.
   DECL_ACCESSORS(script, Object)
 
@@ -2754,9 +2775,7 @@
       kExpectedNofPropertiesOffset + kIntSize;
   static const int kExternalReferenceDataOffset =
       kInstanceClassNameOffset + kPointerSize;
-  static const int kLazyLoadDataOffset =
-      kExternalReferenceDataOffset + kPointerSize;
-  static const int kScriptOffset = kLazyLoadDataOffset + kPointerSize;
+  static const int kScriptOffset = kExternalReferenceDataOffset + kPointerSize;
   static const int kStartPositionAndTypeOffset = kScriptOffset + kPointerSize;
   static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize;
   static const int kFunctionTokenPositionOffset = kEndPositionOffset + kIntSize;
@@ -2809,9 +2828,6 @@
   // function.
   inline bool IsBoilerplate();
 
-  // Tells whether this function needs to be loaded.
-  inline bool IsLoaded();
-
   // [literals]: Fixed array holding the materialized literals.
   //
   // If the function contains object, regexp or array literals, the
diff --git a/src/property.h b/src/property.h
index 65d4a0d..60a9b54 100644
--- a/src/property.h
+++ b/src/property.h
@@ -245,14 +245,25 @@
   // Tells whether the value needs to be loaded.
   bool IsLoaded() {
     if (lookup_type_ == DESCRIPTOR_TYPE || lookup_type_ == DICTIONARY_TYPE) {
-      Object* value = GetValue();
-      if (value->IsJSFunction()) {
-        return JSFunction::cast(value)->IsLoaded();
-      }
+      Object* target = GetLazyValue();
+      return !target->IsJSObject() || JSObject::cast(target)->IsLoaded();
     }
     return true;
   }
 
+  Object* GetLazyValue() {
+    switch (type()) {
+      case FIELD:
+        return holder()->FastPropertyAt(GetFieldIndex());
+      case NORMAL:
+        return holder()->property_dictionary()->ValueAt(GetDictionaryEntry());
+      case CONSTANT_FUNCTION:
+        return GetConstantFunction();
+      default:
+        return Smi::FromInt(0);
+    }
+  }
+
   Map* GetTransitionMap() {
     ASSERT(lookup_type_ == DESCRIPTOR_TYPE);
     ASSERT(type() == MAP_TRANSITION);
diff --git a/src/runtime.cc b/src/runtime.cc
index 2b350a5..a1e23b4 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -4824,14 +4824,18 @@
 
 static Object* Runtime_CompileString(Arguments args) {
   HandleScope scope;
-  ASSERT(args.length() == 2);
+  ASSERT_EQ(3, args.length());
   CONVERT_ARG_CHECKED(String, source, 0);
   CONVERT_ARG_CHECKED(Smi, line_offset, 1);
+  CONVERT_ARG_CHECKED(Oddball, is_json, 2)
 
   // Compile source string in the global context.
   Handle<Context> context(Top::context()->global_context());
-  Handle<JSFunction> boilerplate =
-      Compiler::CompileEval(source, context, line_offset->value(), true);
+  Handle<JSFunction> boilerplate = Compiler::CompileEval(source,
+                                                         context,
+                                                         line_offset->value(),
+                                                         true,
+                                                         is_json->IsTrue());
   if (boilerplate.is_null()) return Failure::Exception();
   Handle<JSFunction> fun =
       Factory::NewFunctionFromBoilerplate(boilerplate, context);
@@ -4856,7 +4860,7 @@
 
   // Compile source string in the current context.
   Handle<JSFunction> boilerplate =
-      Compiler::CompileEval(source, context, 0, is_global);
+      Compiler::CompileEval(source, context, 0, is_global, false);
   if (boilerplate.is_null()) return Failure::Exception();
   Handle<JSFunction> fun =
     Factory::NewFunctionFromBoilerplate(boilerplate, context);
@@ -6479,7 +6483,8 @@
       Compiler::CompileEval(function_source,
                             context,
                             0,
-                            context->IsGlobalContext());
+                            context->IsGlobalContext(),
+                            false);
   if (boilerplate.is_null()) return Failure::Exception();
   Handle<JSFunction> compiled_function =
       Factory::NewFunctionFromBoilerplate(boilerplate, context);
@@ -6537,7 +6542,11 @@
 
   // Compile the source to be evaluated.
   Handle<JSFunction> boilerplate =
-      Handle<JSFunction>(Compiler::CompileEval(source, context, 0, true));
+      Handle<JSFunction>(Compiler::CompileEval(source,
+                                               context,
+                                               0,
+                                               true,
+                                               false));
   if (boilerplate.is_null()) return Failure::Exception();
   Handle<JSFunction> compiled_function =
       Handle<JSFunction>(Factory::NewFunctionFromBoilerplate(boilerplate,
diff --git a/src/runtime.h b/src/runtime.h
index 6bd19f6..b29ce70 100644
--- a/src/runtime.h
+++ b/src/runtime.h
@@ -194,7 +194,7 @@
   F(NumberIsFinite, 1) \
   \
   /* Globals */ \
-  F(CompileString, 2) \
+  F(CompileString, 3) \
   F(GlobalPrint, 1) \
   \
   /* Eval */ \
diff --git a/src/string.js b/src/string.js
index 3ccad9a..c7a838e 100644
--- a/src/string.js
+++ b/src/string.js
@@ -812,6 +812,11 @@
 }
 
 
+function StringToJSON(key) {
+  return CheckJSONPrimitive(this.valueOf());
+}
+
+
 // -------------------------------------------------------------------
 
 function SetupString() {
@@ -858,7 +863,8 @@
     "small", StringSmall,
     "strike", StringStrike,
     "sub", StringSub,
-    "sup", StringSup
+    "sup", StringSup,
+    "toJSON", StringToJSON
   ));
 }
 
diff --git a/src/v8.cc b/src/v8.cc
index fbe3d5d..c0124e4 100644
--- a/src/v8.cc
+++ b/src/v8.cc
@@ -113,10 +113,6 @@
   Heap::TearDown();
   Logger::TearDown();
 
-#ifdef ENABLE_DEBUGGER_SUPPORT
-  Debugger::TearDown();
-#endif
-
   has_been_setup_ = false;
   has_been_disposed_ = true;
 }
diff --git a/src/v8natives.js b/src/v8natives.js
index 9772e2f..29a24b4 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -110,7 +110,7 @@
                          'be the global object from which eval originated');
   }
   
-  var f = %CompileString(x, 0);
+  var f = %CompileString(x, 0, false);
   if (!IS_FUNCTION(f)) return f;
 
   return f.call(this);
@@ -121,7 +121,7 @@
 function GlobalExecScript(expr, lang) {
   // NOTE: We don't care about the character casing.
   if (!lang || /javascript/i.test(lang)) {
-    var f = %CompileString(ToString(expr), 0);
+    var f = %CompileString(ToString(expr), 0, false);
     f.call(%GlobalReceiver(global));
   }
   return null;
@@ -312,13 +312,19 @@
 }
 
 
+function BooleanToJSON(key) {
+  return CheckJSONPrimitive(this.valueOf());
+}
+
+
 // ----------------------------------------------------------------------------
 
 
 function SetupBoolean() {
   InstallFunctions($Boolean.prototype, DONT_ENUM, $Array(
     "toString", BooleanToString,
-    "valueOf", BooleanValueOf
+    "valueOf", BooleanValueOf,
+    "toJSON", BooleanToJSON
   ));
 }
 
@@ -418,6 +424,18 @@
 }
 
 
+function CheckJSONPrimitive(val) {
+  if (!IsPrimitive(val))
+    throw MakeTypeError('result_not_primitive', ['toJSON', val]);
+  return val;
+}
+
+
+function NumberToJSON(key) {
+  return CheckJSONPrimitive(this.valueOf());
+}
+
+
 // ----------------------------------------------------------------------------
 
 function SetupNumber() {
@@ -455,7 +473,8 @@
     "valueOf", NumberValueOf,
     "toFixed", NumberToFixed,
     "toExponential", NumberToExponential,
-    "toPrecision", NumberToPrecision
+    "toPrecision", NumberToPrecision,
+    "toJSON", NumberToJSON
   ));
 }
 
@@ -521,7 +540,7 @@
 
   // The call to SetNewFunctionAttributes will ensure the prototype
   // property of the resulting function is enumerable (ECMA262, 15.3.5.2).
-  var f = %CompileString(source, -1)();
+  var f = %CompileString(source, -1, false)();
   %FunctionSetName(f, "anonymous");
   return %SetNewFunctionAttributes(f);
 }
diff --git a/src/virtual-frame.cc b/src/virtual-frame.cc
index a03e31a..cef1d80 100644
--- a/src/virtual-frame.cc
+++ b/src/virtual-frame.cc
@@ -213,40 +213,14 @@
 }
 
 
-// Clear the dirty bits for the range of elements in
-// [min(stack_pointer_ + 1,begin), end).
-void VirtualFrame::SyncRange(int begin, int end) {
-  ASSERT(begin >= 0);
-  ASSERT(end <= elements_.length());
-  if (begin > stack_pointer_) {
-    // Elements between stack_pointer_ + 1 and begin must also be synced.
-    for (int i = stack_pointer_ + 1; i < end; i++) {
-      SyncElementByPushing(i);
-    }
-  } else if (end <= stack_pointer_ + 1) {
-    for (int i = begin; i < end; i++) {
-      if (!elements_[i].is_synced()) {
-          SyncElementBelowStackPointer(i);
-      }
-    }
-  } else {
-    // Split into two ranges that each satisfy a condition above.
-    SyncRange(begin, stack_pointer_ + 1);
-    SyncRange(stack_pointer_ + 1, end);
-  }
-}
-
-
 // Clear the dirty bit for the element at a given index.
 void VirtualFrame::SyncElementAt(int index) {
   if (index <= stack_pointer_) {
-    if (!elements_[index].is_synced()) {
-      SyncElementBelowStackPointer(index);
-    }
+    if (!elements_[index].is_synced()) SyncElementBelowStackPointer(index);
+  } else if (index == stack_pointer_ + 1) {
+    SyncElementByPushing(index);
   } else {
-    for (int i = stack_pointer_ + 1; i <= index; i++) {
-      SyncElementByPushing(i);
-    }
+    SyncRange(stack_pointer_ + 1, index);
   }
 }
 
@@ -310,7 +284,7 @@
   ASSERT(height() >= spilled_args);
   ASSERT(dropped_args <= spilled_args);
 
-  SyncRange(0, elements_.length());
+  SyncRange(0, elements_.length() - 1);
   // Spill registers.
   for (int i = 0; i < kNumRegisters; i++) {
     if (is_used(i)) {
diff --git a/src/virtual-frame.h b/src/virtual-frame.h
index 99b4f76..13e68b0 100644
--- a/src/virtual-frame.h
+++ b/src/virtual-frame.h
@@ -198,9 +198,9 @@
 } }  // namespace v8::internal
 
 #ifdef ARM
-#include "virtual-frame-arm.h"
+#include "arm/virtual-frame-arm.h"
 #else  // ia32
-#include "virtual-frame-ia32.h"
+#include "ia32/virtual-frame-ia32.h"
 #endif
 
 #endif  // V8_VIRTUAL_FRAME_H_
diff --git a/test/cctest/cctest.status b/test/cctest/cctest.status
index e56452f..7b43c8d 100644
--- a/test/cctest/cctest.status
+++ b/test/cctest/cctest.status
@@ -34,9 +34,6 @@
 
 test-debug: SKIP
 
-# Bug http://code.google.com/p/v8/issues/detail?id=323
-test-api/ApplyInterruption: SKIP
-
 # BUG(113): Test seems flaky on ARM.
 test-spaces/LargeObjectSpace: PASS || FAIL
 
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index b7a5cb6..9a3aead 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -161,7 +161,7 @@
   }
   static int count() { return count_; }
   static RegisterThreadedTest* nth(int i) {
-    ASSERT(i < count());
+    CHECK(i < count());
     RegisterThreadedTest* current = first_;
     while (i > 0) {
       i--;
@@ -295,13 +295,13 @@
   env->Global()->Set(v8_str("Fun1"), fun->GetFunction());
 
   v8::Handle<Value> value1 = CompileRun("Fun1(4) == '';");
-  ASSERT(value1->IsTrue());
+  CHECK(value1->IsTrue());
 
   v8::Handle<Value> value2 = CompileRun("Fun1(new Cons()) == '[object Cons]';");
-  ASSERT(value2->IsTrue());
+  CHECK(value2->IsTrue());
 
   v8::Handle<Value> value3 = CompileRun("Fun1() == '';");
-  ASSERT(value3->IsTrue());
+  CHECK(value3->IsTrue());
 
   v8::Handle<v8::FunctionTemplate> cons1 = v8::FunctionTemplate::New();
   cons1->SetClassName(v8_str("Cons1"));
@@ -323,24 +323,24 @@
   v8::Handle<Value> value4 = CompileRun(
       "Fun2(new Cons1(), new Cons2(), new Cons3()) =="
       "'[object Cons1],[object Cons2],[object Cons3]'");
-  ASSERT(value4->IsTrue());
+  CHECK(value4->IsTrue());
 
   v8::Handle<Value> value5 = CompileRun(
       "Fun2(new Cons1(), new Cons2(), 5) == '[object Cons1],[object Cons2],'");
-  ASSERT(value5->IsTrue());
+  CHECK(value5->IsTrue());
 
   v8::Handle<Value> value6 = CompileRun(
       "Fun2(new Cons3(), new Cons2(), new Cons1()) == ',[object Cons2],'");
-  ASSERT(value6->IsTrue());
+  CHECK(value6->IsTrue());
 
   v8::Handle<Value> value7 = CompileRun(
       "Fun2(new Cons1(), new Cons2(), new Cons3(), 'd') == "
       "'[object Cons1],[object Cons2],[object Cons3],d';");
-  ASSERT(value7->IsTrue());
+  CHECK(value7->IsTrue());
 
   v8::Handle<Value> value8 = CompileRun(
       "Fun2(new Cons1(), new Cons2()) == '[object Cons1],[object Cons2]'");
-  ASSERT(value8->IsTrue());
+  CHECK(value8->IsTrue());
 }
 
 
@@ -6081,6 +6081,8 @@
         Local<String> source = String::New(c_source);
         Local<Script> script = Script::Compile(source);
         Local<Value> result = script->Run();
+        // Check that no exception was thrown.
+        CHECK(!result.IsEmpty());
       }
       int gc_after = gc_count_;
       gc_during_apply_ += gc_after - gc_before;
diff --git a/test/cctest/test-assembler-arm.cc b/test/cctest/test-assembler-arm.cc
index bd75a04..fe1621c 100644
--- a/test/cctest/test-assembler-arm.cc
+++ b/test/cctest/test-assembler-arm.cc
@@ -29,8 +29,8 @@
 
 #include "disassembler.h"
 #include "factory.h"
-#include "simulator-arm.h"
-#include "assembler-arm-inl.h"
+#include "arm/simulator-arm.h"
+#include "arm/assembler-arm-inl.h"
 #include "cctest.h"
 
 using namespace v8::internal;
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
index fea07c5..ca2d49e 100644
--- a/test/cctest/test-debug.cc
+++ b/test/cctest/test-debug.cc
@@ -45,8 +45,8 @@
 using ::v8::internal::Code;
 using ::v8::internal::Debug;
 using ::v8::internal::Debugger;
-using ::v8::internal::Message;
-using ::v8::internal::MessageQueue;
+using ::v8::internal::CommandMessage;
+using ::v8::internal::CommandMessageQueue;
 using ::v8::internal::StepAction;
 using ::v8::internal::StepIn;  // From StepAction enum
 using ::v8::internal::StepNext;  // From StepAction enum
@@ -232,7 +232,7 @@
     v8::TryCatch try_catch;
     v8::Handle<v8::String> str = v8::String::New(buffer.start());
     v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run();
-    ASSERT(!try_catch.HasCaught());
+    CHECK(!try_catch.HasCaught());
     return value->Int32Value();
   }
 }
@@ -259,7 +259,7 @@
     v8::TryCatch try_catch;
     v8::Handle<v8::String> str = v8::String::New(buffer.start());
     v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run();
-    ASSERT(!try_catch.HasCaught());
+    CHECK(!try_catch.HasCaught());
     return value->Int32Value();
   }
 }
@@ -2945,9 +2945,11 @@
   v8::HandleScope scope;
   DebugLocalContext env;
 
-  // This test should be run with option --verify-heap. This is an ASSERT and
-  // not a CHECK as --verify-heap is only available in debug mode.
-  ASSERT(v8::internal::FLAG_verify_heap);
+  // This test should be run with option --verify-heap. As --verify-heap is
+  // only available in debug mode only check for it in that case.
+#ifdef DEBUG
+  CHECK(v8::internal::FLAG_verify_heap);
+#endif
 
   // Register a debug event listener which sets the break flag and counts.
   v8::Debug::SetDebugEventListener(DebugEventBreak);
@@ -3361,7 +3363,7 @@
 
 void ThreadBarrier::Wait() {
   lock_->Lock();
-  ASSERT(!invalid_);
+  CHECK(!invalid_);
   if (num_blocked_ == num_threads_ - 1) {
     // Signal and unblock all waiting threads.
     for (int i = 0; i < num_threads_ - 1; ++i) {
@@ -3559,32 +3561,33 @@
 TEST(MessageQueueExpandAndDestroy) {
   TestClientData::ResetCounters();
   { // Create a scope for the queue.
-    MessageQueue queue(1);
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    CommandMessageQueue queue(1);
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    ASSERT_EQ(0, TestClientData::destructor_call_counter);
+    CHECK_EQ(0, TestClientData::destructor_call_counter);
     queue.Get().Dispose();
-    ASSERT_EQ(1, TestClientData::destructor_call_counter);
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    CHECK_EQ(1, TestClientData::destructor_call_counter);
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    queue.Put(Message::NewCommand(Vector<uint16_t>::empty(),
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
                                   new TestClientData()));
-    queue.Put(Message::NewOutput(v8::Handle<v8::String>(),
-                                 new TestClientData()));
-    queue.Put(Message::NewEmptyMessage());
-    ASSERT_EQ(1, TestClientData::destructor_call_counter);
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
+                                  new TestClientData()));
+    queue.Put(CommandMessage::New(Vector<uint16_t>::empty(),
+                                  new TestClientData()));
+    CHECK_EQ(1, TestClientData::destructor_call_counter);
     queue.Get().Dispose();
-    ASSERT_EQ(2, TestClientData::destructor_call_counter);
+    CHECK_EQ(2, TestClientData::destructor_call_counter);
   }
   // All the client data should be destroyed when the queue is destroyed.
-  ASSERT_EQ(TestClientData::destructor_call_counter,
-            TestClientData::destructor_call_counter);
+  CHECK_EQ(TestClientData::destructor_call_counter,
+           TestClientData::destructor_call_counter);
 }
 
 
@@ -3606,8 +3609,7 @@
   DebugLocalContext env;
   TestClientData::ResetCounters();
   handled_client_data_instances_count = 0;
-  v8::Debug::SetMessageHandler(MessageHandlerCountingClientData,
-                               false /* message_handler_thread */);
+  v8::Debug::SetMessageHandler(MessageHandlerCountingClientData);
   const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5; debugger;";
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
@@ -3635,11 +3637,11 @@
                          new TestClientData());
   v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer));
   CompileRun(source_1);
-  ASSERT_EQ(3, TestClientData::constructor_call_counter);
-  ASSERT_EQ(TestClientData::constructor_call_counter,
-            handled_client_data_instances_count);
-  ASSERT_EQ(TestClientData::constructor_call_counter,
-            TestClientData::destructor_call_counter);
+  CHECK_EQ(3, TestClientData::constructor_call_counter);
+  CHECK_EQ(TestClientData::constructor_call_counter,
+           handled_client_data_instances_count);
+  CHECK_EQ(TestClientData::constructor_call_counter,
+           TestClientData::destructor_call_counter);
 }
 
 
diff --git a/test/cctest/test-decls.cc b/test/cctest/test-decls.cc
index e798fee..ecdad2e 100644
--- a/test/cctest/test-decls.cc
+++ b/test/cctest/test-decls.cc
@@ -389,7 +389,7 @@
         state_ = UNKNOWN;
         return True();
       default:
-        ASSERT(state_ == UNKNOWN);
+        CHECK(state_ == UNKNOWN);
         break;
     }
     // Do the lookup in the object.
@@ -479,7 +479,7 @@
         state_ = UNKNOWN;
         return False();
       default:
-        ASSERT(state_ == UNKNOWN);
+        CHECK(state_ == UNKNOWN);
         break;
     }
     // Do the lookup in the object.
diff --git a/test/cctest/test-hashmap.cc b/test/cctest/test-hashmap.cc
index 4918d5d..954dbe1 100644
--- a/test/cctest/test-hashmap.cc
+++ b/test/cctest/test-hashmap.cc
@@ -43,7 +43,7 @@
   IntSet() : map_(DefaultMatchFun)  {}
 
   void Insert(int x) {
-    ASSERT(x != 0);  // 0 corresponds to (void*)NULL - illegal key value
+    CHECK_NE(0, x);  // 0 corresponds to (void*)NULL - illegal key value
     HashMap::Entry* p = map_.Lookup(reinterpret_cast<void*>(x), Hash(x), true);
     CHECK(p != NULL);  // insert is set!
     CHECK_EQ(reinterpret_cast<void*>(x), p->key);
diff --git a/test/cctest/test-list.cc b/test/cctest/test-list.cc
index d10cdd7..838a45d 100644
--- a/test/cctest/test-list.cc
+++ b/test/cctest/test-list.cc
@@ -63,5 +63,5 @@
 
   // Add an existing element, the backing store should have to grow.
   list.Add(list[0]);
-  ASSERT(list[4] == 1);
+  CHECK_EQ(1, list[4]);
 }
diff --git a/test/cctest/test-log-ia32.cc b/test/cctest/test-log-ia32.cc
index b171339..dde8512 100644
--- a/test/cctest/test-log-ia32.cc
+++ b/test/cctest/test-log-ia32.cc
@@ -62,28 +62,6 @@
 }
 
 
-static void CheckRetAddrIsInFunction(const char* func_name,
-                                     unsigned int ret_addr,
-                                     unsigned int func_start_addr,
-                                     unsigned int func_len) {
-  printf("CheckRetAddrIsInFunction \"%s\": %08x %08x %08x\n",
-         func_name, func_start_addr, ret_addr, func_start_addr + func_len);
-  CHECK_GE(ret_addr, func_start_addr);
-  CHECK_GE(func_start_addr + func_len, ret_addr);
-}
-
-
-static void CheckRetAddrIsInJSFunction(const char* func_name,
-                                       unsigned int ret_addr,
-                                       Handle<JSFunction> func) {
-  v8::internal::Code* func_code = func->code();
-  CheckRetAddrIsInFunction(
-      func_name, ret_addr,
-      reinterpret_cast<unsigned int>(func_code->instruction_start()),
-      func_code->ExecutableSize());
-}
-
-
 // --- T r a c e   E x t e n s i o n ---
 
 class TraceExtension : public v8::Extension {
@@ -141,146 +119,6 @@
 v8::DeclareExtension kTraceExtensionDeclaration(&kTraceExtension);
 
 
-static void InitializeVM() {
-  if (env.IsEmpty()) {
-    v8::HandleScope scope;
-    const char* extensions[] = { "v8/trace" };
-    v8::ExtensionConfiguration config(1, extensions);
-    env = v8::Context::New(&config);
-  }
-  v8::HandleScope scope;
-  env->Enter();
-}
-
-
-static Handle<JSFunction> CompileFunction(const char* source) {
-  return v8::Utils::OpenHandle(*Script::Compile(String::New(source)));
-}
-
-
-static void CompileRun(const char* source) {
-  Script::Compile(String::New(source))->Run();
-}
-
-
-static Local<Value> GetGlobalProperty(const char* name) {
-  return env->Global()->Get(String::New(name));
-}
-
-
-static Handle<JSFunction> GetGlobalJSFunction(const char* name) {
-  Handle<JSFunction> js_func(JSFunction::cast(
-                                 *(v8::Utils::OpenHandle(
-                                       *GetGlobalProperty(name)))));
-  return js_func;
-}
-
-
-static void CheckRetAddrIsInJSFunction(const char* func_name,
-                                       unsigned int ret_addr) {
-  CheckRetAddrIsInJSFunction(func_name, ret_addr,
-                             GetGlobalJSFunction(func_name));
-}
-
-
-static void SetGlobalProperty(const char* name, Local<Value> value) {
-  env->Global()->Set(String::New(name), value);
-}
-
-
-static bool Patch(byte* from,
-                  size_t num,
-                  byte* original,
-                  byte* patch,
-                  size_t patch_len) {
-  byte* to = from + num;
-  do {
-    from = static_cast<byte*>(memchr(from, *original, to - from));
-    CHECK(from != NULL);
-    if (memcmp(original, from, patch_len) == 0) {
-      memcpy(from, patch, patch_len);
-      return true;
-    } else {
-      from++;
-    }
-  } while (to - from > 0);
-  return false;
-}
-
-
-// Creates a global function named 'func_name' that calls the tracing
-// function 'trace_func_name' with an actual EBP register value,
-// shifted right to be presented as Smi.
-static void CreateTraceCallerFunction(const char* func_name,
-                                      const char* trace_func_name) {
-  ::v8::internal::EmbeddedVector<char, 256> trace_call_buf;
-  ::v8::internal::OS::SNPrintF(trace_call_buf, "%s(0x6666);", trace_func_name);
-  Handle<JSFunction> func = CompileFunction(trace_call_buf.start());
-  CHECK(!func.is_null());
-  v8::internal::Code* func_code = func->code();
-  CHECK(func_code->IsCode());
-
-  // push 0xcccc (= 0x6666 << 1)
-  byte original[] = { 0x68, 0xcc, 0xcc, 0x00, 0x00 };
-  // mov eax,ebp; shr eax; push eax;
-  byte patch[] = { 0x89, 0xe8, 0xd1, 0xe8, 0x50 };
-  // Patch generated code to replace pushing of a constant with
-  // pushing of ebp contents in a Smi
-  CHECK(Patch(func_code->instruction_start(),
-              func_code->instruction_size(),
-              original, patch, sizeof(patch)));
-
-  SetGlobalProperty(func_name, v8::ToApi<Value>(func));
-}
-
-
-TEST(CFromJSStackTrace) {
-  TickSample sample;
-  StackTracer tracer(reinterpret_cast<unsigned int>(&sample));
-  InitTraceEnv(&tracer, &sample);
-
-  InitializeVM();
-  v8::HandleScope scope;
-  CreateTraceCallerFunction("JSFuncDoTrace", "trace");
-  CompileRun(
-      "function JSTrace() {"
-      "  JSFuncDoTrace();"
-      "};\n"
-      "JSTrace();");
-  CHECK_GT(sample.frames_count, 1);
-  // Stack sampling will start from the first JS function, i.e. "JSFuncDoTrace"
-  CheckRetAddrIsInJSFunction("JSFuncDoTrace",
-                             reinterpret_cast<unsigned int>(sample.stack[0]));
-  CheckRetAddrIsInJSFunction("JSTrace",
-                             reinterpret_cast<unsigned int>(sample.stack[1]));
-}
-
-
-TEST(PureJSStackTrace) {
-  TickSample sample;
-  StackTracer tracer(reinterpret_cast<unsigned int>(&sample));
-  InitTraceEnv(&tracer, &sample);
-
-  InitializeVM();
-  v8::HandleScope scope;
-  CreateTraceCallerFunction("JSFuncDoTrace", "js_trace");
-  CompileRun(
-      "function JSTrace() {"
-      "  JSFuncDoTrace();"
-      "};\n"
-      "function OuterJSTrace() {"
-      "  JSTrace();"
-      "};\n"
-      "OuterJSTrace();");
-  CHECK_GT(sample.frames_count, 1);
-  // Stack sampling will start from the caller of JSFuncDoTrace, i.e. "JSTrace"
-  CheckRetAddrIsInJSFunction("JSTrace",
-                             reinterpret_cast<unsigned int>(sample.stack[0]));
-  CheckRetAddrIsInJSFunction("OuterJSTrace",
-                             reinterpret_cast<unsigned int>(sample.stack[1]));
-}
-
-
 static void CFuncDoTrace() {
   unsigned int fp;
 #ifdef __GNUC__
diff --git a/test/cctest/test-regexp.cc b/test/cctest/test-regexp.cc
index afd9679..f2f66fb 100644
--- a/test/cctest/test-regexp.cc
+++ b/test/cctest/test-regexp.cc
@@ -40,10 +40,10 @@
 #include "regexp-macro-assembler.h"
 #include "regexp-macro-assembler-irregexp.h"
 #ifdef ARM
-#include "regexp-macro-assembler-arm.h"
+#include "arm/regexp-macro-assembler-arm.h"
 #else  // IA32
-#include "macro-assembler-ia32.h"
-#include "regexp-macro-assembler-ia32.h"
+#include "ia32/macro-assembler-ia32.h"
+#include "ia32/regexp-macro-assembler-ia32.h"
 #endif
 #include "interpreter-irregexp.h"
 
diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc
index 3be5d62..1788cd2 100644
--- a/test/cctest/test-strings.cc
+++ b/test/cctest/test-strings.cc
@@ -154,7 +154,7 @@
     Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS],
     int from,
     int to) {
-  ASSERT(to > from);
+  CHECK(to > from);
   if (to - from == 1) {
     return building_blocks[from % NUMBER_OF_BUILDING_BLOCKS];
   }
@@ -279,7 +279,7 @@
     Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS],
     int from,
     int to) {
-  ASSERT(to > from);
+  CHECK(to > from);
   if (to - from <= 1)
     return SliceOf(building_blocks[from % NUMBER_OF_BUILDING_BLOCKS]);
   if (to - from == 2) {
diff --git a/test/mjsunit/json.js b/test/mjsunit/json.js
new file mode 100644
index 0000000..4758264
--- /dev/null
+++ b/test/mjsunit/json.js
@@ -0,0 +1,197 @@
+// Copyright 2009 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:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+function GenericToJSONChecks(Constructor, value, alternative) {
+  var n1 = new Constructor(value);
+  n1.valueOf = function () { return alternative; };
+  assertEquals(alternative, n1.toJSON());
+  var n2 = new Constructor(value);
+  n2.valueOf = null;
+  assertThrows(function () { n2.toJSON(); }, TypeError);
+  var n3 = new Constructor(value);
+  n3.valueOf = function () { return {}; };
+  assertThrows(function () { n3.toJSON(); }, TypeError, 'result_not_primitive');
+  var n4 = new Constructor(value);
+  n4.valueOf = function () {
+    assertEquals(0, arguments.length);
+    assertEquals(this, n4);
+    return null;
+  };
+  assertEquals(null, n4.toJSON());
+}
+
+// Number toJSON
+assertEquals(3, (3).toJSON());
+assertEquals(3, (3).toJSON(true));
+assertEquals(4, (new Number(4)).toJSON());
+GenericToJSONChecks(Number, 5, 6);
+
+// Boolean toJSON
+assertEquals(true, (true).toJSON());
+assertEquals(true, (true).toJSON(false));
+assertEquals(false, (false).toJSON());
+assertEquals(true, (new Boolean(true)).toJSON());
+GenericToJSONChecks(Boolean, true, false);
+GenericToJSONChecks(Boolean, false, true);
+
+// String toJSON
+assertEquals("flot", "flot".toJSON());
+assertEquals("flot", "flot".toJSON(3));
+assertEquals("tolf", (new String("tolf")).toJSON());
+GenericToJSONChecks(String, "x", "y");
+
+// Date toJSON
+assertEquals("1970-01-01T00:00:00Z", new Date(0).toJSON());
+assertEquals("1979-01-11T08:00:00Z", new Date("1979-01-11 08:00 GMT").toJSON());
+assertEquals("2005-05-05T05:05:05Z", new Date("2005-05-05 05:05:05 GMT").toJSON());
+var n1 = new Date(10000);
+n1.toISOString = function () { return "foo"; };
+assertEquals("foo", n1.toJSON());
+var n2 = new Date(10001);
+n2.toISOString = null;
+assertThrows(function () { n2.toJSON(); }, TypeError);
+var n3 = new Date(10002);
+n3.toISOString = function () { return {}; };
+assertThrows(function () { n3.toJSON(); }, TypeError, "result_not_primitive");
+var n4 = new Date(10003);
+n4.toISOString = function () {
+  assertEquals(0, arguments.length);
+  assertEquals(this, n4);
+  return null;
+};
+assertEquals(null, n4.toJSON());
+
+assertEquals(Object.prototype, JSON.__proto__);
+assertEquals("[object JSON]", Object.prototype.toString.call(JSON));
+
+// DontEnum
+for (var p in this)
+  assertFalse(p == "JSON");
+
+// Parse
+
+assertEquals({}, JSON.parse("{}"));
+assertEquals(null, JSON.parse("null"));
+assertEquals(true, JSON.parse("true"));
+assertEquals(false, JSON.parse("false"));
+assertEquals("foo", JSON.parse('"foo"'));
+assertEquals("f\no", JSON.parse('"f\\no"'));
+assertEquals(1.1, JSON.parse("1.1"));
+assertEquals(1, JSON.parse("1.0"));
+assertEquals(0.0000000003, JSON.parse("3e-10"));
+assertEquals([], JSON.parse("[]"));
+assertEquals([1], JSON.parse("[1]"));
+assertEquals([1, "2", true, null], JSON.parse('[1, "2", true, null]'));
+
+function GetFilter(name) {
+  function Filter(key, value) {
+    return (key == name) ? undefined : value;
+  }
+  return Filter;
+}
+
+var pointJson = '{"x": 1, "y": 2}';
+assertEquals({'x': 1, 'y': 2}, JSON.parse(pointJson));
+assertEquals({'x': 1}, JSON.parse(pointJson, GetFilter('y')));
+assertEquals({'y': 2}, JSON.parse(pointJson, GetFilter('x')));
+assertEquals([1, 2, 3], JSON.parse("[1, 2, 3]"));
+assertEquals([1, undefined, 3], JSON.parse("[1, 2, 3]", GetFilter(1)));
+assertEquals([1, 2, undefined], JSON.parse("[1, 2, 3]", GetFilter(2)));
+
+function DoubleNumbers(key, value) {
+  return (typeof value == 'number') ? 2 * value : value;
+}
+
+var deepObject = '{"a": {"b": 1, "c": 2}, "d": {"e": {"f": 3}}}';
+assertEquals({"a": {"b": 1, "c": 2}, "d": {"e": {"f": 3}}},
+             JSON.parse(deepObject));
+assertEquals({"a": {"b": 2, "c": 4}, "d": {"e": {"f": 6}}},
+             JSON.parse(deepObject, DoubleNumbers));
+
+function TestInvalid(str) {
+  assertThrows(function () { JSON.parse(str); }, SyntaxError);
+}
+
+TestInvalid('abcdef');
+TestInvalid('isNaN()');
+TestInvalid('{"x": [1, 2, deepObject]}');
+TestInvalid('[1, [2, [deepObject], 3], 4]');
+TestInvalid('function () { return 0; }');
+
+TestInvalid("[1, 2");
+TestInvalid('{"x": 3');
+
+// Stringify
+
+assertEquals("true", JSON.stringify(true));
+assertEquals("false", JSON.stringify(false));
+assertEquals("null", JSON.stringify(null));
+assertEquals("false", JSON.stringify({toJSON: function () { return false; }}));
+assertEquals("4", JSON.stringify(4));
+assertEquals('"foo"', JSON.stringify("foo"));
+assertEquals("null", JSON.stringify(Infinity));
+assertEquals("null", JSON.stringify(-Infinity));
+assertEquals("null", JSON.stringify(NaN));
+assertEquals("4", JSON.stringify(new Number(4)));
+assertEquals('"bar"', JSON.stringify(new String("bar")));
+
+assertEquals('"foo\\u0000bar"', JSON.stringify("foo\0bar"));
+assertEquals('"f\\"o\'o\\\\b\\ba\\fr\\nb\\ra\\tz"',
+             JSON.stringify("f\"o\'o\\b\ba\fr\nb\ra\tz"));
+
+assertEquals("[1,2,3]", JSON.stringify([1, 2, 3]));
+assertEquals("[\n 1,\n 2,\n 3\n]", JSON.stringify([1, 2, 3], null, 1));
+assertEquals("[\n  1,\n  2,\n  3\n]", JSON.stringify([1, 2, 3], null, 2));
+assertEquals("[\n  1,\n  2,\n  3\n]",
+             JSON.stringify([1, 2, 3], null, new Number(2)));
+assertEquals("[\n^1,\n^2,\n^3\n]", JSON.stringify([1, 2, 3], null, "^"));
+assertEquals("[\n^1,\n^2,\n^3\n]",
+             JSON.stringify([1, 2, 3], null, new String("^")));
+assertEquals("[\n 1,\n 2,\n [\n  3,\n  [\n   4\n  ],\n  5\n ],\n 6,\n 7\n]",
+             JSON.stringify([1, 2, [3, [4], 5], 6, 7], null, 1));
+assertEquals("[]", JSON.stringify([], null, 1));
+assertEquals("[1,2,[3,[4],5],6,7]",
+             JSON.stringify([1, 2, [3, [4], 5], 6, 7], null));
+assertEquals("[2,4,[6,[8],10],12,14]",
+             JSON.stringify([1, 2, [3, [4], 5], 6, 7], DoubleNumbers));
+
+var circular = [1, 2, 3];
+circular[2] = circular;
+assertThrows(function () { JSON.stringify(circular); }, TypeError);
+
+var singleton = [];
+var multiOccurrence = [singleton, singleton, singleton];
+assertEquals("[[],[],[]]", JSON.stringify(multiOccurrence));
+
+assertEquals('{"x":5,"y":6}', JSON.stringify({x:5,y:6}));
+assertEquals('{"x":5}', JSON.stringify({x:5,y:6}, ['x']));
+assertEquals('{\n "a": "b",\n "c": "d"\n}',
+             JSON.stringify({a:"b",c:"d"}, null, 1));
+assertEquals('{"y":6,"x":5}', JSON.stringify({x:5,y:6}, ['y', 'x']));
+
+assertEquals(undefined, JSON.stringify(undefined));
+assertEquals(undefined, JSON.stringify(function () { }));
diff --git a/test/mjsunit/mjsunit.js b/test/mjsunit/mjsunit.js
index 320e8d1..2c52a31 100644
--- a/test/mjsunit/mjsunit.js
+++ b/test/mjsunit/mjsunit.js
@@ -51,6 +51,25 @@
 }
 
 
+function deepObjectEquals(a, b) {
+  var aProps = [];
+  for (var key in a)
+    aProps.push(key);
+  var bProps = [];
+  for (var key in b)
+    bProps.push(key);
+  aProps.sort();
+  bProps.sort();
+  if (!deepEquals(aProps, bProps))
+    return false;
+  for (var i = 0; i < aProps.length; i++) {
+    if (!deepEquals(a[aProps[i]], b[aProps[i]]))
+      return false;
+  }
+  return true;
+}
+
+
 function deepEquals(a, b) {
   if (a == b) return true;
   if (typeof a == "number" && typeof b == "number" && isNaN(a) && isNaN(b)) {
@@ -73,8 +92,9 @@
       }
     }
     return true;
+  } else {
+    return deepObjectEquals(a, b);
   }
-  return false;
 }
 
 
@@ -130,12 +150,20 @@
 }
 
 
-function assertThrows(code) {
+function assertThrows(code, type_opt, cause_opt) {
   var threwException = true;
   try {
-    eval(code);
+    if (typeof code == 'function') {
+      code();
+    } else {
+      eval(code);
+    }
     threwException = false;
   } catch (e) {
+    if (typeof type_opt == 'function')
+      assertInstanceof(e, type_opt);
+    if (arguments.length >= 3)
+      assertEquals(e.type, cause_opt);
     // Do nothing.
   }
   if (!threwException) assertTrue(false, "did not throw exception");
diff --git a/test/mjsunit/tools/profile.js b/test/mjsunit/tools/profile.js
index 87ec8fa..4a93860 100644
--- a/test/mjsunit/tools/profile.js
+++ b/test/mjsunit/tools/profile.js
@@ -270,7 +270,8 @@
     counted++;
   }
 
-  var flatProfile = testDriver.profile.getFlatProfile();
+  var flatProfile =
+      testDriver.profile.getFlatProfile().getRoot().exportChildren();
   assertEquals(counted, flatProfile.length, 'counted vs. flatProfile');
   for (var i = 0; i < flatProfile.length; ++i) {
     var rec = flatProfile[i];
diff --git a/test/mjsunit/tools/profileview.js b/test/mjsunit/tools/profileview.js
new file mode 100644
index 0000000..d70c30d
--- /dev/null
+++ b/test/mjsunit/tools/profileview.js
@@ -0,0 +1,95 @@
+// Copyright 2009 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:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Load source code files from <project root>/tools.
+// Files: tools/profile.js tools/profileview.js
+
+
+function createNode(name, time, opt_parent) {
+  var node = new devtools.profiler.ProfileView.Node(name, time, time, null);
+  if (opt_parent) {
+    opt_parent.addChild(node);
+  }
+  return node;
+}
+
+
+(function testSorting() {
+   //
+   // Build a tree:
+   //   root             +--c/5
+   //    |               |
+   //    +--a/2  +--b/3--+--d/4
+   //    |       |       |
+   //    +--a/1--+--c/1  +--d/2
+   //    |       |
+   //    +--c/1  +--b/2
+   //
+   // So we can sort it using 2 fields: name and time.
+   var root = createNode('root', 0);
+   createNode('a', 2, root);
+   var a1 = createNode('a', 1, root);
+   createNode('c', 1, root);
+   var b3 = createNode('b', 3, a1);
+   createNode('c', 1, a1);
+   createNode('b', 2, a1);
+   createNode('c', 5, b3);
+   createNode('d', 4, b3);
+   createNode('d', 2, b3);
+
+   var view = new devtools.profiler.ProfileView(root);
+   var flatTree = [];
+
+   function fillFlatTree(node) {
+     flatTree.push(node.internalFuncName);
+     flatTree.push(node.selfTime);
+   }
+
+   view.traverse(fillFlatTree);
+   assertEquals(
+     ['root', 0,
+      'a', 2, 'a', 1, 'c', 1,
+      'b', 3, 'c', 1, 'b', 2,
+      'c', 5, 'd', 4, 'd', 2], flatTree);
+
+   function cmpStrs(s1, s2) {
+     return s1 == s2 ? 0 : (s1 < s2 ? -1 : 1);
+   }
+
+   view.sort(function(n1, n2) {
+     return cmpStrs(n1.internalFuncName, n2.internalFuncName) ||
+         (n1.selfTime - n2.selfTime);
+   });
+
+   flatTree = [];
+   view.traverse(fillFlatTree);
+   assertEquals(
+     ['root', 0,
+      'a', 1, 'a', 2, 'c', 1,
+      'b', 2, 'b', 3, 'c', 1,
+      'c', 5, 'd', 2, 'd', 4], flatTree);
+})();
diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp
new file mode 100644
index 0000000..aa45e0b
--- /dev/null
+++ b/tools/gyp/v8.gyp
@@ -0,0 +1,709 @@
+# Copyright 2009 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:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.
+#     * Neither the name of Google Inc. nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+{
+  'variables': {
+    'chromium_code': 1,
+    'msvs_use_common_release': 0,
+    'base_source_files': [
+      '../../src/arm/assembler-arm-inl.h',
+      '../../src/arm/assembler-arm.cc',
+      '../../src/arm/assembler-arm.h',
+      '../../src/arm/builtins-arm.cc',
+      '../../src/arm/codegen-arm.cc',
+      '../../src/arm/codegen-arm.h',
+      '../../src/arm/constants-arm.h',
+      '../../src/arm/cpu-arm.cc',
+      '../../src/arm/debug-arm.cc',
+      '../../src/arm/disasm-arm.cc',
+      '../../src/arm/frames-arm.cc',
+      '../../src/arm/frames-arm.h',
+      '../../src/arm/ic-arm.cc',
+      '../../src/arm/jump-target-arm.cc',
+      '../../src/arm/macro-assembler-arm.cc',
+      '../../src/arm/macro-assembler-arm.h',
+      '../../src/arm/regexp-macro-assembler-arm.cc',
+      '../../src/arm/regexp-macro-assembler-arm.h',
+      '../../src/arm/register-allocator-arm.cc',
+      '../../src/arm/simulator-arm.cc',
+      '../../src/arm/stub-cache-arm.cc',
+      '../../src/arm/virtual-frame-arm.cc',
+      '../../src/arm/virtual-frame-arm.h',
+      '../../src/ia32/assembler-ia32-inl.h',
+      '../../src/ia32/assembler-ia32.cc',
+      '../../src/ia32/assembler-ia32.h',
+      '../../src/ia32/builtins-ia32.cc',
+      '../../src/ia32/codegen-ia32.cc',
+      '../../src/ia32/codegen-ia32.h',
+      '../../src/ia32/cpu-ia32.cc',
+      '../../src/ia32/debug-ia32.cc',
+      '../../src/ia32/disasm-ia32.cc',
+      '../../src/ia32/frames-ia32.cc',
+      '../../src/ia32/frames-ia32.h',
+      '../../src/ia32/ic-ia32.cc',
+      '../../src/ia32/jump-target-ia32.cc',
+      '../../src/ia32/macro-assembler-ia32.cc',
+      '../../src/ia32/macro-assembler-ia32.h',
+      '../../src/ia32/regexp-macro-assembler-ia32.cc',
+      '../../src/ia32/regexp-macro-assembler-ia32.h',
+      '../../src/ia32/register-allocator-ia32.cc',
+      '../../src/ia32/stub-cache-ia32.cc',
+      '../../src/ia32/virtual-frame-ia32.cc',
+      '../../src/ia32/virtual-frame-ia32.h',
+      '../../src/third_party/dtoa/dtoa.c',
+      '../../src/accessors.cc',
+      '../../src/accessors.h',
+      '../../src/allocation.cc',
+      '../../src/allocation.h',
+      '../../src/api.cc',
+      '../../src/api.h',
+      '../../src/apiutils.h',
+      '../../src/arguments.h',
+      '../../src/assembler.cc',
+      '../../src/assembler.h',
+      '../../src/ast.cc',
+      '../../src/ast.h',
+      '../../src/bootstrapper.cc',
+      '../../src/bootstrapper.h',
+      '../../src/builtins.cc',
+      '../../src/builtins.h',
+      '../../src/bytecodes-irregexp.h',
+      '../../src/char-predicates-inl.h',
+      '../../src/char-predicates.h',
+      '../../src/checks.cc',
+      '../../src/checks.h',
+      '../../src/code-stubs.cc',
+      '../../src/code-stubs.h',
+      '../../src/code.h',
+      '../../src/codegen-inl.h',
+      '../../src/codegen.cc',
+      '../../src/codegen.h',
+      '../../src/compilation-cache.cc',
+      '../../src/compilation-cache.h',
+      '../../src/compiler.cc',
+      '../../src/compiler.h',
+      '../../src/contexts.cc',
+      '../../src/contexts.h',
+      '../../src/conversions-inl.h',
+      '../../src/conversions.cc',
+      '../../src/conversions.h',
+      '../../src/counters.cc',
+      '../../src/counters.h',
+      '../../src/cpu.h',
+      '../../src/dateparser.cc',
+      '../../src/dateparser.h',
+      '../../src/dateparser-inl.h',
+      '../../src/debug.cc',
+      '../../src/debug.h',
+      '../../src/debug-agent.cc',
+      '../../src/debug-agent.h',
+      '../../src/disasm.h',
+      '../../src/disassembler.cc',
+      '../../src/disassembler.h',
+      '../../src/dtoa-config.c',
+      '../../src/execution.cc',
+      '../../src/execution.h',
+      '../../src/factory.cc',
+      '../../src/factory.h',
+      '../../src/flag-definitions.h',
+      '../../src/flags.cc',
+      '../../src/flags.h',
+      '../../src/frames-inl.h',
+      '../../src/frames.cc',
+      '../../src/frames.h',
+      '../../src/func-name-inferrer.cc',
+      '../../src/func-name-inferrer.h',
+      '../../src/global-handles.cc',
+      '../../src/global-handles.h',
+      '../../src/globals.h',
+      '../../src/handles-inl.h',
+      '../../src/handles.cc',
+      '../../src/handles.h',
+      '../../src/hashmap.cc',
+      '../../src/hashmap.h',
+      '../../src/heap-inl.h',
+      '../../src/heap.cc',
+      '../../src/heap.h',
+      '../../src/ic-inl.h',
+      '../../src/ic.cc',
+      '../../src/ic.h',
+      '../../src/interpreter-irregexp.cc',
+      '../../src/interpreter-irregexp.h',
+      '../../src/jump-target.cc',
+      '../../src/jump-target.h',
+      '../../src/jsregexp-inl.h',
+      '../../src/jsregexp.cc',
+      '../../src/jsregexp.h',
+      '../../src/list-inl.h',
+      '../../src/list.h',
+      '../../src/log.cc',
+      '../../src/log.h',
+      '../../src/macro-assembler.h',
+      '../../src/mark-compact.cc',
+      '../../src/mark-compact.h',
+      '../../src/memory.h',
+      '../../src/messages.cc',
+      '../../src/messages.h',
+      '../../src/natives.h',
+      '../../src/objects-debug.cc',
+      '../../src/objects-inl.h',
+      '../../src/objects.cc',
+      '../../src/objects.h',
+      '../../src/oprofile-agent.h',
+      '../../src/oprofile-agent.cc',
+      '../../src/parser.cc',
+      '../../src/parser.h',
+      '../../src/platform-freebsd.cc',
+      '../../src/platform-linux.cc',
+      '../../src/platform-macos.cc',
+      '../../src/platform-nullos.cc',
+      '../../src/platform-posix.cc',
+      '../../src/platform-win32.cc',
+      '../../src/platform.h',
+      '../../src/prettyprinter.cc',
+      '../../src/prettyprinter.h',
+      '../../src/property.cc',
+      '../../src/property.h',
+      '../../src/regexp-macro-assembler-irregexp-inl.h',
+      '../../src/regexp-macro-assembler-irregexp.cc',
+      '../../src/regexp-macro-assembler-irregexp.h',
+      '../../src/regexp-macro-assembler-tracer.cc',
+      '../../src/regexp-macro-assembler-tracer.h',
+      '../../src/regexp-macro-assembler.cc',
+      '../../src/regexp-macro-assembler.h',
+      '../../src/regexp-stack.cc',
+      '../../src/regexp-stack.h',
+      '../../src/register-allocator.h',
+      '../../src/register-allocator-inl.h',
+      '../../src/register-allocator.cc',
+      '../../src/rewriter.cc',
+      '../../src/rewriter.h',
+      '../../src/runtime.cc',
+      '../../src/runtime.h',
+      '../../src/scanner.cc',
+      '../../src/scanner.h',
+      '../../src/scopeinfo.cc',
+      '../../src/scopeinfo.h',
+      '../../src/scopes.cc',
+      '../../src/scopes.h',
+      '../../src/serialize.cc',
+      '../../src/serialize.h',
+      '../../src/shell.h',
+      '../../src/smart-pointer.h',
+      '../../src/snapshot-common.cc',
+      '../../src/snapshot.h',
+      '../../src/spaces-inl.h',
+      '../../src/spaces.cc',
+      '../../src/spaces.h',
+      '../../src/string-stream.cc',
+      '../../src/string-stream.h',
+      '../../src/stub-cache.cc',
+      '../../src/stub-cache.h',
+      '../../src/token.cc',
+      '../../src/token.h',
+      '../../src/top.cc',
+      '../../src/top.h',
+      '../../src/unicode-inl.h',
+      '../../src/unicode.cc',
+      '../../src/unicode.h',
+      '../../src/usage-analyzer.cc',
+      '../../src/usage-analyzer.h',
+      '../../src/utils.cc',
+      '../../src/utils.h',
+      '../../src/v8-counters.cc',
+      '../../src/v8-counters.h',
+      '../../src/v8.cc',
+      '../../src/v8.h',
+      '../../src/v8threads.cc',
+      '../../src/v8threads.h',
+      '../../src/variables.cc',
+      '../../src/variables.h',
+      '../../src/virtual-frame.h',
+      '../../src/virtual-frame.cc',
+      '../../src/zone-inl.h',
+      '../../src/zone.cc',
+      '../../src/zone.h',
+    ],
+    'not_base_source_files': [
+      # These files are #included by others and are not meant to be compiled
+      # directly.
+      '../../src/third_party/dtoa/dtoa.c',
+    ],
+    'd8_source_files': [
+      '../../src/d8-debug.cc',
+      '../../src/d8-posix.cc',
+      '../../src/d8-readline.cc',
+      '../../src/d8-windows.cc',
+      '../../src/d8.cc',
+    ],
+  },
+  'includes': [
+    '../../../build/common.gypi',
+  ],
+  'target_defaults': {
+    'defines': [
+      'ENABLE_LOGGING_AND_PROFILING',
+    ],
+    'configurations': {
+      'Debug': {
+        'defines': [
+          'DEBUG',
+          '_DEBUG',
+          'ENABLE_DISASSEMBLER',
+        ],
+        'msvs_settings': {
+          'VCCLCompilerTool': {
+            'Optimizations': '0',
+            'RuntimeLibrary': '1',
+          },
+          'VCLinkerTool': {
+            'LinkIncremental': '2',
+          },
+        },
+      },
+      'Release': {
+        'conditions': [
+          ['OS=="linux"', {
+            'cflags!': [
+              '-O2',
+            ],
+            'cflags': [
+              '-fomit-frame-pointer',
+              '-O3',
+            ],
+            'cflags_cc': [
+              '-fno-rtti',
+            ],
+          }],
+          ['OS=="win"', {
+            'msvs_configuration_attributes': {
+              'OutputDirectory': '$(SolutionDir)$(ConfigurationName)',
+              'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
+              'CharacterSet': '1',
+            },
+            'msvs_settings': {
+              'VCCLCompilerTool': {
+                'RuntimeLibrary': '0',
+                'Optimizations': '2',
+                'InlineFunctionExpansion': '2',
+                'EnableIntrinsicFunctions': 'true',
+                'FavorSizeOrSpeed': '0',
+                'OmitFramePointers': 'true',
+                'StringPooling': 'true',
+              },
+              'VCLinkerTool': {
+                'LinkIncremental': '1',
+                'OptimizeReferences': '2',
+                'OptimizeForWindows98': '1',
+                'EnableCOMDATFolding': '2',
+              },
+            },
+          }],
+        ],
+      },
+    },
+    'xcode_settings': {
+      'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',
+      'GCC_ENABLE_CPP_RTTI': 'NO',
+    },
+  },
+  'targets': [
+    # Targets that apply to any architecture.
+    {
+      'target_name': 'js2c',
+      'type': 'none',
+      'variables': {
+        'library_files': [
+          '../../src/runtime.js',
+          '../../src/v8natives.js',
+          '../../src/array.js',
+          '../../src/string.js',
+          '../../src/uri.js',
+          '../../src/math.js',
+          '../../src/messages.js',
+          '../../src/apinatives.js',
+          '../../src/debug-delay.js',
+          '../../src/mirror-delay.js',
+          '../../src/date-delay.js',
+          '../../src/json-delay.js',
+          '../../src/regexp-delay.js',
+          '../../src/macros.py',
+        ],
+      },
+      'actions': [
+        {
+          'action_name': 'js2c',
+          'inputs': [
+            '../../tools/js2c.py',
+            '<@(library_files)',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/libraries.cc',
+            '<(SHARED_INTERMEDIATE_DIR)/libraries-empty.cc',
+          ],
+          'action': ['python', '../../tools/js2c.py', '<@(_outputs)', 'CORE', '<@(library_files)'],
+        },
+      ],
+    },
+    {
+      'target_name': 'd8_js2c',
+      'type': 'none',
+      'variables': {
+        'library_files': [
+          '../../src/d8.js',
+          '../../src/macros.py',
+        ],
+      },
+      'actions': [
+        {
+          'action_name': 'js2c',
+          'inputs': [
+            '../../tools/js2c.py',
+            '<@(library_files)',
+          ],
+          'extra_inputs': [
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/d8-js.cc',
+            '<(SHARED_INTERMEDIATE_DIR)/d8-js-empty.cc',
+          ],
+          'action': ['python', '../../tools/js2c.py', '<@(_outputs)', 'D8', '<@(library_files)'],
+        },
+      ],
+    },
+
+    # Targets to build v8 for the native architecture (ia32).
+    {
+      'target_name': 'v8_base',
+      'type': '<(library)',
+      'include_dirs+': [
+        '../../src',
+        '../../src/ia32',
+      ],
+      'msvs_guid': 'EC8B7909-62AF-470D-A75D-E1D89C837142',
+      'sources': [
+        '<@(base_source_files)',
+      ],
+      'sources!': [
+        '<@(not_base_source_files)',
+      ],
+      'sources/': [
+        ['exclude', '-arm\\.cc$'],
+        ['exclude', 'src/platform-.*\\.cc$' ],
+      ],
+      'conditions': [
+        ['OS=="linux"',
+          {
+            'link_settings': {
+              'libraries': [
+                # Needed for clock_gettime() used by src/platform-linux.cc.
+                '-lrt',
+              ],
+            },
+            'sources/': [
+              ['include', 'src/platform-linux\\.cc$'],
+              ['include', 'src/platform-posix\\.cc$']
+            ]
+          }
+        ],
+        ['OS=="mac"',
+          {
+            'sources/': [
+              ['include', 'src/platform-macos\\.cc$'],
+              ['include', 'src/platform-posix\\.cc$']
+            ]
+          }
+        ],
+        ['OS=="win"', {
+          'sources/': [['include', 'src/platform-win32\\.cc$']],
+          # 4355, 4800 came from common.vsprops
+          # 4018, 4244 were a per file config on dtoa-config.c
+          # TODO: It's probably possible and desirable to stop disabling the
+          # dtoa-specific warnings by modifying dtoa as was done in Chromium
+          # r9255.  Refer to that revision for details.
+          'msvs_disabled_warnings': [4355, 4800, 4018, 4244],
+          'link_settings':  {
+            'libraries': [ '-lwinmm.lib' ],
+          },
+        }],
+      ],
+    },
+    {
+      'target_name': 'v8_nosnapshot',
+      'type': '<(library)',
+      'dependencies': [
+        'js2c',
+        'v8_base',
+      ],
+      'include_dirs': [
+        '../../src',
+      ],
+      'sources': [
+        '<(SHARED_INTERMEDIATE_DIR)/libraries.cc',
+        '../../src/snapshot-empty.cc',
+      ],
+      'export_dependent_settings': [
+        'v8_base',
+      ],
+    },
+    {
+      'target_name': 'mksnapshot',
+      'type': 'executable',
+      'dependencies': [
+        'v8_nosnapshot',
+      ],
+      'msvs_guid': '865575D0-37E2-405E-8CBA-5F6C485B5A26',
+      'sources': [
+        '../../src/mksnapshot.cc',
+      ],
+    },
+    {
+      'target_name': 'v8',
+      'type': '<(library)',
+      'dependencies': [
+        'js2c',
+        'mksnapshot',
+        'v8_base',
+      ],
+      'msvs_guid': '21E22961-22BF-4493-BD3A-868F93DA5179',
+      'actions': [
+        {
+          'action_name': 'mksnapshot',
+          'inputs': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)mksnapshot<(EXECUTABLE_SUFFIX)',
+          ],
+          'outputs': [
+            '<(INTERMEDIATE_DIR)/snapshot.cc',
+          ],
+          'action': ['<@(_inputs)', '<@(_outputs)'],
+        },
+      ],
+      'include_dirs': [
+        '../../src',
+      ],
+      'sources': [
+        '<(SHARED_INTERMEDIATE_DIR)/libraries-empty.cc',
+        '<(INTERMEDIATE_DIR)/snapshot.cc',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          '../../include',
+        ],
+      },
+      'export_dependent_settings': [
+        'v8_base',
+      ],
+    },
+    {
+      'target_name': 'v8_shell',
+      'type': 'executable',
+      'dependencies': [
+        'v8',
+      ],
+      'sources': [
+        '../../samples/shell.cc',
+      ],
+      'conditions': [
+        [ 'OS=="win"', {
+          # This could be gotten by not setting chromium_code, if that's OK.
+          'defines': ['_CRT_SECURE_NO_WARNINGS'],
+        }],
+      ],
+    },
+  ],
+
+  'conditions': [ ['OS=="mac"', { 'targets': [
+    # TODO(bradnelson):  temporarily disable 'd8' target on Windows while
+    # we work fix the performance regressions.
+    # TODO(sgk):  temporarily disable 'd8' target on Linux while
+    # we work out getting the readline library on all the systems.
+    {
+      'target_name': 'd8',
+      'type': 'executable',
+      'dependencies': [
+        'd8_js2c',
+        'v8',
+      ],
+      'include_dirs': [
+        '../../src',
+      ],
+      'sources': [
+        '<(SHARED_INTERMEDIATE_DIR)/d8-js.cc',
+        '<@(d8_source_files)',
+      ],
+      'conditions': [
+        [ 'OS=="linux"', {
+          'sources!': [ '../../src/d8-windows.cc' ],
+          'link_settings': { 'libraries': [ '-lreadline' ] },
+        }],
+        [ 'OS=="mac"', {
+          'sources!': [ '../../src/d8-windows.cc' ],
+          'link_settings': { 'libraries': [
+            '$(SDKROOT)/usr/lib/libreadline.dylib'
+          ]},
+        }],
+        [ 'OS=="win"', {
+          'sources!': [ '../../src/d8-readline.cc', '../../src/d8-posix.cc' ],
+        }],
+      ],
+    },
+    # TODO(sgk):  temporarily disable the arm targets on Linux while
+    # we work out how to refactor the generator and/or add configuration
+    # settings to the .gyp file to handle building both variants in
+    # the same output directory.
+    #
+    # ARM targets, to test ARM code generation.  These use an ARM simulator
+    # (src/simulator-arm.cc).  The ARM targets are not snapshot-enabled.
+    {
+      'target_name': 'v8_arm',
+      'type': '<(library)',
+      'dependencies': [
+        'js2c',
+      ],
+      'defines': [
+        'ARM',
+      ],
+      'include_dirs+': [
+        '../../src',
+        '../../src/arm',
+      ],
+      'sources': [
+        '<@(base_source_files)',
+        '<(SHARED_INTERMEDIATE_DIR)/libraries.cc',
+        '../../src/snapshot-empty.cc',
+      ],
+      'sources!': [
+        '<@(not_base_source_files)',
+      ],
+      'sources/': [
+        ['exclude', '-ia32\\.cc$'],
+        ['exclude', 'src/platform-.*\\.cc$' ],
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          '../../include',
+        ],
+      },
+      'conditions': [
+        ['OS=="linux"',
+          {
+            'sources/': [
+              ['include', 'src/platform-linux\\.cc$'],
+              ['include', 'src/platform-posix\\.cc$']
+            ]
+          }
+        ],
+        ['OS=="mac"',
+          {
+            'sources/': [
+              ['include', 'src/platform-macos\\.cc$'],
+              ['include', 'src/platform-posix\\.cc$']
+            ]
+          }
+        ],
+        ['OS=="win"', {
+          'sources/': [['include', 'src/platform-win32\\.cc$']],
+          # 4355, 4800 came from common.vsprops
+          # 4018, 4244 were a per file config on dtoa-config.c
+          # TODO: It's probably possible and desirable to stop disabling the
+          # dtoa-specific warnings by modifying dtoa as was done in Chromium
+          # r9255.  Refer to that revision for details.
+          'msvs_disabled_warnings': [4355, 4800, 4018, 4244],
+        }],
+      ],
+    },
+    {
+      'target_name': 'v8_shell_arm',
+      'type': 'executable',
+      'dependencies': [
+        'v8_arm',
+      ],
+      'defines': [
+        'ARM',
+      ],
+      'sources': [
+        '../../samples/shell.cc',
+      ],
+      'conditions': [
+        [ 'OS=="win"', {
+          # This could be gotten by not setting chromium_code, if that's OK.
+          'defines': ['_CRT_SECURE_NO_WARNINGS'],
+        }],
+      ],
+    },
+    {
+      'target_name': 'd8_arm',
+      'type': 'executable',
+      'dependencies': [
+        'd8_js2c',
+        'v8_arm',
+      ],
+      'defines': [
+        'ARM',
+      ],
+      'include_dirs': [
+        '../../src',
+      ],
+      'sources': [
+        '<(SHARED_INTERMEDIATE_DIR)/d8-js.cc',
+        '<@(d8_source_files)',
+      ],
+      'conditions': [
+        [ 'OS=="linux"', {
+          'sources!': [ '../../src/d8-windows.cc' ],
+          'link_settings': { 'libraries': [ '-lreadline' ] },
+        }],
+        [ 'OS=="mac"', {
+          'sources!': [ '../../src/d8-windows.cc' ],
+          'link_settings': { 'libraries': [
+            '$(SDKROOT)/usr/lib/libreadline.dylib'
+          ]},
+        }],
+        [ 'OS=="win"', {
+          'sources!': [ '../../src/d8-readline.cc', '../../src/d8-posix.cc' ],
+        }],
+      ],
+    },
+  ]}], # OS != "linux" (temporary, TODO(sgk))
+
+
+    ['OS=="win"', {
+      'target_defaults': {
+        'defines': [
+          '_USE_32BIT_TIME_T',
+          '_CRT_SECURE_NO_DEPRECATE',
+          '_CRT_NONSTDC_NO_DEPRECATE',
+        ],
+        'msvs_settings': {
+          'VCLinkerTool': {
+            'AdditionalOptions': '/IGNORE:4221 /NXCOMPAT',
+          },
+        },
+      },
+    }],
+  ],
+}
diff --git a/tools/profile.js b/tools/profile.js
index e70d244..d2b5322 100644
--- a/tools/profile.js
+++ b/tools/profile.js
@@ -56,15 +56,32 @@
 
 
 /**
+ * Enum for profiler operations that involve looking up existing
+ * code entries.
+ *
+ * @enum {number}
+ */
+devtools.profiler.Profile.Operation = {
+  MOVE: 0,
+  DELETE: 1,
+  TICK: 2
+};
+
+
+/**
  * Called whenever the specified operation has failed finding a function
  * containing the specified address. Should be overriden by subclasses.
- * Operation is one of the following: 'move', 'delete', 'tick'.
+ * See the devtools.profiler.Profile.Operation enum for the list of
+ * possible operations.
  *
- * @param {string} operation Operation name.
+ * @param {number} operation Operation.
  * @param {number} addr Address of the unknown code.
+ * @param {number} opt_stackPos If an unknown address is encountered
+ *     during stack strace processing, specifies a position of the frame
+ *     containing the address.
  */
 devtools.profiler.Profile.prototype.handleUnknownCode = function(
-    operation, addr) {
+    operation, addr, opt_stackPos) {
 };
 
 
@@ -77,8 +94,10 @@
  */
 devtools.profiler.Profile.prototype.addStaticCode = function(
     name, startAddr, endAddr) {
-  this.codeMap_.addStaticCode(startAddr,
-      new devtools.profiler.CodeMap.CodeEntry(endAddr - startAddr, name));
+  var entry = new devtools.profiler.CodeMap.CodeEntry(
+      endAddr - startAddr, name);
+  this.codeMap_.addStaticCode(startAddr, entry);
+  return entry;
 };
 
 
@@ -92,8 +111,9 @@
  */
 devtools.profiler.Profile.prototype.addCode = function(
     type, name, start, size) {
-  this.codeMap_.addCode(start,
-      new devtools.profiler.Profile.DynamicCodeEntry(size, type, name));
+  var entry = new devtools.profiler.Profile.DynamicCodeEntry(size, type, name);
+  this.codeMap_.addCode(start, entry);
+  return entry;
 };
 
 
@@ -107,7 +127,7 @@
   try {
     this.codeMap_.moveCode(from, to);
   } catch (e) {
-    this.handleUnknownCode('move', from);
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.MOVE, from);
   }
 };
 
@@ -121,7 +141,7 @@
   try {
     this.codeMap_.deleteCode(start);
   } catch (e) {
-    this.handleUnknownCode('delete', start);
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.DELETE, start);
   }
 };
 
@@ -156,7 +176,8 @@
         result.push(name);
       }
     } else {
-      this.handleUnknownCode('tick', stack[i]);
+      this.handleUnknownCode(
+          devtools.profiler.Profile.Operation.TICK, stack[i], i);
     }
   }
   return result;
@@ -168,7 +189,7 @@
  */
 devtools.profiler.Profile.prototype.getTopDownTreeRoot = function() {
   this.topDownTree_.computeTotalWeights();
-  return this.topDownTree_.root_;
+  return this.topDownTree_.getRoot();
 };
 
 
@@ -177,7 +198,7 @@
  */
 devtools.profiler.Profile.prototype.getBottomUpTreeRoot = function() {
   this.bottomUpTree_.computeTotalWeights();
-  return this.bottomUpTree_.root_;
+  return this.bottomUpTree_.getRoot();
 };
 
 
@@ -202,12 +223,42 @@
 
 
 /**
+ * Calculates a top down profile starting from the specified node.
+ *
+ * @param {devtools.profiler.CallTree.Node} opt_root Starting node.
+ */
+devtools.profiler.Profile.prototype.getTopDownProfile = function(opt_root) {
+  if (!opt_root) {
+    this.topDownTree_.computeTotalWeights();
+    return this.topDownTree_;
+  } else {
+    throw Error('not implemented');
+  }
+};
+
+
+/**
+ * Calculates a bottom up profile starting from the specified node.
+ *
+ * @param {devtools.profiler.CallTree.Node} opt_root Starting node.
+ */
+devtools.profiler.Profile.prototype.getBottomUpProfile = function(opt_root) {
+  if (!opt_root) {
+    this.bottomUpTree_.computeTotalWeights();
+    return this.bottomUpTree_;
+  } else {
+    throw Error('not implemented');
+  }
+};
+
+
+/**
  * Calculates a flat profile of callees starting from the specified node.
  *
  * @param {devtools.profiler.CallTree.Node} opt_root Starting node.
  */
 devtools.profiler.Profile.prototype.getFlatProfile = function(opt_root) {
-  var counters = new devtools.profiler.CallTree.Node('');
+  var counters = new devtools.profiler.CallTree();
   var precs = {};
   this.topDownTree_.computeTotalWeights();
   this.topDownTree_.traverseInDepth(
@@ -226,7 +277,7 @@
       precs[node.label]--;
     },
     opt_root);
-  return counters.exportChildren();
+  return counters;
 };
 
 
@@ -276,6 +327,14 @@
 
 
 /**
+ * Returns the tree root.
+ */
+devtools.profiler.CallTree.prototype.getRoot = function() {
+  return this.root_;
+};
+
+
+/**
  * Adds the specified call path, constructing nodes as necessary.
  *
  * @param {Array<string>} path Call path.
@@ -294,6 +353,20 @@
 
 
 /**
+ * Finds an immediate child of the specified parent with the specified
+ * label, creates a child node if necessary. If a parent node isn't
+ * specified, uses tree root.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.prototype.findOrAddChild = function(
+    label, opt_parent) {
+  var parent = opt_parent || this.root_;
+  return parent.findOrAddChild(label);
+};
+
+
+/**
  * Computes total weights in the call graph.
  */
 devtools.profiler.CallTree.prototype.computeTotalWeights = function() {
@@ -306,17 +379,30 @@
 
 
 /**
- * Traverses the call graph in preorder.
+ * Traverses the call graph in preorder. This function can be used for
+ * building optionally modified tree clones. This is the boilerplate code
+ * for this scenario:
  *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ * callTree.traverse(function(node, parentClone) {
+ *   var nodeClone = cloneNode(node);
+ *   if (parentClone)
+ *     parentClone.addChild(nodeClone);
+ *   return nodeClone;
+ * });
+ *
+ * @param {function(devtools.profiler.CallTree.Node, *)} f Visitor function.
+ *    The second parameter is the result of calling 'f' on the parent node.
  * @param {devtools.profiler.CallTree.Node} opt_start Starting node.
  */
 devtools.profiler.CallTree.prototype.traverse = function(f, opt_start) {
-  var nodesToVisit = [opt_start || this.root_];
-  while (nodesToVisit.length > 0) {
-    var node = nodesToVisit.shift();
-    f(node);
-    nodesToVisit = nodesToVisit.concat(node.exportChildren());
+  var pairsToProcess = [{node: opt_start || this.root_, param: null}];
+  while (pairsToProcess.length > 0) {
+    var pair = pairsToProcess.shift();
+    var node = pair.node;
+    var newParam = f(node, pair.param);
+    node.forEachChild(
+      function (child) { pairsToProcess.push({node: child, param: newParam}); }
+    );
   }
 };
 
diff --git a/tools/profileview.js b/tools/profileview.js
new file mode 100644
index 0000000..53ef6d9
--- /dev/null
+++ b/tools/profileview.js
@@ -0,0 +1,184 @@
+// Copyright 2009 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:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a Profile View builder object.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+devtools.profiler.ViewBuilder = function(samplingRate) {
+  this.samplingRate = samplingRate;
+};
+
+
+/**
+ * Builds a profile view for the specified call tree.
+ *
+ * @param {devtools.profiler.CallTree} callTree A call tree.
+ */
+devtools.profiler.ViewBuilder.prototype.buildView = function(
+    callTree) {
+  var head;
+  var samplingRate = this.samplingRate;
+  callTree.traverse(function(node, viewParent) {
+    var viewNode = new devtools.profiler.ProfileView.Node(
+        node.label, node.totalWeight * samplingRate,
+        node.selfWeight * samplingRate, head);
+    if (viewParent) {
+      viewParent.addChild(viewNode);
+    } else {
+      head = viewNode;
+    }
+    return viewNode;
+  });
+  var view = new devtools.profiler.ProfileView(head);
+  return view;
+};
+
+
+/**
+ * Creates a Profile View object. It allows to perform sorting
+ * and filtering actions on the profile. Profile View mimicks
+ * the Profile object from WebKit's JSC profiler.
+ *
+ * @param {devtools.profiler.ProfileView.Node} head Head (root) node.
+ * @constructor
+ */
+devtools.profiler.ProfileView = function(head) {
+  this.head = head;
+};
+
+
+/**
+ * Sorts the profile view using the specified sort function.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.prototype.sort = function(sortFunc) {
+  this.traverse(function (node) {
+    node.sortChildren(sortFunc);
+  });
+};
+
+
+/**
+ * Traverses profile view nodes in preorder.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function.
+ */
+devtools.profiler.ProfileView.prototype.traverse = function(f) {
+  var nodesToTraverse = [this.head];
+  while (nodesToTraverse.length > 0) {
+    var node = nodesToTraverse.shift();
+    f(node);
+    nodesToTraverse = nodesToTraverse.concat(node.children);
+  }
+};
+
+
+/**
+ * Constructs a Profile View node object. Each node object corresponds to
+ * a function call.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+devtools.profiler.ProfileView.Node = function(
+    internalFuncName, totalTime, selfTime, head) {
+  this.internalFuncName = internalFuncName;
+  this.totalTime = totalTime;
+  this.selfTime = selfTime;
+  this.head = head;
+  this.parent = null;
+  this.children = [];
+};
+
+
+/**
+ * Returns a share of the function's total time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'totalPercent',
+    function() { return this.totalTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's self time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'selfPercent',
+    function() { return this.selfTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's total time in its parent's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'parentTotalPercent',
+    function() { return this.totalTime /
+      (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Adds a child to the node.
+ *
+ * @param {devtools.profiler.ProfileView.Node} node Child node.
+ */
+devtools.profiler.ProfileView.Node.prototype.addChild = function(node) {
+  node.parent = this;
+  this.children.push(node);
+};
+
+
+/**
+ * Sorts all the node's children recursively.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.Node.prototype.sortChildren = function(
+    sortFunc) {
+  this.children.sort(sortFunc);
+};
diff --git a/tools/v8.xcodeproj/project.pbxproj b/tools/v8.xcodeproj/project.pbxproj
old mode 100644
new mode 100755
index eba4ec7..02c4631
--- a/tools/v8.xcodeproj/project.pbxproj
+++ b/tools/v8.xcodeproj/project.pbxproj
@@ -26,20 +26,20 @@
 
 /* Begin PBXBuildFile section */
 		58950D5E0F55519800F3E8BA /* jump-target.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D500F55514900F3E8BA /* jump-target.cc */; };
-		58950D5F0F55519D00F3E8BA /* jump-target-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D4F0F55514900F3E8BA /* jump-target-ia32.cc */; };
+		58950D5F0F55519D00F3E8BA /* ia32/jump-target-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D4F0F55514900F3E8BA /* ia32/jump-target-ia32.cc */; };
 		58950D600F5551A300F3E8BA /* jump-target.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D500F55514900F3E8BA /* jump-target.cc */; };
-		58950D610F5551A400F3E8BA /* jump-target-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D4E0F55514900F3E8BA /* jump-target-arm.cc */; };
-		58950D620F5551AF00F3E8BA /* register-allocator-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D530F55514900F3E8BA /* register-allocator-ia32.cc */; };
+		58950D610F5551A400F3E8BA /* arm/jump-target-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D4E0F55514900F3E8BA /* arm/jump-target-arm.cc */; };
+		58950D620F5551AF00F3E8BA /* ia32/register-allocator-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D530F55514900F3E8BA /* ia32/register-allocator-ia32.cc */; };
 		58950D630F5551AF00F3E8BA /* register-allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D540F55514900F3E8BA /* register-allocator.cc */; };
 		58950D640F5551B500F3E8BA /* register-allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D540F55514900F3E8BA /* register-allocator.cc */; };
-		58950D650F5551B600F3E8BA /* register-allocator-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D520F55514900F3E8BA /* register-allocator-arm.cc */; };
+		58950D650F5551B600F3E8BA /* arm/register-allocator-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D520F55514900F3E8BA /* arm/register-allocator-arm.cc */; };
 		58950D660F5551C200F3E8BA /* virtual-frame.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D5A0F55514900F3E8BA /* virtual-frame.cc */; };
-		58950D670F5551C400F3E8BA /* virtual-frame-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D580F55514900F3E8BA /* virtual-frame-ia32.cc */; };
+		58950D670F5551C400F3E8BA /* ia32/virtual-frame-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D580F55514900F3E8BA /* ia32/virtual-frame-ia32.cc */; };
 		58950D680F5551CB00F3E8BA /* virtual-frame.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D5A0F55514900F3E8BA /* virtual-frame.cc */; };
-		58950D690F5551CE00F3E8BA /* virtual-frame-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D560F55514900F3E8BA /* virtual-frame-arm.cc */; };
+		58950D690F5551CE00F3E8BA /* arm/virtual-frame-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 58950D560F55514900F3E8BA /* arm/virtual-frame-arm.cc */; };
 		8900116C0E71CA2300F91F35 /* libraries.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8900116B0E71CA2300F91F35 /* libraries.cc */; };
 		890A13FE0EE9C47F00E49346 /* interpreter-irregexp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C660EE4665300B48DEB /* interpreter-irregexp.cc */; };
-		890A14010EE9C4B000E49346 /* regexp-macro-assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C700EE466D000B48DEB /* regexp-macro-assembler-arm.cc */; };
+		890A14010EE9C4B000E49346 /* arm/regexp-macro-assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C700EE466D000B48DEB /* arm/regexp-macro-assembler-arm.cc */; };
 		890A14020EE9C4B400E49346 /* regexp-macro-assembler-irregexp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C750EE466D000B48DEB /* regexp-macro-assembler-irregexp.cc */; };
 		890A14030EE9C4B500E49346 /* regexp-macro-assembler-tracer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C770EE466D000B48DEB /* regexp-macro-assembler-tracer.cc */; };
 		890A14040EE9C4B700E49346 /* regexp-macro-assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C790EE466D000B48DEB /* regexp-macro-assembler.cc */; };
@@ -59,9 +59,9 @@
 		896FD03A0E78D717003DFB6A /* libv8-arm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 89F23C870E78D5B2006B2466 /* libv8-arm.a */; };
 		897F767F0E71B690007ACF34 /* shell.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1B50E719C0900D62E90 /* shell.cc */; };
 		897F76850E71B6B1007ACF34 /* libv8.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8970F2F00E719FB2006AE7B5 /* libv8.a */; };
-		898BD20E0EF6CC930068B00A /* debug-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 898BD20D0EF6CC850068B00A /* debug-ia32.cc */; };
-		898BD20F0EF6CC9A0068B00A /* debug-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 898BD20C0EF6CC850068B00A /* debug-arm.cc */; };
-		89A15C7B0EE466EB00B48DEB /* regexp-macro-assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C720EE466D000B48DEB /* regexp-macro-assembler-ia32.cc */; };
+		898BD20E0EF6CC930068B00A /* ia32/debug-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 898BD20D0EF6CC850068B00A /* ia32/debug-ia32.cc */; };
+		898BD20F0EF6CC9A0068B00A /* arm/debug-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 898BD20C0EF6CC850068B00A /* arm/debug-arm.cc */; };
+		89A15C7B0EE466EB00B48DEB /* ia32/regexp-macro-assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C720EE466D000B48DEB /* ia32/regexp-macro-assembler-ia32.cc */; };
 		89A15C810EE4674900B48DEB /* regexp-macro-assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C790EE466D000B48DEB /* regexp-macro-assembler.cc */; };
 		89A15C830EE4675E00B48DEB /* regexp-macro-assembler-irregexp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C750EE466D000B48DEB /* regexp-macro-assembler-irregexp.cc */; };
 		89A15C850EE4678B00B48DEB /* interpreter-irregexp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89A15C660EE4665300B48DEB /* interpreter-irregexp.cc */; };
@@ -69,39 +69,39 @@
 		89A88DEC0E71A5FF0043BA31 /* accessors.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF0F60E719B8F00D62E90 /* accessors.cc */; };
 		89A88DED0E71A6000043BA31 /* allocation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF0F80E719B8F00D62E90 /* allocation.cc */; };
 		89A88DEE0E71A6010043BA31 /* api.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF0FA0E719B8F00D62E90 /* api.cc */; };
-		89A88DEF0E71A60A0043BA31 /* assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1010E719B8F00D62E90 /* assembler-ia32.cc */; };
+		89A88DEF0E71A60A0043BA31 /* ia32/assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1010E719B8F00D62E90 /* ia32/assembler-ia32.cc */; };
 		89A88DF00E71A60A0043BA31 /* assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1030E719B8F00D62E90 /* assembler.cc */; };
 		89A88DF10E71A60B0043BA31 /* ast.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1050E719B8F00D62E90 /* ast.cc */; };
 		89A88DF20E71A60C0043BA31 /* bootstrapper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1070E719B8F00D62E90 /* bootstrapper.cc */; };
-		89A88DF40E71A6160043BA31 /* builtins-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF10A0E719B8F00D62E90 /* builtins-ia32.cc */; };
+		89A88DF40E71A6160043BA31 /* ia32/builtins-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF10A0E719B8F00D62E90 /* ia32/builtins-ia32.cc */; };
 		89A88DF50E71A6170043BA31 /* builtins.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF10B0E719B8F00D62E90 /* builtins.cc */; };
 		89A88DF60E71A61C0043BA31 /* checks.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF10F0E719B8F00D62E90 /* checks.cc */; };
-		89A88DF70E71A6240043BA31 /* codegen-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1150E719B8F00D62E90 /* codegen-ia32.cc */; };
+		89A88DF70E71A6240043BA31 /* ia32/codegen-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1150E719B8F00D62E90 /* ia32/codegen-ia32.cc */; };
 		89A88DF80E71A6260043BA31 /* codegen.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1170E719B8F00D62E90 /* codegen.cc */; };
 		89A88DF90E71A6430043BA31 /* compiler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1190E719B8F00D62E90 /* compiler.cc */; };
 		89A88DFA0E71A6440043BA31 /* contexts.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF11C0E719B8F00D62E90 /* contexts.cc */; };
 		89A88DFB0E71A6440043BA31 /* conversions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF11F0E719B8F00D62E90 /* conversions.cc */; };
 		89A88DFC0E71A6460043BA31 /* counters.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1210E719B8F00D62E90 /* counters.cc */; };
-		89A88DFD0E71A6470043BA31 /* cpu-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1240E719B8F00D62E90 /* cpu-ia32.cc */; };
+		89A88DFD0E71A6470043BA31 /* ia32/cpu-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1240E719B8F00D62E90 /* ia32/cpu-ia32.cc */; };
 		89A88DFE0E71A6480043BA31 /* dateparser.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1260E719B8F00D62E90 /* dateparser.cc */; };
 		89A88DFF0E71A6530043BA31 /* debug.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1280E719B8F00D62E90 /* debug.cc */; };
-		89A88E000E71A6540043BA31 /* disasm-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12B0E719B8F00D62E90 /* disasm-ia32.cc */; };
+		89A88E000E71A6540043BA31 /* ia32/disasm-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12B0E719B8F00D62E90 /* ia32/disasm-ia32.cc */; };
 		89A88E010E71A6550043BA31 /* disassembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12D0E719B8F00D62E90 /* disassembler.cc */; };
 		89A88E020E71A65A0043BA31 /* dtoa-config.c in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12F0E719B8F00D62E90 /* dtoa-config.c */; };
 		89A88E030E71A65B0043BA31 /* execution.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1300E719B8F00D62E90 /* execution.cc */; };
 		89A88E040E71A65D0043BA31 /* factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1320E719B8F00D62E90 /* factory.cc */; };
 		89A88E050E71A65D0043BA31 /* flags.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1350E719B8F00D62E90 /* flags.cc */; };
-		89A88E060E71A6600043BA31 /* frames-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1390E719B8F00D62E90 /* frames-ia32.cc */; };
+		89A88E060E71A6600043BA31 /* ia32/frames-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1390E719B8F00D62E90 /* ia32/frames-ia32.cc */; };
 		89A88E070E71A6610043BA31 /* frames.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF13C0E719B8F00D62E90 /* frames.cc */; };
 		89A88E080E71A6620043BA31 /* global-handles.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF13E0E719B8F00D62E90 /* global-handles.cc */; };
 		89A88E090E71A6640043BA31 /* handles.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1420E719B8F00D62E90 /* handles.cc */; };
 		89A88E0A0E71A6650043BA31 /* hashmap.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1440E719B8F00D62E90 /* hashmap.cc */; };
 		89A88E0B0E71A66C0043BA31 /* heap.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1470E719B8F00D62E90 /* heap.cc */; };
-		89A88E0C0E71A66D0043BA31 /* ic-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF14A0E719B8F00D62E90 /* ic-ia32.cc */; };
+		89A88E0C0E71A66D0043BA31 /* ia32/ic-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF14A0E719B8F00D62E90 /* ia32/ic-ia32.cc */; };
 		89A88E0D0E71A66E0043BA31 /* ic.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF14C0E719B8F00D62E90 /* ic.cc */; };
 		89A88E0E0E71A66F0043BA31 /* jsregexp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF14E0E719B8F00D62E90 /* jsregexp.cc */; };
 		89A88E0F0E71A6740043BA31 /* log.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1520E719B8F00D62E90 /* log.cc */; };
-		89A88E100E71A6770043BA31 /* macro-assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1560E719B8F00D62E90 /* macro-assembler-ia32.cc */; };
+		89A88E100E71A6770043BA31 /* ia32/macro-assembler-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1560E719B8F00D62E90 /* ia32/macro-assembler-ia32.cc */; };
 		89A88E110E71A6780043BA31 /* mark-compact.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1590E719B8F00D62E90 /* mark-compact.cc */; };
 		89A88E120E71A67A0043BA31 /* messages.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF15C0E719B8F00D62E90 /* messages.cc */; };
 		89A88E130E71A6860043BA31 /* objects-debug.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1600E719B8F00D62E90 /* objects-debug.cc */; };
@@ -120,7 +120,7 @@
 		89A88E200E71A6B60043BA31 /* snapshot-empty.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1830E719B8F00D62E90 /* snapshot-empty.cc */; };
 		89A88E210E71A6B70043BA31 /* spaces.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1860E719B8F00D62E90 /* spaces.cc */; };
 		89A88E220E71A6BC0043BA31 /* string-stream.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1880E719B8F00D62E90 /* string-stream.cc */; };
-		89A88E230E71A6BE0043BA31 /* stub-cache-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18B0E719B8F00D62E90 /* stub-cache-ia32.cc */; };
+		89A88E230E71A6BE0043BA31 /* ia32/stub-cache-ia32.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18B0E719B8F00D62E90 /* ia32/stub-cache-ia32.cc */; };
 		89A88E240E71A6BF0043BA31 /* stub-cache.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18C0E719B8F00D62E90 /* stub-cache.cc */; };
 		89A88E250E71A6C20043BA31 /* token.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18E0E719B8F00D62E90 /* token.cc */; };
 		89A88E260E71A6C90043BA31 /* top.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1900E719B8F00D62E90 /* top.cc */; };
@@ -192,16 +192,16 @@
 		89F23C810E78D5B2006B2466 /* variables.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF19F0E719B8F00D62E90 /* variables.cc */; };
 		89F23C820E78D5B2006B2466 /* zone.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1A20E719B8F00D62E90 /* zone.cc */; };
 		89F23C8E0E78D5B6006B2466 /* shell.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1B50E719C0900D62E90 /* shell.cc */; };
-		89F23C970E78D5E3006B2466 /* assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF0FE0E719B8F00D62E90 /* assembler-arm.cc */; };
-		89F23C980E78D5E7006B2466 /* builtins-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1090E719B8F00D62E90 /* builtins-arm.cc */; };
-		89F23C990E78D5E9006B2466 /* codegen-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1140E719B8F00D62E90 /* codegen-arm.cc */; };
-		89F23C9A0E78D5EC006B2466 /* cpu-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1230E719B8F00D62E90 /* cpu-arm.cc */; };
-		89F23C9B0E78D5EE006B2466 /* disasm-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12A0E719B8F00D62E90 /* disasm-arm.cc */; };
-		89F23C9C0E78D5F1006B2466 /* frames-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1370E719B8F00D62E90 /* frames-arm.cc */; };
-		89F23C9D0E78D5FB006B2466 /* ic-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1490E719B8F00D62E90 /* ic-arm.cc */; };
-		89F23C9E0E78D5FD006B2466 /* macro-assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1540E719B8F00D62E90 /* macro-assembler-arm.cc */; };
-		89F23C9F0E78D604006B2466 /* simulator-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF17D0E719B8F00D62E90 /* simulator-arm.cc */; };
-		89F23CA00E78D609006B2466 /* stub-cache-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18A0E719B8F00D62E90 /* stub-cache-arm.cc */; };
+		89F23C970E78D5E3006B2466 /* arm/assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF0FE0E719B8F00D62E90 /* arm/assembler-arm.cc */; };
+		89F23C980E78D5E7006B2466 /* arm/builtins-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1090E719B8F00D62E90 /* arm/builtins-arm.cc */; };
+		89F23C990E78D5E9006B2466 /* arm/codegen-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1140E719B8F00D62E90 /* arm/codegen-arm.cc */; };
+		89F23C9A0E78D5EC006B2466 /* arm/cpu-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1230E719B8F00D62E90 /* arm/cpu-arm.cc */; };
+		89F23C9B0E78D5EE006B2466 /* arm/disasm-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF12A0E719B8F00D62E90 /* arm/disasm-arm.cc */; };
+		89F23C9C0E78D5F1006B2466 /* arm/frames-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1370E719B8F00D62E90 /* arm/frames-arm.cc */; };
+		89F23C9D0E78D5FB006B2466 /* arm/ic-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1490E719B8F00D62E90 /* arm/ic-arm.cc */; };
+		89F23C9E0E78D5FD006B2466 /* arm/macro-assembler-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF1540E719B8F00D62E90 /* arm/macro-assembler-arm.cc */; };
+		89F23C9F0E78D604006B2466 /* arm/simulator-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF17D0E719B8F00D62E90 /* arm/simulator-arm.cc */; };
+		89F23CA00E78D609006B2466 /* arm/stub-cache-arm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 897FF18A0E719B8F00D62E90 /* arm/stub-cache-arm.cc */; };
 		89FB0E3A0F8E533F00B04B3C /* d8-posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = 89FB0E360F8E531900B04B3C /* d8-posix.cc */; };
 		9F92FAA90F8F28AD0089F02C /* func-name-inferrer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9F92FAA70F8F28AD0089F02C /* func-name-inferrer.cc */; };
 		9F92FAAA0F8F28AD0089F02C /* func-name-inferrer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9F92FAA70F8F28AD0089F02C /* func-name-inferrer.cc */; };
@@ -269,18 +269,19 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		58950D4E0F55514900F3E8BA /* jump-target-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "jump-target-arm.cc"; sourceTree = "<group>"; };
-		58950D4F0F55514900F3E8BA /* jump-target-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "jump-target-ia32.cc"; sourceTree = "<group>"; };
+		58242A1E0FA1F14D00BD6F59 /* json-delay.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "json-delay.js"; sourceTree = "<group>"; };
+		58950D4E0F55514900F3E8BA /* arm/jump-target-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/jump-target-arm.cc"; sourceTree = "<group>"; };
+		58950D4F0F55514900F3E8BA /* ia32/jump-target-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/jump-target-ia32.cc"; sourceTree = "<group>"; };
 		58950D500F55514900F3E8BA /* jump-target.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "jump-target.cc"; sourceTree = "<group>"; };
 		58950D510F55514900F3E8BA /* jump-target.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "jump-target.h"; sourceTree = "<group>"; };
-		58950D520F55514900F3E8BA /* register-allocator-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "register-allocator-arm.cc"; sourceTree = "<group>"; };
-		58950D530F55514900F3E8BA /* register-allocator-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "register-allocator-ia32.cc"; sourceTree = "<group>"; };
+		58950D520F55514900F3E8BA /* arm/register-allocator-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/register-allocator-arm.cc"; sourceTree = "<group>"; };
+		58950D530F55514900F3E8BA /* ia32/register-allocator-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/register-allocator-ia32.cc"; sourceTree = "<group>"; };
 		58950D540F55514900F3E8BA /* register-allocator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "register-allocator.cc"; sourceTree = "<group>"; };
 		58950D550F55514900F3E8BA /* register-allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "register-allocator.h"; sourceTree = "<group>"; };
-		58950D560F55514900F3E8BA /* virtual-frame-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "virtual-frame-arm.cc"; sourceTree = "<group>"; };
-		58950D570F55514900F3E8BA /* virtual-frame-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "virtual-frame-arm.h"; sourceTree = "<group>"; };
-		58950D580F55514900F3E8BA /* virtual-frame-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "virtual-frame-ia32.cc"; sourceTree = "<group>"; };
-		58950D590F55514900F3E8BA /* virtual-frame-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "virtual-frame-ia32.h"; sourceTree = "<group>"; };
+		58950D560F55514900F3E8BA /* arm/virtual-frame-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/virtual-frame-arm.cc"; sourceTree = "<group>"; };
+		58950D570F55514900F3E8BA /* arm/virtual-frame-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/virtual-frame-arm.h"; sourceTree = "<group>"; };
+		58950D580F55514900F3E8BA /* ia32/virtual-frame-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/virtual-frame-ia32.cc"; sourceTree = "<group>"; };
+		58950D590F55514900F3E8BA /* ia32/virtual-frame-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/virtual-frame-ia32.h"; sourceTree = "<group>"; };
 		58950D5A0F55514900F3E8BA /* virtual-frame.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "virtual-frame.cc"; sourceTree = "<group>"; };
 		58950D5B0F55514900F3E8BA /* virtual-frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "virtual-frame.h"; sourceTree = "<group>"; };
 		8900116B0E71CA2300F91F35 /* libraries.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libraries.cc; sourceTree = "<group>"; };
@@ -299,8 +300,8 @@
 		89495E470E79FC23001F68C3 /* compilation-cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "compilation-cache.h"; sourceTree = "<group>"; };
 		8956B6CD0F5D86570033B5A2 /* debug-agent.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "debug-agent.cc"; sourceTree = "<group>"; };
 		8956B6CE0F5D86570033B5A2 /* debug-agent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "debug-agent.h"; sourceTree = "<group>"; };
-		8964482B0E9C00F700E7C516 /* codegen-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "codegen-ia32.h"; sourceTree = "<group>"; };
-		896448BC0E9D530500E7C516 /* codegen-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "codegen-arm.h"; sourceTree = "<group>"; };
+		8964482B0E9C00F700E7C516 /* ia32/codegen-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/codegen-ia32.h"; sourceTree = "<group>"; };
+		896448BC0E9D530500E7C516 /* arm/codegen-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/codegen-arm.h"; sourceTree = "<group>"; };
 		8970F2F00E719FB2006AE7B5 /* libv8.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libv8.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		897F767A0E71B4CC007ACF34 /* v8_shell */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = v8_shell; sourceTree = BUILT_PRODUCTS_DIR; };
 		897FF0D40E719A8500D62E90 /* v8-debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "v8-debug.h"; sourceTree = "<group>"; };
@@ -314,20 +315,20 @@
 		897FF0FA0E719B8F00D62E90 /* api.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = api.cc; sourceTree = "<group>"; };
 		897FF0FB0E719B8F00D62E90 /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = api.h; sourceTree = "<group>"; };
 		897FF0FC0E719B8F00D62E90 /* arguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arguments.h; sourceTree = "<group>"; };
-		897FF0FD0E719B8F00D62E90 /* assembler-arm-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "assembler-arm-inl.h"; sourceTree = "<group>"; };
-		897FF0FE0E719B8F00D62E90 /* assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "assembler-arm.cc"; sourceTree = "<group>"; };
-		897FF0FF0E719B8F00D62E90 /* assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "assembler-arm.h"; sourceTree = "<group>"; };
-		897FF1000E719B8F00D62E90 /* assembler-ia32-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "assembler-ia32-inl.h"; sourceTree = "<group>"; };
-		897FF1010E719B8F00D62E90 /* assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "assembler-ia32.cc"; sourceTree = "<group>"; };
-		897FF1020E719B8F00D62E90 /* assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "assembler-ia32.h"; sourceTree = "<group>"; };
+		897FF0FD0E719B8F00D62E90 /* arm/assembler-arm-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/assembler-arm-inl.h"; sourceTree = "<group>"; };
+		897FF0FE0E719B8F00D62E90 /* arm/assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/assembler-arm.cc"; sourceTree = "<group>"; };
+		897FF0FF0E719B8F00D62E90 /* arm/assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/assembler-arm.h"; sourceTree = "<group>"; };
+		897FF1000E719B8F00D62E90 /* ia32/assembler-ia32-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/assembler-ia32-inl.h"; sourceTree = "<group>"; };
+		897FF1010E719B8F00D62E90 /* ia32/assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/assembler-ia32.cc"; sourceTree = "<group>"; };
+		897FF1020E719B8F00D62E90 /* ia32/assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/assembler-ia32.h"; sourceTree = "<group>"; };
 		897FF1030E719B8F00D62E90 /* assembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cc; sourceTree = "<group>"; };
 		897FF1040E719B8F00D62E90 /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = "<group>"; };
 		897FF1050E719B8F00D62E90 /* ast.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ast.cc; sourceTree = "<group>"; };
 		897FF1060E719B8F00D62E90 /* ast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast.h; sourceTree = "<group>"; };
 		897FF1070E719B8F00D62E90 /* bootstrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bootstrapper.cc; sourceTree = "<group>"; };
 		897FF1080E719B8F00D62E90 /* bootstrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bootstrapper.h; sourceTree = "<group>"; };
-		897FF1090E719B8F00D62E90 /* builtins-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "builtins-arm.cc"; sourceTree = "<group>"; };
-		897FF10A0E719B8F00D62E90 /* builtins-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "builtins-ia32.cc"; sourceTree = "<group>"; };
+		897FF1090E719B8F00D62E90 /* arm/builtins-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/builtins-arm.cc"; sourceTree = "<group>"; };
+		897FF10A0E719B8F00D62E90 /* ia32/builtins-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/builtins-ia32.cc"; sourceTree = "<group>"; };
 		897FF10B0E719B8F00D62E90 /* builtins.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtins.cc; sourceTree = "<group>"; };
 		897FF10C0E719B8F00D62E90 /* builtins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = builtins.h; sourceTree = "<group>"; };
 		897FF10D0E719B8F00D62E90 /* char-predicates-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "char-predicates-inl.h"; sourceTree = "<group>"; };
@@ -337,14 +338,14 @@
 		897FF1110E719B8F00D62E90 /* code-stubs.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "code-stubs.cc"; sourceTree = "<group>"; };
 		897FF1120E719B8F00D62E90 /* code-stubs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "code-stubs.h"; sourceTree = "<group>"; };
 		897FF1130E719B8F00D62E90 /* code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = code.h; sourceTree = "<group>"; };
-		897FF1140E719B8F00D62E90 /* codegen-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "codegen-arm.cc"; sourceTree = "<group>"; };
-		897FF1150E719B8F00D62E90 /* codegen-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "codegen-ia32.cc"; sourceTree = "<group>"; };
+		897FF1140E719B8F00D62E90 /* arm/codegen-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/codegen-arm.cc"; sourceTree = "<group>"; };
+		897FF1150E719B8F00D62E90 /* ia32/codegen-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/codegen-ia32.cc"; sourceTree = "<group>"; };
 		897FF1160E719B8F00D62E90 /* codegen-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "codegen-inl.h"; sourceTree = "<group>"; };
 		897FF1170E719B8F00D62E90 /* codegen.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = codegen.cc; sourceTree = "<group>"; };
 		897FF1180E719B8F00D62E90 /* codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codegen.h; sourceTree = "<group>"; };
 		897FF1190E719B8F00D62E90 /* compiler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cc; sourceTree = "<group>"; };
 		897FF11A0E719B8F00D62E90 /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = "<group>"; };
-		897FF11B0E719B8F00D62E90 /* constants-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "constants-arm.h"; sourceTree = "<group>"; };
+		897FF11B0E719B8F00D62E90 /* arm/constants-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/constants-arm.h"; sourceTree = "<group>"; };
 		897FF11C0E719B8F00D62E90 /* contexts.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = contexts.cc; sourceTree = "<group>"; };
 		897FF11D0E719B8F00D62E90 /* contexts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = contexts.h; sourceTree = "<group>"; };
 		897FF11E0E719B8F00D62E90 /* conversions-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "conversions-inl.h"; sourceTree = "<group>"; };
@@ -352,15 +353,15 @@
 		897FF1200E719B8F00D62E90 /* conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conversions.h; sourceTree = "<group>"; };
 		897FF1210E719B8F00D62E90 /* counters.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = counters.cc; sourceTree = "<group>"; };
 		897FF1220E719B8F00D62E90 /* counters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = counters.h; sourceTree = "<group>"; };
-		897FF1230E719B8F00D62E90 /* cpu-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cpu-arm.cc"; sourceTree = "<group>"; };
-		897FF1240E719B8F00D62E90 /* cpu-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cpu-ia32.cc"; sourceTree = "<group>"; };
+		897FF1230E719B8F00D62E90 /* arm/cpu-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/cpu-arm.cc"; sourceTree = "<group>"; };
+		897FF1240E719B8F00D62E90 /* ia32/cpu-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/cpu-ia32.cc"; sourceTree = "<group>"; };
 		897FF1250E719B8F00D62E90 /* cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu.h; sourceTree = "<group>"; };
 		897FF1260E719B8F00D62E90 /* dateparser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dateparser.cc; sourceTree = "<group>"; };
 		897FF1270E719B8F00D62E90 /* dateparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dateparser.h; sourceTree = "<group>"; };
 		897FF1280E719B8F00D62E90 /* debug.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cc; sourceTree = "<group>"; };
 		897FF1290E719B8F00D62E90 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = "<group>"; };
-		897FF12A0E719B8F00D62E90 /* disasm-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "disasm-arm.cc"; sourceTree = "<group>"; };
-		897FF12B0E719B8F00D62E90 /* disasm-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "disasm-ia32.cc"; sourceTree = "<group>"; };
+		897FF12A0E719B8F00D62E90 /* arm/disasm-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/disasm-arm.cc"; sourceTree = "<group>"; };
+		897FF12B0E719B8F00D62E90 /* ia32/disasm-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/disasm-ia32.cc"; sourceTree = "<group>"; };
 		897FF12C0E719B8F00D62E90 /* disasm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disasm.h; sourceTree = "<group>"; };
 		897FF12D0E719B8F00D62E90 /* disassembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassembler.cc; sourceTree = "<group>"; };
 		897FF12E0E719B8F00D62E90 /* disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassembler.h; sourceTree = "<group>"; };
@@ -371,10 +372,10 @@
 		897FF1330E719B8F00D62E90 /* factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = factory.h; sourceTree = "<group>"; };
 		897FF1350E719B8F00D62E90 /* flags.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flags.cc; sourceTree = "<group>"; };
 		897FF1360E719B8F00D62E90 /* flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flags.h; sourceTree = "<group>"; };
-		897FF1370E719B8F00D62E90 /* frames-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "frames-arm.cc"; sourceTree = "<group>"; };
-		897FF1380E719B8F00D62E90 /* frames-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "frames-arm.h"; sourceTree = "<group>"; };
-		897FF1390E719B8F00D62E90 /* frames-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "frames-ia32.cc"; sourceTree = "<group>"; };
-		897FF13A0E719B8F00D62E90 /* frames-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "frames-ia32.h"; sourceTree = "<group>"; };
+		897FF1370E719B8F00D62E90 /* arm/frames-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/frames-arm.cc"; sourceTree = "<group>"; };
+		897FF1380E719B8F00D62E90 /* arm/frames-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/frames-arm.h"; sourceTree = "<group>"; };
+		897FF1390E719B8F00D62E90 /* ia32/frames-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/frames-ia32.cc"; sourceTree = "<group>"; };
+		897FF13A0E719B8F00D62E90 /* ia32/frames-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/frames-ia32.h"; sourceTree = "<group>"; };
 		897FF13B0E719B8F00D62E90 /* frames-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "frames-inl.h"; sourceTree = "<group>"; };
 		897FF13C0E719B8F00D62E90 /* frames.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frames.cc; sourceTree = "<group>"; };
 		897FF13D0E719B8F00D62E90 /* frames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frames.h; sourceTree = "<group>"; };
@@ -389,8 +390,8 @@
 		897FF1460E719B8F00D62E90 /* heap-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "heap-inl.h"; sourceTree = "<group>"; };
 		897FF1470E719B8F00D62E90 /* heap.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = heap.cc; sourceTree = "<group>"; };
 		897FF1480E719B8F00D62E90 /* heap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = heap.h; sourceTree = "<group>"; };
-		897FF1490E719B8F00D62E90 /* ic-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ic-arm.cc"; sourceTree = "<group>"; };
-		897FF14A0E719B8F00D62E90 /* ic-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ic-ia32.cc"; sourceTree = "<group>"; };
+		897FF1490E719B8F00D62E90 /* arm/ic-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/ic-arm.cc"; sourceTree = "<group>"; };
+		897FF14A0E719B8F00D62E90 /* ia32/ic-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/ic-ia32.cc"; sourceTree = "<group>"; };
 		897FF14B0E719B8F00D62E90 /* ic-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ic-inl.h"; sourceTree = "<group>"; };
 		897FF14C0E719B8F00D62E90 /* ic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ic.cc; sourceTree = "<group>"; };
 		897FF14D0E719B8F00D62E90 /* ic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ic.h; sourceTree = "<group>"; };
@@ -400,10 +401,10 @@
 		897FF1510E719B8F00D62E90 /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = list.h; sourceTree = "<group>"; };
 		897FF1520E719B8F00D62E90 /* log.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = log.cc; sourceTree = "<group>"; };
 		897FF1530E719B8F00D62E90 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
-		897FF1540E719B8F00D62E90 /* macro-assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "macro-assembler-arm.cc"; sourceTree = "<group>"; };
-		897FF1550E719B8F00D62E90 /* macro-assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "macro-assembler-arm.h"; sourceTree = "<group>"; };
-		897FF1560E719B8F00D62E90 /* macro-assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "macro-assembler-ia32.cc"; sourceTree = "<group>"; };
-		897FF1570E719B8F00D62E90 /* macro-assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "macro-assembler-ia32.h"; sourceTree = "<group>"; };
+		897FF1540E719B8F00D62E90 /* arm/macro-assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/macro-assembler-arm.cc"; sourceTree = "<group>"; };
+		897FF1550E719B8F00D62E90 /* arm/macro-assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/macro-assembler-arm.h"; sourceTree = "<group>"; };
+		897FF1560E719B8F00D62E90 /* ia32/macro-assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/macro-assembler-ia32.cc"; sourceTree = "<group>"; };
+		897FF1570E719B8F00D62E90 /* ia32/macro-assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/macro-assembler-ia32.h"; sourceTree = "<group>"; };
 		897FF1580E719B8F00D62E90 /* macro-assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "macro-assembler.h"; sourceTree = "<group>"; };
 		897FF1590E719B8F00D62E90 /* mark-compact.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "mark-compact.cc"; sourceTree = "<group>"; };
 		897FF15A0E719B8F00D62E90 /* mark-compact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mark-compact.h"; sourceTree = "<group>"; };
@@ -441,10 +442,10 @@
 		897FF17A0E719B8F00D62E90 /* serialize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialize.cc; sourceTree = "<group>"; };
 		897FF17B0E719B8F00D62E90 /* serialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialize.h; sourceTree = "<group>"; };
 		897FF17C0E719B8F00D62E90 /* shell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shell.h; sourceTree = "<group>"; };
-		897FF17D0E719B8F00D62E90 /* simulator-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "simulator-arm.cc"; sourceTree = "<group>"; };
-		897FF17E0E719B8F00D62E90 /* simulator-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "simulator-arm.h"; sourceTree = "<group>"; };
-		897FF17F0E719B8F00D62E90 /* simulator-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "simulator-ia32.cc"; sourceTree = "<group>"; };
-		897FF1800E719B8F00D62E90 /* simulator-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "simulator-ia32.h"; sourceTree = "<group>"; };
+		897FF17D0E719B8F00D62E90 /* arm/simulator-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/simulator-arm.cc"; sourceTree = "<group>"; };
+		897FF17E0E719B8F00D62E90 /* arm/simulator-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/simulator-arm.h"; sourceTree = "<group>"; };
+		897FF17F0E719B8F00D62E90 /* ia32/simulator-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/simulator-ia32.cc"; sourceTree = "<group>"; };
+		897FF1800E719B8F00D62E90 /* ia32/simulator-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/simulator-ia32.h"; sourceTree = "<group>"; };
 		897FF1810E719B8F00D62E90 /* smart-pointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "smart-pointer.h"; sourceTree = "<group>"; };
 		897FF1820E719B8F00D62E90 /* snapshot-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "snapshot-common.cc"; sourceTree = "<group>"; };
 		897FF1830E719B8F00D62E90 /* snapshot-empty.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "snapshot-empty.cc"; sourceTree = "<group>"; };
@@ -454,8 +455,8 @@
 		897FF1870E719B8F00D62E90 /* spaces.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spaces.h; sourceTree = "<group>"; };
 		897FF1880E719B8F00D62E90 /* string-stream.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "string-stream.cc"; sourceTree = "<group>"; };
 		897FF1890E719B8F00D62E90 /* string-stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "string-stream.h"; sourceTree = "<group>"; };
-		897FF18A0E719B8F00D62E90 /* stub-cache-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "stub-cache-arm.cc"; sourceTree = "<group>"; };
-		897FF18B0E719B8F00D62E90 /* stub-cache-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "stub-cache-ia32.cc"; sourceTree = "<group>"; };
+		897FF18A0E719B8F00D62E90 /* arm/stub-cache-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/stub-cache-arm.cc"; sourceTree = "<group>"; };
+		897FF18B0E719B8F00D62E90 /* ia32/stub-cache-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/stub-cache-ia32.cc"; sourceTree = "<group>"; };
 		897FF18C0E719B8F00D62E90 /* stub-cache.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "stub-cache.cc"; sourceTree = "<group>"; };
 		897FF18D0E719B8F00D62E90 /* stub-cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stub-cache.h"; sourceTree = "<group>"; };
 		897FF18E0E719B8F00D62E90 /* token.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = token.cc; sourceTree = "<group>"; };
@@ -495,17 +496,17 @@
 		897FF1B50E719C0900D62E90 /* shell.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shell.cc; sourceTree = "<group>"; };
 		897FF1B60E719C2300D62E90 /* js2c.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = js2c.py; sourceTree = "<group>"; };
 		897FF1B70E719C2E00D62E90 /* macros.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = macros.py; path = ../src/macros.py; sourceTree = "<group>"; };
-		898BD20C0EF6CC850068B00A /* debug-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "debug-arm.cc"; sourceTree = "<group>"; };
-		898BD20D0EF6CC850068B00A /* debug-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "debug-ia32.cc"; sourceTree = "<group>"; };
+		898BD20C0EF6CC850068B00A /* arm/debug-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/debug-arm.cc"; sourceTree = "<group>"; };
+		898BD20D0EF6CC850068B00A /* ia32/debug-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/debug-ia32.cc"; sourceTree = "<group>"; };
 		89A15C630EE4661A00B48DEB /* bytecodes-irregexp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "bytecodes-irregexp.h"; sourceTree = "<group>"; };
 		89A15C660EE4665300B48DEB /* interpreter-irregexp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "interpreter-irregexp.cc"; sourceTree = "<group>"; };
 		89A15C670EE4665300B48DEB /* interpreter-irregexp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "interpreter-irregexp.h"; sourceTree = "<group>"; };
 		89A15C680EE4665300B48DEB /* jsregexp-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "jsregexp-inl.h"; sourceTree = "<group>"; };
 		89A15C6D0EE466A900B48DEB /* platform-freebsd.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "platform-freebsd.cc"; sourceTree = "<group>"; };
-		89A15C700EE466D000B48DEB /* regexp-macro-assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "regexp-macro-assembler-arm.cc"; sourceTree = "<group>"; };
-		89A15C710EE466D000B48DEB /* regexp-macro-assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "regexp-macro-assembler-arm.h"; sourceTree = "<group>"; };
-		89A15C720EE466D000B48DEB /* regexp-macro-assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "regexp-macro-assembler-ia32.cc"; sourceTree = "<group>"; };
-		89A15C730EE466D000B48DEB /* regexp-macro-assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "regexp-macro-assembler-ia32.h"; sourceTree = "<group>"; };
+		89A15C700EE466D000B48DEB /* arm/regexp-macro-assembler-arm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "arm/regexp-macro-assembler-arm.cc"; sourceTree = "<group>"; };
+		89A15C710EE466D000B48DEB /* arm/regexp-macro-assembler-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm/regexp-macro-assembler-arm.h"; sourceTree = "<group>"; };
+		89A15C720EE466D000B48DEB /* ia32/regexp-macro-assembler-ia32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ia32/regexp-macro-assembler-ia32.cc"; sourceTree = "<group>"; };
+		89A15C730EE466D000B48DEB /* ia32/regexp-macro-assembler-ia32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ia32/regexp-macro-assembler-ia32.h"; sourceTree = "<group>"; };
 		89A15C740EE466D000B48DEB /* regexp-macro-assembler-irregexp-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "regexp-macro-assembler-irregexp-inl.h"; sourceTree = "<group>"; };
 		89A15C750EE466D000B48DEB /* regexp-macro-assembler-irregexp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "regexp-macro-assembler-irregexp.cc"; sourceTree = "<group>"; };
 		89A15C760EE466D000B48DEB /* regexp-macro-assembler-irregexp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "regexp-macro-assembler-irregexp.h"; sourceTree = "<group>"; };
@@ -621,20 +622,20 @@
 				897FF0FB0E719B8F00D62E90 /* api.h */,
 				893986D40F29020C007D5254 /* apiutils.h */,
 				897FF0FC0E719B8F00D62E90 /* arguments.h */,
-				897FF0FD0E719B8F00D62E90 /* assembler-arm-inl.h */,
-				897FF0FE0E719B8F00D62E90 /* assembler-arm.cc */,
-				897FF0FF0E719B8F00D62E90 /* assembler-arm.h */,
-				897FF1000E719B8F00D62E90 /* assembler-ia32-inl.h */,
-				897FF1010E719B8F00D62E90 /* assembler-ia32.cc */,
-				897FF1020E719B8F00D62E90 /* assembler-ia32.h */,
+				897FF0FD0E719B8F00D62E90 /* arm/assembler-arm-inl.h */,
+				897FF0FE0E719B8F00D62E90 /* arm/assembler-arm.cc */,
+				897FF0FF0E719B8F00D62E90 /* arm/assembler-arm.h */,
+				897FF1000E719B8F00D62E90 /* ia32/assembler-ia32-inl.h */,
+				897FF1010E719B8F00D62E90 /* ia32/assembler-ia32.cc */,
+				897FF1020E719B8F00D62E90 /* ia32/assembler-ia32.h */,
 				897FF1030E719B8F00D62E90 /* assembler.cc */,
 				897FF1040E719B8F00D62E90 /* assembler.h */,
 				897FF1050E719B8F00D62E90 /* ast.cc */,
 				897FF1060E719B8F00D62E90 /* ast.h */,
 				897FF1070E719B8F00D62E90 /* bootstrapper.cc */,
 				897FF1080E719B8F00D62E90 /* bootstrapper.h */,
-				897FF1090E719B8F00D62E90 /* builtins-arm.cc */,
-				897FF10A0E719B8F00D62E90 /* builtins-ia32.cc */,
+				897FF1090E719B8F00D62E90 /* arm/builtins-arm.cc */,
+				897FF10A0E719B8F00D62E90 /* ia32/builtins-ia32.cc */,
 				897FF10B0E719B8F00D62E90 /* builtins.cc */,
 				897FF10C0E719B8F00D62E90 /* builtins.h */,
 				89A15C630EE4661A00B48DEB /* bytecodes-irregexp.h */,
@@ -645,10 +646,10 @@
 				897FF1110E719B8F00D62E90 /* code-stubs.cc */,
 				897FF1120E719B8F00D62E90 /* code-stubs.h */,
 				897FF1130E719B8F00D62E90 /* code.h */,
-				897FF1140E719B8F00D62E90 /* codegen-arm.cc */,
-				896448BC0E9D530500E7C516 /* codegen-arm.h */,
-				897FF1150E719B8F00D62E90 /* codegen-ia32.cc */,
-				8964482B0E9C00F700E7C516 /* codegen-ia32.h */,
+				897FF1140E719B8F00D62E90 /* arm/codegen-arm.cc */,
+				896448BC0E9D530500E7C516 /* arm/codegen-arm.h */,
+				897FF1150E719B8F00D62E90 /* ia32/codegen-ia32.cc */,
+				8964482B0E9C00F700E7C516 /* ia32/codegen-ia32.h */,
 				897FF1160E719B8F00D62E90 /* codegen-inl.h */,
 				897FF1170E719B8F00D62E90 /* codegen.cc */,
 				897FF1180E719B8F00D62E90 /* codegen.h */,
@@ -656,7 +657,7 @@
 				89495E470E79FC23001F68C3 /* compilation-cache.h */,
 				897FF1190E719B8F00D62E90 /* compiler.cc */,
 				897FF11A0E719B8F00D62E90 /* compiler.h */,
-				897FF11B0E719B8F00D62E90 /* constants-arm.h */,
+				897FF11B0E719B8F00D62E90 /* arm/constants-arm.h */,
 				897FF11C0E719B8F00D62E90 /* contexts.cc */,
 				897FF11D0E719B8F00D62E90 /* contexts.h */,
 				897FF11E0E719B8F00D62E90 /* conversions-inl.h */,
@@ -664,20 +665,20 @@
 				897FF1200E719B8F00D62E90 /* conversions.h */,
 				897FF1210E719B8F00D62E90 /* counters.cc */,
 				897FF1220E719B8F00D62E90 /* counters.h */,
-				897FF1230E719B8F00D62E90 /* cpu-arm.cc */,
-				897FF1240E719B8F00D62E90 /* cpu-ia32.cc */,
+				897FF1230E719B8F00D62E90 /* arm/cpu-arm.cc */,
+				897FF1240E719B8F00D62E90 /* ia32/cpu-ia32.cc */,
 				897FF1250E719B8F00D62E90 /* cpu.h */,
 				893A722A0F7B4A3200303DD2 /* dateparser-inl.h */,
 				897FF1260E719B8F00D62E90 /* dateparser.cc */,
 				897FF1270E719B8F00D62E90 /* dateparser.h */,
-				898BD20C0EF6CC850068B00A /* debug-arm.cc */,
-				898BD20D0EF6CC850068B00A /* debug-ia32.cc */,
+				898BD20C0EF6CC850068B00A /* arm/debug-arm.cc */,
+				898BD20D0EF6CC850068B00A /* ia32/debug-ia32.cc */,
 				897FF1280E719B8F00D62E90 /* debug.cc */,
 				897FF1290E719B8F00D62E90 /* debug.h */,
 				8956B6CD0F5D86570033B5A2 /* debug-agent.cc */,
 				8956B6CE0F5D86570033B5A2 /* debug-agent.h */,
-				897FF12A0E719B8F00D62E90 /* disasm-arm.cc */,
-				897FF12B0E719B8F00D62E90 /* disasm-ia32.cc */,
+				897FF12A0E719B8F00D62E90 /* arm/disasm-arm.cc */,
+				897FF12B0E719B8F00D62E90 /* ia32/disasm-ia32.cc */,
 				897FF12C0E719B8F00D62E90 /* disasm.h */,
 				897FF12D0E719B8F00D62E90 /* disassembler.cc */,
 				897FF12E0E719B8F00D62E90 /* disassembler.h */,
@@ -689,10 +690,10 @@
 				89471C7F0EB23EE400B6874B /* flag-definitions.h */,
 				897FF1350E719B8F00D62E90 /* flags.cc */,
 				897FF1360E719B8F00D62E90 /* flags.h */,
-				897FF1370E719B8F00D62E90 /* frames-arm.cc */,
-				897FF1380E719B8F00D62E90 /* frames-arm.h */,
-				897FF1390E719B8F00D62E90 /* frames-ia32.cc */,
-				897FF13A0E719B8F00D62E90 /* frames-ia32.h */,
+				897FF1370E719B8F00D62E90 /* arm/frames-arm.cc */,
+				897FF1380E719B8F00D62E90 /* arm/frames-arm.h */,
+				897FF1390E719B8F00D62E90 /* ia32/frames-ia32.cc */,
+				897FF13A0E719B8F00D62E90 /* ia32/frames-ia32.h */,
 				897FF13B0E719B8F00D62E90 /* frames-inl.h */,
 				897FF13C0E719B8F00D62E90 /* frames.cc */,
 				897FF13D0E719B8F00D62E90 /* frames.h */,
@@ -709,8 +710,8 @@
 				897FF1460E719B8F00D62E90 /* heap-inl.h */,
 				897FF1470E719B8F00D62E90 /* heap.cc */,
 				897FF1480E719B8F00D62E90 /* heap.h */,
-				897FF1490E719B8F00D62E90 /* ic-arm.cc */,
-				897FF14A0E719B8F00D62E90 /* ic-ia32.cc */,
+				897FF1490E719B8F00D62E90 /* arm/ic-arm.cc */,
+				897FF14A0E719B8F00D62E90 /* ia32/ic-ia32.cc */,
 				897FF14B0E719B8F00D62E90 /* ic-inl.h */,
 				897FF14C0E719B8F00D62E90 /* ic.cc */,
 				897FF14D0E719B8F00D62E90 /* ic.h */,
@@ -719,18 +720,18 @@
 				89A15C680EE4665300B48DEB /* jsregexp-inl.h */,
 				897FF14E0E719B8F00D62E90 /* jsregexp.cc */,
 				897FF14F0E719B8F00D62E90 /* jsregexp.h */,
-				58950D4E0F55514900F3E8BA /* jump-target-arm.cc */,
-				58950D4F0F55514900F3E8BA /* jump-target-ia32.cc */,
+				58950D4E0F55514900F3E8BA /* arm/jump-target-arm.cc */,
+				58950D4F0F55514900F3E8BA /* ia32/jump-target-ia32.cc */,
 				58950D500F55514900F3E8BA /* jump-target.cc */,
 				58950D510F55514900F3E8BA /* jump-target.h */,
 				897FF1500E719B8F00D62E90 /* list-inl.h */,
 				897FF1510E719B8F00D62E90 /* list.h */,
 				897FF1520E719B8F00D62E90 /* log.cc */,
 				897FF1530E719B8F00D62E90 /* log.h */,
-				897FF1540E719B8F00D62E90 /* macro-assembler-arm.cc */,
-				897FF1550E719B8F00D62E90 /* macro-assembler-arm.h */,
-				897FF1560E719B8F00D62E90 /* macro-assembler-ia32.cc */,
-				897FF1570E719B8F00D62E90 /* macro-assembler-ia32.h */,
+				897FF1540E719B8F00D62E90 /* arm/macro-assembler-arm.cc */,
+				897FF1550E719B8F00D62E90 /* arm/macro-assembler-arm.h */,
+				897FF1560E719B8F00D62E90 /* ia32/macro-assembler-ia32.cc */,
+				897FF1570E719B8F00D62E90 /* ia32/macro-assembler-ia32.h */,
 				897FF1580E719B8F00D62E90 /* macro-assembler.h */,
 				897FF1590E719B8F00D62E90 /* mark-compact.cc */,
 				897FF15A0E719B8F00D62E90 /* mark-compact.h */,
@@ -758,10 +759,10 @@
 				897FF16C0E719B8F00D62E90 /* prettyprinter.h */,
 				897FF16D0E719B8F00D62E90 /* property.cc */,
 				897FF16E0E719B8F00D62E90 /* property.h */,
-				89A15C700EE466D000B48DEB /* regexp-macro-assembler-arm.cc */,
-				89A15C710EE466D000B48DEB /* regexp-macro-assembler-arm.h */,
-				89A15C720EE466D000B48DEB /* regexp-macro-assembler-ia32.cc */,
-				89A15C730EE466D000B48DEB /* regexp-macro-assembler-ia32.h */,
+				89A15C700EE466D000B48DEB /* arm/regexp-macro-assembler-arm.cc */,
+				89A15C710EE466D000B48DEB /* arm/regexp-macro-assembler-arm.h */,
+				89A15C720EE466D000B48DEB /* ia32/regexp-macro-assembler-ia32.cc */,
+				89A15C730EE466D000B48DEB /* ia32/regexp-macro-assembler-ia32.h */,
 				89A15C740EE466D000B48DEB /* regexp-macro-assembler-irregexp-inl.h */,
 				89A15C750EE466D000B48DEB /* regexp-macro-assembler-irregexp.cc */,
 				89A15C760EE466D000B48DEB /* regexp-macro-assembler-irregexp.h */,
@@ -771,8 +772,8 @@
 				89A15C7A0EE466D000B48DEB /* regexp-macro-assembler.h */,
 				8944AD0E0F1D4D3A0028D560 /* regexp-stack.cc */,
 				8944AD0F0F1D4D3A0028D560 /* regexp-stack.h */,
-				58950D520F55514900F3E8BA /* register-allocator-arm.cc */,
-				58950D530F55514900F3E8BA /* register-allocator-ia32.cc */,
+				58950D520F55514900F3E8BA /* arm/register-allocator-arm.cc */,
+				58950D530F55514900F3E8BA /* ia32/register-allocator-ia32.cc */,
 				893A722D0F7B4A7100303DD2 /* register-allocator-inl.h */,
 				58950D540F55514900F3E8BA /* register-allocator.cc */,
 				58950D550F55514900F3E8BA /* register-allocator.h */,
@@ -790,10 +791,10 @@
 				897FF17A0E719B8F00D62E90 /* serialize.cc */,
 				897FF17B0E719B8F00D62E90 /* serialize.h */,
 				897FF17C0E719B8F00D62E90 /* shell.h */,
-				897FF17D0E719B8F00D62E90 /* simulator-arm.cc */,
-				897FF17E0E719B8F00D62E90 /* simulator-arm.h */,
-				897FF17F0E719B8F00D62E90 /* simulator-ia32.cc */,
-				897FF1800E719B8F00D62E90 /* simulator-ia32.h */,
+				897FF17D0E719B8F00D62E90 /* arm/simulator-arm.cc */,
+				897FF17E0E719B8F00D62E90 /* arm/simulator-arm.h */,
+				897FF17F0E719B8F00D62E90 /* ia32/simulator-ia32.cc */,
+				897FF1800E719B8F00D62E90 /* ia32/simulator-ia32.h */,
 				897FF1810E719B8F00D62E90 /* smart-pointer.h */,
 				897FF1820E719B8F00D62E90 /* snapshot-common.cc */,
 				897FF1830E719B8F00D62E90 /* snapshot-empty.cc */,
@@ -803,8 +804,8 @@
 				897FF1870E719B8F00D62E90 /* spaces.h */,
 				897FF1880E719B8F00D62E90 /* string-stream.cc */,
 				897FF1890E719B8F00D62E90 /* string-stream.h */,
-				897FF18A0E719B8F00D62E90 /* stub-cache-arm.cc */,
-				897FF18B0E719B8F00D62E90 /* stub-cache-ia32.cc */,
+				897FF18A0E719B8F00D62E90 /* arm/stub-cache-arm.cc */,
+				897FF18B0E719B8F00D62E90 /* ia32/stub-cache-ia32.cc */,
 				897FF18C0E719B8F00D62E90 /* stub-cache.cc */,
 				897FF18D0E719B8F00D62E90 /* stub-cache.h */,
 				897FF18E0E719B8F00D62E90 /* token.cc */,
@@ -826,10 +827,10 @@
 				897FF19E0E719B8F00D62E90 /* v8threads.h */,
 				897FF19F0E719B8F00D62E90 /* variables.cc */,
 				897FF1A00E719B8F00D62E90 /* variables.h */,
-				58950D560F55514900F3E8BA /* virtual-frame-arm.cc */,
-				58950D570F55514900F3E8BA /* virtual-frame-arm.h */,
-				58950D580F55514900F3E8BA /* virtual-frame-ia32.cc */,
-				58950D590F55514900F3E8BA /* virtual-frame-ia32.h */,
+				58950D560F55514900F3E8BA /* arm/virtual-frame-arm.cc */,
+				58950D570F55514900F3E8BA /* arm/virtual-frame-arm.h */,
+				58950D580F55514900F3E8BA /* ia32/virtual-frame-ia32.cc */,
+				58950D590F55514900F3E8BA /* ia32/virtual-frame-ia32.h */,
 				58950D5A0F55514900F3E8BA /* virtual-frame.cc */,
 				58950D5B0F55514900F3E8BA /* virtual-frame.h */,
 				897FF1A10E719B8F00D62E90 /* zone-inl.h */,
@@ -846,6 +847,7 @@
 				897FF1A70E719BC100D62E90 /* array.js */,
 				897FF1A80E719BC100D62E90 /* date-delay.js */,
 				897FF1A90E719BC100D62E90 /* debug-delay.js */,
+				58242A1E0FA1F14D00BD6F59 /* json-delay.js */,
 				897FF1AA0E719BC100D62E90 /* math.js */,
 				897FF1AB0E719BC100D62E90 /* messages.js */,
 				897FF1AC0E719BC100D62E90 /* mirror-delay.js */,
@@ -1059,7 +1061,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "set -ex\nJS_FILES=\"runtime.js\"\\\n\" v8natives.js\"\\\n\" array.js\"\\\n\" string.js\"\\\n\" uri.js\"\\\n\" math.js\"\\\n\" messages.js\"\\\n\" apinatives.js\"\\\n\" debug-delay.js\"\\\n\" mirror-delay.js\"\\\n\" date-delay.js\"\\\n\" regexp-delay.js\"\\\n\" macros.py\"\n\nV8ROOT=\"${SRCROOT}/..\"\n\nSRC_DIR=\"${V8ROOT}/src\"\n\nNATIVE_JS_FILES=\"\"\n\nfor i in ${JS_FILES} ; do\n  NATIVE_JS_FILES+=\"${SRC_DIR}/${i} \"\ndone\n\nV8_GENERATED_SOURCES_DIR=\"${CONFIGURATION_TEMP_DIR}/generated\"\nmkdir -p \"${V8_GENERATED_SOURCES_DIR}\"\n\nLIBRARIES_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries.cc\"\nLIBRARIES_EMPTY_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries-empty.cc\"\n\npython \"${V8ROOT}/tools/js2c.py\" \\\n  \"${LIBRARIES_CC}.new\" \\\n  \"${LIBRARIES_EMPTY_CC}.new\" \\\n  \"CORE\" \\\n  ${NATIVE_JS_FILES}\n\n# Only use the new files if they're different from the existing files (if any),\n# preserving the existing files' timestamps when there are no changes.  This\n# minimizes unnecessary build activity for a no-change build.\n\nif ! diff -q \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\"\nelse\n  rm \"${LIBRARIES_CC}.new\"\nfi\n\nif ! diff -q \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\"\nelse\n  rm \"${LIBRARIES_EMPTY_CC}.new\"\nfi\n";
+			shellScript = "set -ex\nJS_FILES=\"runtime.js\"\\\n\" v8natives.js\"\\\n\" array.js\"\\\n\" string.js\"\\\n\" uri.js\"\\\n\" math.js\"\\\n\" messages.js\"\\\n\" apinatives.js\"\\\n\" debug-delay.js\"\\\n\" mirror-delay.js\"\\\n\" date-delay.js\"\\\n\" json-delay.js\"\\\n\" regexp-delay.js\"\\\n\" macros.py\"\n\nV8ROOT=\"${SRCROOT}/..\"\n\nSRC_DIR=\"${V8ROOT}/src\"\n\nNATIVE_JS_FILES=\"\"\n\nfor i in ${JS_FILES} ; do\n  NATIVE_JS_FILES+=\"${SRC_DIR}/${i} \"\ndone\n\nV8_GENERATED_SOURCES_DIR=\"${CONFIGURATION_TEMP_DIR}/generated\"\nmkdir -p \"${V8_GENERATED_SOURCES_DIR}\"\n\nLIBRARIES_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries.cc\"\nLIBRARIES_EMPTY_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries-empty.cc\"\n\npython \"${V8ROOT}/tools/js2c.py\" \\\n  \"${LIBRARIES_CC}.new\" \\\n  \"${LIBRARIES_EMPTY_CC}.new\" \\\n  \"CORE\" \\\n  ${NATIVE_JS_FILES}\n\n# Only use the new files if they're different from the existing files (if any),\n# preserving the existing files' timestamps when there are no changes.  This\n# minimizes unnecessary build activity for a no-change build.\n\nif ! diff -q \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\"\nelse\n  rm \"${LIBRARIES_CC}.new\"\nfi\n\nif ! diff -q \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\"\nelse\n  rm \"${LIBRARIES_EMPTY_CC}.new\"\nfi\n";
 		};
 		89F23C3D0E78D5B2006B2466 /* ShellScript */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -1072,7 +1074,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "set -ex\nJS_FILES=\"runtime.js\"\\\n\" v8natives.js\"\\\n\" array.js\"\\\n\" string.js\"\\\n\" uri.js\"\\\n\" math.js\"\\\n\" messages.js\"\\\n\" apinatives.js\"\\\n\" debug-delay.js\"\\\n\" mirror-delay.js\"\\\n\" date-delay.js\"\\\n\" regexp-delay.js\"\\\n\" macros.py\"\n\nV8ROOT=\"${SRCROOT}/..\"\n\nSRC_DIR=\"${V8ROOT}/src\"\n\nNATIVE_JS_FILES=\"\"\n\nfor i in ${JS_FILES} ; do\n  NATIVE_JS_FILES+=\"${SRC_DIR}/${i} \"\ndone\n\nV8_GENERATED_SOURCES_DIR=\"${CONFIGURATION_TEMP_DIR}/generated\"\nmkdir -p \"${V8_GENERATED_SOURCES_DIR}\"\n\nLIBRARIES_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries.cc\"\nLIBRARIES_EMPTY_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries-empty.cc\"\n\npython \"${V8ROOT}/tools/js2c.py\" \\\n  \"${LIBRARIES_CC}.new\" \\\n  \"${LIBRARIES_EMPTY_CC}.new\" \\\n  \"CORE\" \\\n  ${NATIVE_JS_FILES}\n\n# Only use the new files if they're different from the existing files (if any),\n# preserving the existing files' timestamps when there are no changes.  This\n# minimizes unnecessary build activity for a no-change build.\n\nif ! diff -q \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\"\nelse\n  rm \"${LIBRARIES_CC}.new\"\nfi\n\nif ! diff -q \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\"\nelse\n  rm \"${LIBRARIES_EMPTY_CC}.new\"\nfi\n";
+			shellScript = "set -ex\nJS_FILES=\"runtime.js\"\\\n\" v8natives.js\"\\\n\" array.js\"\\\n\" string.js\"\\\n\" uri.js\"\\\n\" math.js\"\\\n\" messages.js\"\\\n\" apinatives.js\"\\\n\" debug-delay.js\"\\\n\" mirror-delay.js\"\\\n\" date-delay.js\"\\\n\" json-delay.js\"\\\n\" regexp-delay.js\"\\\n\" macros.py\"\n\nV8ROOT=\"${SRCROOT}/..\"\n\nSRC_DIR=\"${V8ROOT}/src\"\n\nNATIVE_JS_FILES=\"\"\n\nfor i in ${JS_FILES} ; do\n  NATIVE_JS_FILES+=\"${SRC_DIR}/${i} \"\ndone\n\nV8_GENERATED_SOURCES_DIR=\"${CONFIGURATION_TEMP_DIR}/generated\"\nmkdir -p \"${V8_GENERATED_SOURCES_DIR}\"\n\nLIBRARIES_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries.cc\"\nLIBRARIES_EMPTY_CC=\"${V8_GENERATED_SOURCES_DIR}/libraries-empty.cc\"\n\npython \"${V8ROOT}/tools/js2c.py\" \\\n  \"${LIBRARIES_CC}.new\" \\\n  \"${LIBRARIES_EMPTY_CC}.new\" \\\n  \"CORE\" \\\n  ${NATIVE_JS_FILES}\n\n# Only use the new files if they're different from the existing files (if any),\n# preserving the existing files' timestamps when there are no changes.  This\n# minimizes unnecessary build activity for a no-change build.\n\nif ! diff -q \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_CC}.new\" \"${LIBRARIES_CC}\"\nelse\n  rm \"${LIBRARIES_CC}.new\"\nfi\n\nif ! diff -q \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\" >& /dev/null ; then\n  mv \"${LIBRARIES_EMPTY_CC}.new\" \"${LIBRARIES_EMPTY_CC}\"\nelse\n  rm \"${LIBRARIES_EMPTY_CC}.new\"\nfi\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -1095,48 +1097,48 @@
 				89A88DEC0E71A5FF0043BA31 /* accessors.cc in Sources */,
 				89A88DED0E71A6000043BA31 /* allocation.cc in Sources */,
 				89A88DEE0E71A6010043BA31 /* api.cc in Sources */,
-				89A88DEF0E71A60A0043BA31 /* assembler-ia32.cc in Sources */,
+				89A88DEF0E71A60A0043BA31 /* ia32/assembler-ia32.cc in Sources */,
 				89A88DF00E71A60A0043BA31 /* assembler.cc in Sources */,
 				89A88DF10E71A60B0043BA31 /* ast.cc in Sources */,
 				89A88DF20E71A60C0043BA31 /* bootstrapper.cc in Sources */,
-				89A88DF40E71A6160043BA31 /* builtins-ia32.cc in Sources */,
+				89A88DF40E71A6160043BA31 /* ia32/builtins-ia32.cc in Sources */,
 				89A88DF50E71A6170043BA31 /* builtins.cc in Sources */,
 				89A88DF60E71A61C0043BA31 /* checks.cc in Sources */,
 				893CCE640E71D83700357A03 /* code-stubs.cc in Sources */,
-				89A88DF70E71A6240043BA31 /* codegen-ia32.cc in Sources */,
+				89A88DF70E71A6240043BA31 /* ia32/codegen-ia32.cc in Sources */,
 				89A88DF80E71A6260043BA31 /* codegen.cc in Sources */,
 				89495E480E79FC23001F68C3 /* compilation-cache.cc in Sources */,
 				89A88DF90E71A6430043BA31 /* compiler.cc in Sources */,
 				89A88DFA0E71A6440043BA31 /* contexts.cc in Sources */,
 				89A88DFB0E71A6440043BA31 /* conversions.cc in Sources */,
 				89A88DFC0E71A6460043BA31 /* counters.cc in Sources */,
-				89A88DFD0E71A6470043BA31 /* cpu-ia32.cc in Sources */,
+				89A88DFD0E71A6470043BA31 /* ia32/cpu-ia32.cc in Sources */,
 				89A88DFE0E71A6480043BA31 /* dateparser.cc in Sources */,
 				8956B6CF0F5D86730033B5A2 /* debug-agent.cc in Sources */,
-				898BD20E0EF6CC930068B00A /* debug-ia32.cc in Sources */,
+				898BD20E0EF6CC930068B00A /* ia32/debug-ia32.cc in Sources */,
 				89A88DFF0E71A6530043BA31 /* debug.cc in Sources */,
-				89A88E000E71A6540043BA31 /* disasm-ia32.cc in Sources */,
+				89A88E000E71A6540043BA31 /* ia32/disasm-ia32.cc in Sources */,
 				89A88E010E71A6550043BA31 /* disassembler.cc in Sources */,
 				89A88E020E71A65A0043BA31 /* dtoa-config.c in Sources */,
 				89A88E030E71A65B0043BA31 /* execution.cc in Sources */,
 				89A88E040E71A65D0043BA31 /* factory.cc in Sources */,
 				89A88E050E71A65D0043BA31 /* flags.cc in Sources */,
-				89A88E060E71A6600043BA31 /* frames-ia32.cc in Sources */,
+				89A88E060E71A6600043BA31 /* ia32/frames-ia32.cc in Sources */,
 				89A88E070E71A6610043BA31 /* frames.cc in Sources */,
 				9F92FAA90F8F28AD0089F02C /* func-name-inferrer.cc in Sources */,
 				89A88E080E71A6620043BA31 /* global-handles.cc in Sources */,
 				89A88E090E71A6640043BA31 /* handles.cc in Sources */,
 				89A88E0A0E71A6650043BA31 /* hashmap.cc in Sources */,
 				89A88E0B0E71A66C0043BA31 /* heap.cc in Sources */,
-				89A88E0C0E71A66D0043BA31 /* ic-ia32.cc in Sources */,
+				89A88E0C0E71A66D0043BA31 /* ia32/ic-ia32.cc in Sources */,
 				89A88E0D0E71A66E0043BA31 /* ic.cc in Sources */,
 				89A15C850EE4678B00B48DEB /* interpreter-irregexp.cc in Sources */,
 				89A88E0E0E71A66F0043BA31 /* jsregexp.cc in Sources */,
 				58950D5E0F55519800F3E8BA /* jump-target.cc in Sources */,
-				58950D5F0F55519D00F3E8BA /* jump-target-ia32.cc in Sources */,
+				58950D5F0F55519D00F3E8BA /* ia32/jump-target-ia32.cc in Sources */,
 				8900116C0E71CA2300F91F35 /* libraries.cc in Sources */,
 				89A88E0F0E71A6740043BA31 /* log.cc in Sources */,
-				89A88E100E71A6770043BA31 /* macro-assembler-ia32.cc in Sources */,
+				89A88E100E71A6770043BA31 /* ia32/macro-assembler-ia32.cc in Sources */,
 				89A88E110E71A6780043BA31 /* mark-compact.cc in Sources */,
 				89A88E120E71A67A0043BA31 /* messages.cc in Sources */,
 				89A88E130E71A6860043BA31 /* objects-debug.cc in Sources */,
@@ -1147,12 +1149,12 @@
 				89A88E160E71A68E0043BA31 /* platform-macos.cc in Sources */,
 				89A88E170E71A6950043BA31 /* prettyprinter.cc in Sources */,
 				89A88E180E71A6960043BA31 /* property.cc in Sources */,
-				89A15C7B0EE466EB00B48DEB /* regexp-macro-assembler-ia32.cc in Sources */,
+				89A15C7B0EE466EB00B48DEB /* ia32/regexp-macro-assembler-ia32.cc in Sources */,
 				89A15C830EE4675E00B48DEB /* regexp-macro-assembler-irregexp.cc in Sources */,
 				89A15C8A0EE467D100B48DEB /* regexp-macro-assembler-tracer.cc in Sources */,
 				89A15C810EE4674900B48DEB /* regexp-macro-assembler.cc in Sources */,
 				8944AD100F1D4D500028D560 /* regexp-stack.cc in Sources */,
-				58950D620F5551AF00F3E8BA /* register-allocator-ia32.cc in Sources */,
+				58950D620F5551AF00F3E8BA /* ia32/register-allocator-ia32.cc in Sources */,
 				58950D630F5551AF00F3E8BA /* register-allocator.cc in Sources */,
 				89A88E190E71A6970043BA31 /* rewriter.cc in Sources */,
 				89A88E1A0E71A69B0043BA31 /* runtime.cc in Sources */,
@@ -1164,7 +1166,7 @@
 				89A88E200E71A6B60043BA31 /* snapshot-empty.cc in Sources */,
 				89A88E210E71A6B70043BA31 /* spaces.cc in Sources */,
 				89A88E220E71A6BC0043BA31 /* string-stream.cc in Sources */,
-				89A88E230E71A6BE0043BA31 /* stub-cache-ia32.cc in Sources */,
+				89A88E230E71A6BE0043BA31 /* ia32/stub-cache-ia32.cc in Sources */,
 				89A88E240E71A6BF0043BA31 /* stub-cache.cc in Sources */,
 				89A88E250E71A6C20043BA31 /* token.cc in Sources */,
 				89A88E260E71A6C90043BA31 /* top.cc in Sources */,
@@ -1176,7 +1178,7 @@
 				89A88E2C0E71A6D20043BA31 /* v8threads.cc in Sources */,
 				89A88E2D0E71A6D50043BA31 /* variables.cc in Sources */,
 				58950D660F5551C200F3E8BA /* virtual-frame.cc in Sources */,
-				58950D670F5551C400F3E8BA /* virtual-frame-ia32.cc in Sources */,
+				58950D670F5551C400F3E8BA /* ia32/virtual-frame-ia32.cc in Sources */,
 				89A88E2E0E71A6D60043BA31 /* zone.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1196,48 +1198,48 @@
 				89F23C3F0E78D5B2006B2466 /* accessors.cc in Sources */,
 				89F23C400E78D5B2006B2466 /* allocation.cc in Sources */,
 				89F23C410E78D5B2006B2466 /* api.cc in Sources */,
-				89F23C970E78D5E3006B2466 /* assembler-arm.cc in Sources */,
+				89F23C970E78D5E3006B2466 /* arm/assembler-arm.cc in Sources */,
 				89F23C430E78D5B2006B2466 /* assembler.cc in Sources */,
 				89F23C440E78D5B2006B2466 /* ast.cc in Sources */,
 				89F23C450E78D5B2006B2466 /* bootstrapper.cc in Sources */,
-				89F23C980E78D5E7006B2466 /* builtins-arm.cc in Sources */,
+				89F23C980E78D5E7006B2466 /* arm/builtins-arm.cc in Sources */,
 				89F23C470E78D5B2006B2466 /* builtins.cc in Sources */,
 				89F23C480E78D5B2006B2466 /* checks.cc in Sources */,
 				89F23C490E78D5B2006B2466 /* code-stubs.cc in Sources */,
-				89F23C990E78D5E9006B2466 /* codegen-arm.cc in Sources */,
+				89F23C990E78D5E9006B2466 /* arm/codegen-arm.cc in Sources */,
 				89F23C4B0E78D5B2006B2466 /* codegen.cc in Sources */,
 				89495E490E79FC23001F68C3 /* compilation-cache.cc in Sources */,
 				89F23C4C0E78D5B2006B2466 /* compiler.cc in Sources */,
 				89F23C4D0E78D5B2006B2466 /* contexts.cc in Sources */,
 				89F23C4E0E78D5B2006B2466 /* conversions.cc in Sources */,
 				89F23C4F0E78D5B2006B2466 /* counters.cc in Sources */,
-				89F23C9A0E78D5EC006B2466 /* cpu-arm.cc in Sources */,
+				89F23C9A0E78D5EC006B2466 /* arm/cpu-arm.cc in Sources */,
 				89F23C510E78D5B2006B2466 /* dateparser.cc in Sources */,
 				894599A30F5D8729008DA8FB /* debug-agent.cc in Sources */,
-				898BD20F0EF6CC9A0068B00A /* debug-arm.cc in Sources */,
+				898BD20F0EF6CC9A0068B00A /* arm/debug-arm.cc in Sources */,
 				89F23C520E78D5B2006B2466 /* debug.cc in Sources */,
-				89F23C9B0E78D5EE006B2466 /* disasm-arm.cc in Sources */,
+				89F23C9B0E78D5EE006B2466 /* arm/disasm-arm.cc in Sources */,
 				89F23C540E78D5B2006B2466 /* disassembler.cc in Sources */,
 				89F23C550E78D5B2006B2466 /* dtoa-config.c in Sources */,
 				89F23C560E78D5B2006B2466 /* execution.cc in Sources */,
 				89F23C570E78D5B2006B2466 /* factory.cc in Sources */,
 				89F23C580E78D5B2006B2466 /* flags.cc in Sources */,
-				89F23C9C0E78D5F1006B2466 /* frames-arm.cc in Sources */,
+				89F23C9C0E78D5F1006B2466 /* arm/frames-arm.cc in Sources */,
 				89F23C5A0E78D5B2006B2466 /* frames.cc in Sources */,
 				9F92FAAA0F8F28AD0089F02C /* func-name-inferrer.cc in Sources */,
 				89F23C5B0E78D5B2006B2466 /* global-handles.cc in Sources */,
 				89F23C5C0E78D5B2006B2466 /* handles.cc in Sources */,
 				89F23C5D0E78D5B2006B2466 /* hashmap.cc in Sources */,
 				89F23C5E0E78D5B2006B2466 /* heap.cc in Sources */,
-				89F23C9D0E78D5FB006B2466 /* ic-arm.cc in Sources */,
+				89F23C9D0E78D5FB006B2466 /* arm/ic-arm.cc in Sources */,
 				89F23C600E78D5B2006B2466 /* ic.cc in Sources */,
 				890A13FE0EE9C47F00E49346 /* interpreter-irregexp.cc in Sources */,
 				89F23C610E78D5B2006B2466 /* jsregexp.cc in Sources */,
 				58950D600F5551A300F3E8BA /* jump-target.cc in Sources */,
-				58950D610F5551A400F3E8BA /* jump-target-arm.cc in Sources */,
+				58950D610F5551A400F3E8BA /* arm/jump-target-arm.cc in Sources */,
 				89F23C620E78D5B2006B2466 /* libraries.cc in Sources */,
 				89F23C630E78D5B2006B2466 /* log.cc in Sources */,
-				89F23C9E0E78D5FD006B2466 /* macro-assembler-arm.cc in Sources */,
+				89F23C9E0E78D5FD006B2466 /* arm/macro-assembler-arm.cc in Sources */,
 				89F23C650E78D5B2006B2466 /* mark-compact.cc in Sources */,
 				89F23C660E78D5B2006B2466 /* messages.cc in Sources */,
 				89F23C670E78D5B2006B2466 /* objects-debug.cc in Sources */,
@@ -1248,25 +1250,25 @@
 				89F23C6A0E78D5B2006B2466 /* platform-macos.cc in Sources */,
 				89F23C6B0E78D5B2006B2466 /* prettyprinter.cc in Sources */,
 				89F23C6C0E78D5B2006B2466 /* property.cc in Sources */,
-				890A14010EE9C4B000E49346 /* regexp-macro-assembler-arm.cc in Sources */,
+				890A14010EE9C4B000E49346 /* arm/regexp-macro-assembler-arm.cc in Sources */,
 				890A14020EE9C4B400E49346 /* regexp-macro-assembler-irregexp.cc in Sources */,
 				890A14030EE9C4B500E49346 /* regexp-macro-assembler-tracer.cc in Sources */,
 				890A14040EE9C4B700E49346 /* regexp-macro-assembler.cc in Sources */,
 				8944AD110F1D4D570028D560 /* regexp-stack.cc in Sources */,
 				58950D640F5551B500F3E8BA /* register-allocator.cc in Sources */,
-				58950D650F5551B600F3E8BA /* register-allocator-arm.cc in Sources */,
+				58950D650F5551B600F3E8BA /* arm/register-allocator-arm.cc in Sources */,
 				89F23C6D0E78D5B2006B2466 /* rewriter.cc in Sources */,
 				89F23C6E0E78D5B2006B2466 /* runtime.cc in Sources */,
 				89F23C6F0E78D5B2006B2466 /* scanner.cc in Sources */,
 				89F23C700E78D5B2006B2466 /* scopeinfo.cc in Sources */,
 				89F23C710E78D5B2006B2466 /* scopes.cc in Sources */,
 				89F23C720E78D5B2006B2466 /* serialize.cc in Sources */,
-				89F23C9F0E78D604006B2466 /* simulator-arm.cc in Sources */,
+				89F23C9F0E78D604006B2466 /* arm/simulator-arm.cc in Sources */,
 				89F23C730E78D5B2006B2466 /* snapshot-common.cc in Sources */,
 				89F23C740E78D5B2006B2466 /* snapshot-empty.cc in Sources */,
 				89F23C750E78D5B2006B2466 /* spaces.cc in Sources */,
 				89F23C760E78D5B2006B2466 /* string-stream.cc in Sources */,
-				89F23CA00E78D609006B2466 /* stub-cache-arm.cc in Sources */,
+				89F23CA00E78D609006B2466 /* arm/stub-cache-arm.cc in Sources */,
 				89F23C780E78D5B2006B2466 /* stub-cache.cc in Sources */,
 				89F23C790E78D5B2006B2466 /* token.cc in Sources */,
 				89F23C7A0E78D5B2006B2466 /* top.cc in Sources */,
@@ -1278,7 +1280,7 @@
 				89F23C800E78D5B2006B2466 /* v8threads.cc in Sources */,
 				89F23C810E78D5B2006B2466 /* variables.cc in Sources */,
 				58950D680F5551CB00F3E8BA /* virtual-frame.cc in Sources */,
-				58950D690F5551CE00F3E8BA /* virtual-frame-arm.cc in Sources */,
+				58950D690F5551CE00F3E8BA /* arm/virtual-frame-arm.cc in Sources */,
 				89F23C820E78D5B2006B2466 /* zone.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
diff --git a/tools/visual_studio/js2c.cmd b/tools/visual_studio/js2c.cmd
index b6a46a2..df5293b 100644
--- a/tools/visual_studio/js2c.cmd
+++ b/tools/visual_studio/js2c.cmd
@@ -3,4 +3,4 @@
 set TARGET_DIR=%2
 set PYTHON="..\..\..\third_party\python_24\python.exe"
 if not exist %PYTHON% set PYTHON=python.exe
-%PYTHON% ..\js2c.py %TARGET_DIR%\natives.cc %TARGET_DIR%\natives-empty.cc CORE %SOURCE_DIR%\macros.py %SOURCE_DIR%\runtime.js %SOURCE_DIR%\v8natives.js %SOURCE_DIR%\array.js %SOURCE_DIR%\string.js %SOURCE_DIR%\uri.js %SOURCE_DIR%\math.js %SOURCE_DIR%\messages.js %SOURCE_DIR%\apinatives.js %SOURCE_DIR%\debug-delay.js %SOURCE_DIR%\mirror-delay.js %SOURCE_DIR%\date-delay.js %SOURCE_DIR%\regexp-delay.js
+%PYTHON% ..\js2c.py %TARGET_DIR%\natives.cc %TARGET_DIR%\natives-empty.cc CORE %SOURCE_DIR%\macros.py %SOURCE_DIR%\runtime.js %SOURCE_DIR%\v8natives.js %SOURCE_DIR%\array.js %SOURCE_DIR%\string.js %SOURCE_DIR%\uri.js %SOURCE_DIR%\math.js %SOURCE_DIR%\messages.js %SOURCE_DIR%\apinatives.js %SOURCE_DIR%\debug-delay.js %SOURCE_DIR%\mirror-delay.js %SOURCE_DIR%\date-delay.js %SOURCE_DIR%\regexp-delay.js %SOURCE_DIR%\json-delay.js
diff --git a/tools/visual_studio/v8.vcproj b/tools/visual_studio/v8.vcproj
index 212fd07..c2f336e 100644
--- a/tools/visual_studio/v8.vcproj
+++ b/tools/visual_studio/v8.vcproj
@@ -163,6 +163,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\json-delay.js"
+				>
+			</File>
+			<File
 				RelativePath="..\..\src\runtime.js"
 				>
 			</File>
@@ -184,7 +188,7 @@
 						Name="VCCustomBuildTool"
 						Description="Processing js files..."
 						CommandLine=".\js2c.cmd ..\..\src &quot;$(IntDir)\DerivedSources&quot;"
-						AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js"
+						AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js;..\..\src\json-delay.js"
 						Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc"
 					/>
 				</FileConfiguration>
@@ -195,7 +199,7 @@
 						Name="VCCustomBuildTool"
 						Description="Processing js files..."
 						CommandLine=".\js2c.cmd ..\..\src &quot;$(IntDir)\DerivedSources&quot;"
-						AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js"
+						AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js;..\..\src\json-delay.js"
 						Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc"
 					/>
 				</FileConfiguration>
diff --git a/tools/visual_studio/v8_base.vcproj b/tools/visual_studio/v8_base.vcproj
index 776e628..43c970d 100644
--- a/tools/visual_studio/v8_base.vcproj
+++ b/tools/visual_studio/v8_base.vcproj
@@ -177,15 +177,15 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-ia32-inl.h"
+				RelativePath="..\..\src\ia32\assembler-ia32-inl.h"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-ia32.cc"
+				RelativePath="..\..\src\ia32\assembler-ia32.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-ia32.h"
+				RelativePath="..\..\src\ia32\assembler-ia32.h"
 				>
 			</File>
 			<File
@@ -221,7 +221,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\builtins-ia32.cc"
+				RelativePath="..\..\src\ia32\builtins-ia32.cc"
 				>
 			</File>
 			<File
@@ -265,11 +265,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\codegen-ia32.cc"
+				RelativePath="..\..\src\ia32\codegen-ia32.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\codegen-ia32.h"
+				RelativePath="..\..\src\ia32\codegen-ia32.h"
 				>
 			</File>
 			<File
@@ -329,7 +329,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\cpu-ia32.cc"
+				RelativePath="..\..\src\ia32\cpu-ia32.cc"
 				>
 			</File>
 			<File
@@ -353,7 +353,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\debug-ia32.cc"
+				RelativePath="..\..\src\ia32\debug-ia32.cc"
 				>
 			</File>
 			<File
@@ -397,11 +397,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\frames-ia32.cc"
+				RelativePath="..\..\src\ia32\frames-ia32.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\frames-ia32.h"
+				RelativePath="..\..\src\ia32\frames-ia32.h"
 				>
 			</File>
 			<File
@@ -469,7 +469,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\ic-ia32.cc"
+				RelativePath="..\..\src\ia32\ic-ia32.cc"
 				>
 			</File>
 			<File
@@ -505,7 +505,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\jump-target-ia32.cc"
+				RelativePath="..\..\src\ia32\jump-target-ia32.cc"
 				>
 			</File>
 			<File
@@ -537,11 +537,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\macro-assembler-ia32.cc"
+				RelativePath="..\..\src\ia32\macro-assembler-ia32.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\macro-assembler-ia32.h"
+				RelativePath="..\..\src\ia32\macro-assembler-ia32.h"
 				>
 			</File>
 			<File
@@ -645,11 +645,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\regexp-macro-assembler-ia32.cc"
+				RelativePath="..\..\src\ia32\regexp-macro-assembler-ia32.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\regexp-macro-assembler-ia32.h"
+				RelativePath="..\..\src\ia32\regexp-macro-assembler-ia32.h"
 				>
 			</File>
 			<File
@@ -689,7 +689,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\register-allocator-ia32.cc"
+				RelativePath="..\..\src\ia32\register-allocator-ia32.cc"
 				>
 			</File>
 			<File
@@ -773,7 +773,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\stub-cache-ia32.cc"
+				RelativePath="..\..\src\ia32\stub-cache-ia32.cc"
 				>
 			</File>
 			<File
@@ -861,7 +861,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\virtual-frame-ia32.h"
+				RelativePath="..\..\src\ia32\virtual-frame-ia32.h"
 				>
 			</File>
 			<File
@@ -869,7 +869,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\virtual-frame-ia32.cc"
+				RelativePath="..\..\src\ia32\virtual-frame-ia32.cc"
 				>
 			</File>
 			<File
@@ -888,7 +888,7 @@
 				Name="third party"
 				>
 				<File
-					RelativePath="..\..\src\disasm-ia32.cc"
+					RelativePath="..\..\src\ia32\disasm-ia32.cc"
 					>
 				</File>
 				<File
diff --git a/tools/visual_studio/v8_base_arm.vcproj b/tools/visual_studio/v8_base_arm.vcproj
index 04ed230..954ebe2 100644
--- a/tools/visual_studio/v8_base_arm.vcproj
+++ b/tools/visual_studio/v8_base_arm.vcproj
@@ -177,15 +177,15 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-arm-inl.h"
+				RelativePath="..\..\src\arm\assembler-arm-inl.h"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-arm.cc"
+				RelativePath="..\..\src\arm\assembler-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\assembler-arm.h"
+				RelativePath="..\..\src\arm\assembler-arm.h"
 				>
 			</File>
 			<File
@@ -221,7 +221,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\builtins-arm.cc"
+				RelativePath="..\..\src\arm\builtins-arm.cc"
 				>
 			</File>
 			<File
@@ -265,11 +265,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\codegen-arm.cc"
+				RelativePath="..\..\src\arm\codegen-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\codegen-arm.h"
+				RelativePath="..\..\src\arm\codegen-arm.h"
 				>
 			</File>
 			<File
@@ -301,7 +301,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\constants-arm.h"
+				RelativePath="..\..\src\arm\constants-arm.h"
 				>
 			</File>
 			<File
@@ -333,7 +333,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\cpu-arm.cc"
+				RelativePath="..\..\src\arm\cpu-arm.cc"
 				>
 			</File>
 			<File
@@ -357,7 +357,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\debug-arm.cc"
+				RelativePath="..\..\src\arm\debug-arm.cc"
 				>
 			</File>
 			<File
@@ -401,11 +401,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\frames-arm.cc"
+				RelativePath="..\..\src\arm\frames-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\frames-arm.h"
+				RelativePath="..\..\src\arm\frames-arm.h"
 				>
 			</File>
 			<File
@@ -473,7 +473,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\ic-arm.cc"
+				RelativePath="..\..\src\arm\ic-arm.cc"
 				>
 			</File>
 			<File
@@ -509,7 +509,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\jump-target-arm.cc"
+				RelativePath="..\..\src\arm\jump-target-arm.cc"
 				>
 			</File>
 			<File
@@ -541,11 +541,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\macro-assembler-arm.cc"
+				RelativePath="..\..\src\arm\macro-assembler-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\macro-assembler-arm.h"
+				RelativePath="..\..\src\arm\macro-assembler-arm.h"
 				>
 			</File>
 			<File
@@ -649,11 +649,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\regexp-macro-assembler-arm.cc"
+				RelativePath="..\..\src\arm\regexp-macro-assembler-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\regexp-macro-assembler-arm.h"
+				RelativePath="..\..\src\arm\regexp-macro-assembler-arm.h"
 				>
 			</File>
 			<File
@@ -693,7 +693,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\register-allocator-arm.cc"
+				RelativePath="..\..\src\arm\register-allocator-arm.cc"
 				>
 			</File>
 			<File
@@ -757,11 +757,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\simulator-arm.cc"
+				RelativePath="..\..\src\arm\simulator-arm.cc"
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\simulator-arm.h"
+				RelativePath="..\..\src\arm\simulator-arm.h"
 				>
 			</File>
 			<File
@@ -785,7 +785,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\stub-cache-arm.cc"
+				RelativePath="..\..\src\arm\stub-cache-arm.cc"
 				>
 			</File>
 			<File
@@ -873,7 +873,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\virtual-frame-arm.h"
+				RelativePath="..\..\src\arm\virtual-frame-arm.h"
 				>
 			</File>
 			<File
@@ -881,7 +881,7 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\src\virtual-frame-arm.cc"
+				RelativePath="..\..\src\arm\virtual-frame-arm.cc"
 				>
 			</File>
 			<File
@@ -900,7 +900,7 @@
 				Name="third party"
 				>
 				<File
-					RelativePath="..\..\src\disasm-arm.cc"
+					RelativePath="..\..\src\arm\disasm-arm.cc"
 					>
 				</File>
 				<File