Revert "Upgrade to 5.0.71.48"

This reverts commit 8389745919cae02139ddc085a63c00d024269cf2.

Change-Id: Ic5c75c8b3ddaf795972372fbc863a514862953c1
diff --git a/src/runtime/runtime-interpreter.cc b/src/runtime/runtime-interpreter.cc
index 7150a8b..d061a49 100644
--- a/src/runtime/runtime-interpreter.cc
+++ b/src/runtime/runtime-interpreter.cc
@@ -4,18 +4,115 @@
 
 #include "src/runtime/runtime-utils.h"
 
-#include <iomanip>
-
 #include "src/arguments.h"
-#include "src/frames-inl.h"
-#include "src/interpreter/bytecode-array-iterator.h"
-#include "src/interpreter/bytecodes.h"
 #include "src/isolate-inl.h"
-#include "src/ostreams.h"
 
 namespace v8 {
 namespace internal {
 
+
+RUNTIME_FUNCTION(Runtime_InterpreterEquals) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::Equals(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterNotEquals) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::Equals(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(!result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterLessThan) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::LessThan(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterGreaterThan) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::GreaterThan(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterLessThanOrEqual) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::LessThanOrEqual(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterGreaterThanOrEqual) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
+  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
+  Maybe<bool> result = Object::GreaterThanOrEqual(x, y);
+  if (result.IsJust()) {
+    return isolate->heap()->ToBoolean(result.FromJust());
+  } else {
+    return isolate->heap()->exception();
+  }
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterStrictEquals) {
+  SealHandleScope shs(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_CHECKED(Object, x, 0);
+  CONVERT_ARG_CHECKED(Object, y, 1);
+  return isolate->heap()->ToBoolean(x->StrictEquals(y));
+}
+
+
+RUNTIME_FUNCTION(Runtime_InterpreterStrictNotEquals) {
+  SealHandleScope shs(isolate);
+  DCHECK_EQ(2, args.length());
+  CONVERT_ARG_CHECKED(Object, x, 0);
+  CONVERT_ARG_CHECKED(Object, y, 1);
+  return isolate->heap()->ToBoolean(!x->StrictEquals(y));
+}
+
+
 RUNTIME_FUNCTION(Runtime_InterpreterToBoolean) {
   SealHandleScope shs(isolate);
   DCHECK_EQ(1, args.length());
@@ -33,7 +130,7 @@
 
 
 RUNTIME_FUNCTION(Runtime_InterpreterTypeOf) {
-  HandleScope shs(isolate);
+  SealHandleScope shs(isolate);
   DCHECK_EQ(1, args.length());
   CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
   return Object::cast(*Object::TypeOf(isolate, x));
@@ -50,121 +147,55 @@
       shared, context, static_cast<PretenureFlag>(pretenured_flag));
 }
 
-namespace {
 
-void PrintRegisters(std::ostream& os, bool is_input,
-                    Handle<BytecodeArray> bytecode_array, int bytecode_offset,
-                    Handle<Object> accumulator) {
-  static const int kRegFieldWidth = static_cast<int>(strlen("accumulator"));
-  static const char* kInputColourCode = "\033[0;36m";
-  static const char* kOutputColourCode = "\033[0;35m";
-  static const char* kNormalColourCode = "\033[0;m";
-  const char* kArrowDirection = is_input ? " -> " : " <- ";
-  if (FLAG_log_colour) {
-    os << (is_input ? kInputColourCode : kOutputColourCode);
+RUNTIME_FUNCTION(Runtime_InterpreterForInPrepare) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(1, args.length());
+  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0);
+
+  Object* property_names = Runtime_GetPropertyNamesFast(
+      1, Handle<Object>::cast(receiver).location(), isolate);
+  if (isolate->has_pending_exception()) {
+    return property_names;
   }
 
-  // Print accumulator.
-  os << "      [ accumulator" << kArrowDirection;
-  accumulator->ShortPrint();
-  os << " ]" << std::endl;
+  Handle<Object> cache_type(property_names, isolate);
+  Handle<FixedArray> cache_array;
+  int cache_length;
 
-  // Find the location of the register file.
-  JavaScriptFrameIterator frame_iterator(bytecode_array->GetIsolate());
-  JavaScriptFrame* frame = frame_iterator.frame();
-  Address register_file =
-      frame->fp() + InterpreterFrameConstants::kRegisterFilePointerFromFp;
+  Handle<Map> receiver_map = handle(receiver->map(), isolate);
+  if (cache_type->IsMap()) {
+    Handle<Map> cache_type_map =
+        handle(Handle<Map>::cast(cache_type)->map(), isolate);
+    DCHECK(cache_type_map.is_identical_to(isolate->factory()->meta_map()));
+    int enum_length = cache_type_map->EnumLength();
+    DescriptorArray* descriptors = receiver_map->instance_descriptors();
+    if (enum_length > 0 && descriptors->HasEnumCache()) {
+      cache_array = handle(descriptors->GetEnumCache(), isolate);
+      cache_length = cache_array->length();
+    } else {
+      cache_array = isolate->factory()->empty_fixed_array();
+      cache_length = 0;
+    }
+  } else {
+    cache_array = Handle<FixedArray>::cast(cache_type);
+    cache_length = cache_array->length();
 
-  // Print the registers.
-  interpreter::BytecodeArrayIterator bytecode_iterator(bytecode_array);
-  bytecode_iterator.set_current_offset(
-      bytecode_offset - BytecodeArray::kHeaderSize + kHeapObjectTag);
-  interpreter::Bytecode bytecode = bytecode_iterator.current_bytecode();
-  int operand_count = interpreter::Bytecodes::NumberOfOperands(bytecode);
-  for (int operand_index = 0; operand_index < operand_count; operand_index++) {
-    interpreter::OperandType operand_type =
-        interpreter::Bytecodes::GetOperandType(bytecode, operand_index);
-    bool should_print =
-        is_input
-            ? interpreter::Bytecodes::IsRegisterInputOperandType(operand_type)
-            : interpreter::Bytecodes::IsRegisterOutputOperandType(operand_type);
-    if (should_print) {
-      interpreter::Register first_reg =
-          bytecode_iterator.GetRegisterOperand(operand_index);
-      int range = bytecode_iterator.GetRegisterOperandRange(operand_index);
-      for (int reg_index = first_reg.index();
-           reg_index < first_reg.index() + range; reg_index++) {
-        Address reg_location = register_file - reg_index * kPointerSize;
-        Object* reg_object = Memory::Object_at(reg_location);
-        os << "      [ " << std::setw(kRegFieldWidth)
-           << interpreter::Register(reg_index).ToString(
-                  bytecode_array->parameter_count())
-           << kArrowDirection;
-        reg_object->ShortPrint(os);
-        os << " ]" << std::endl;
-      }
+    STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
+    if (receiver_map->instance_type() == JS_PROXY_TYPE) {
+      // Zero indicates proxy
+      cache_type = Handle<Object>(Smi::FromInt(0), isolate);
+    } else {
+      // One entails slow check
+      cache_type = Handle<Object>(Smi::FromInt(1), isolate);
     }
   }
-  if (FLAG_log_colour) {
-    os << kNormalColourCode;
-  }
-}
 
-}  // namespace
-
-RUNTIME_FUNCTION(Runtime_InterpreterTraceBytecodeEntry) {
-  SealHandleScope shs(isolate);
-  DCHECK_EQ(3, args.length());
-  CONVERT_ARG_HANDLE_CHECKED(BytecodeArray, bytecode_array, 0);
-  CONVERT_SMI_ARG_CHECKED(bytecode_offset, 1);
-  CONVERT_ARG_HANDLE_CHECKED(Object, accumulator, 2);
-  OFStream os(stdout);
-
-  // Print bytecode.
-  const uint8_t* bytecode_address =
-      reinterpret_cast<const uint8_t*>(*bytecode_array) + bytecode_offset;
-  Vector<char> buf = Vector<char>::New(50);
-  SNPrintF(buf, "%p", bytecode_address);
-  os << " -> " << buf.start() << " (" << bytecode_offset << ") : ";
-  interpreter::Bytecodes::Decode(os, bytecode_address,
-                                 bytecode_array->parameter_count());
-  os << std::endl;
-
-  // Print all input registers and accumulator.
-  PrintRegisters(os, true, bytecode_array, bytecode_offset, accumulator);
-
-  os << std::flush;
-  return isolate->heap()->undefined_value();
-}
-
-RUNTIME_FUNCTION(Runtime_InterpreterTraceBytecodeExit) {
-  SealHandleScope shs(isolate);
-  DCHECK_EQ(3, args.length());
-  CONVERT_ARG_HANDLE_CHECKED(BytecodeArray, bytecode_array, 0);
-  CONVERT_SMI_ARG_CHECKED(bytecode_offset, 1);
-  CONVERT_ARG_HANDLE_CHECKED(Object, accumulator, 2);
-  OFStream os(stdout);
-
-  // Print all output registers and accumulator.
-  PrintRegisters(os, false, bytecode_array, bytecode_offset, accumulator);
-  os << std::flush;
-  return isolate->heap()->undefined_value();
-}
-
-RUNTIME_FUNCTION(Runtime_InterpreterClearPendingMessage) {
-  SealHandleScope shs(isolate);
-  DCHECK_EQ(0, args.length());
-  Object* message = isolate->thread_local_top()->pending_message_obj_;
-  isolate->clear_pending_message();
-  return message;
-}
-
-RUNTIME_FUNCTION(Runtime_InterpreterSetPendingMessage) {
-  SealHandleScope shs(isolate);
-  DCHECK_EQ(1, args.length());
-  CONVERT_ARG_HANDLE_CHECKED(Object, message, 0);
-  isolate->thread_local_top()->pending_message_obj_ = *message;
-  return isolate->heap()->undefined_value();
+  Handle<FixedArray> result = isolate->factory()->NewFixedArray(3);
+  result->set(0, *cache_type);
+  result->set(1, *cache_array);
+  result->set(2, Smi::FromInt(cache_length));
+  return *result;
 }
 
 }  // namespace internal