| Index: src/x64/codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/codegen-x64.cc (revision 2286)
|
| +++ src/x64/codegen-x64.cc (working copy)
|
| @@ -2301,7 +2301,8 @@
|
| // the target, with an implicit promise that it will be written to again
|
| // before it is read.
|
| // TODO(X64): Implement TakeValue optimization.
|
| - if (false && literal != NULL || (right_var != NULL && right_var != var)) {
|
| + if (false) {
|
| + // if (literal != NULL || (right_var != NULL && right_var != var)) {
|
| // target.TakeValue(NOT_INSIDE_TYPEOF);
|
| } else {
|
| target.GetValue(NOT_INSIDE_TYPEOF);
|
| @@ -3342,7 +3343,9 @@
|
|
|
|
|
| void CodeGenerator::GenerateFastCharCodeAt(ZoneList<Expression*>* a) {
|
| - UNIMPLEMENTED();
|
| + // TODO(X64): Implement this function.
|
| + // Ignore arguments and return undefined, to signal failure.
|
| + frame_->Push(Factory::undefined_value());
|
| }
|
|
|
|
|
| @@ -3371,10 +3374,27 @@
|
| }
|
|
|
|
|
| -void CodeGenerator::GenerateLog(ZoneList<Expression*>* a) {
|
| - UNIMPLEMENTED();
|
| +void CodeGenerator::GenerateLog(ZoneList<Expression*>* args) {
|
| + // Conditionally generate a log call.
|
| + // Args:
|
| + // 0 (literal string): The type of logging (corresponds to the flags).
|
| + // This is used to determine whether or not to generate the log call.
|
| + // 1 (string): Format string. Access the string at argument index 2
|
| + // with '%2s' (see Logger::LogRuntime for all the formats).
|
| + // 2 (array): Arguments to the format string.
|
| + ASSERT_EQ(args->length(), 3);
|
| +#ifdef ENABLE_LOGGING_AND_PROFILING
|
| + if (ShouldGenerateLog(args->at(0))) {
|
| + Load(args->at(1));
|
| + Load(args->at(2));
|
| + frame_->CallRuntime(Runtime::kLog, 2);
|
| + }
|
| +#endif
|
| + // Finally, we're expected to leave a value on the top of the stack.
|
| + frame_->Push(Factory::undefined_value());
|
| }
|
|
|
| +
|
| void CodeGenerator::GenerateObjectEquals(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 2);
|
|
|
| @@ -3446,9 +3466,29 @@
|
|
|
|
|
| void CodeGenerator::GenerateValueOf(ZoneList<Expression*>* args) {
|
| - UNIMPLEMENTED();
|
| + ASSERT(args->length() == 1);
|
| + JumpTarget leave;
|
| + Load(args->at(0)); // Load the object.
|
| + frame_->Dup();
|
| + Result object = frame_->Pop();
|
| + object.ToRegister();
|
| + ASSERT(object.is_valid());
|
| + // if (object->IsSmi()) return object.
|
| + __ testl(object.reg(), Immediate(kSmiTagMask));
|
| + leave.Branch(zero);
|
| + // It is a heap object - get map.
|
| + Result temp = allocator()->Allocate();
|
| + ASSERT(temp.is_valid());
|
| + // if (!object->IsJSValue()) return object.
|
| + __ CmpObjectType(object.reg(), JS_VALUE_TYPE, temp.reg());
|
| + leave.Branch(not_equal);
|
| + __ movq(temp.reg(), FieldOperand(object.reg(), JSValue::kValueOffset));
|
| + object.Unuse();
|
| + frame_->SetElementAt(0, &temp);
|
| + leave.Bind();
|
| }
|
|
|
| +
|
| // -----------------------------------------------------------------------------
|
| // CodeGenerator implementation of Expressions
|
|
|
|
|