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