Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/src/runtime/runtime-interpreter.cc b/src/runtime/runtime-interpreter.cc
index d061a49..7150a8b 100644
--- a/src/runtime/runtime-interpreter.cc
+++ b/src/runtime/runtime-interpreter.cc
@@ -4,115 +4,18 @@
#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());
@@ -130,7 +33,7 @@
RUNTIME_FUNCTION(Runtime_InterpreterTypeOf) {
- SealHandleScope shs(isolate);
+ HandleScope shs(isolate);
DCHECK_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
return Object::cast(*Object::TypeOf(isolate, x));
@@ -147,55 +50,121 @@
shared, context, static_cast<PretenureFlag>(pretenured_flag));
}
+namespace {
-RUNTIME_FUNCTION(Runtime_InterpreterForInPrepare) {
- HandleScope scope(isolate);
+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);
+ }
+
+ // Print accumulator.
+ os << " [ accumulator" << kArrowDirection;
+ accumulator->ShortPrint();
+ os << " ]" << std::endl;
+
+ // 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;
+
+ // 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;
+ }
+ }
+ }
+ 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(JSReceiver, receiver, 0);
-
- Object* property_names = Runtime_GetPropertyNamesFast(
- 1, Handle<Object>::cast(receiver).location(), isolate);
- if (isolate->has_pending_exception()) {
- return property_names;
- }
-
- Handle<Object> cache_type(property_names, isolate);
- Handle<FixedArray> cache_array;
- int cache_length;
-
- 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();
-
- 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);
- }
- }
-
- 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;
+ CONVERT_ARG_HANDLE_CHECKED(Object, message, 0);
+ isolate->thread_local_top()->pending_message_obj_ = *message;
+ return isolate->heap()->undefined_value();
}
} // namespace internal