Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.cc

Issue 1324713002: [es6] Implement Date.prototype[@@toPrimitive] as C++ builtin. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address Michi's comments. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <iomanip> 7 #include <iomanip>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 19 matching lines...) Expand all
30 #include "src/hydrogen.h" 30 #include "src/hydrogen.h"
31 #include "src/ic/ic.h" 31 #include "src/ic/ic.h"
32 #include "src/interpreter/bytecodes.h" 32 #include "src/interpreter/bytecodes.h"
33 #include "src/log.h" 33 #include "src/log.h"
34 #include "src/lookup.h" 34 #include "src/lookup.h"
35 #include "src/macro-assembler.h" 35 #include "src/macro-assembler.h"
36 #include "src/messages.h" 36 #include "src/messages.h"
37 #include "src/objects-inl.h" 37 #include "src/objects-inl.h"
38 #include "src/prototype.h" 38 #include "src/prototype.h"
39 #include "src/safepoint-table.h" 39 #include "src/safepoint-table.h"
40 #include "src/string-builder.h"
40 #include "src/string-search.h" 41 #include "src/string-search.h"
41 #include "src/string-stream.h" 42 #include "src/string-stream.h"
42 #include "src/utils.h" 43 #include "src/utils.h"
43 44
44 #ifdef ENABLE_DISASSEMBLER 45 #ifdef ENABLE_DISASSEMBLER
45 #include "src/disasm.h" 46 #include "src/disasm.h"
46 #include "src/disassembler.h" 47 #include "src/disassembler.h"
47 #endif 48 #endif
48 49
49 namespace v8 { 50 namespace v8 {
(...skipping 5984 matching lines...) Expand 10 before | Expand all | Expand 10 after
6034 Handle<Object> result; 6035 Handle<Object> result;
6035 ASSIGN_RETURN_ON_EXCEPTION( 6036 ASSIGN_RETURN_ON_EXCEPTION(
6036 isolate, result, 6037 isolate, result,
6037 Execution::Call(isolate, exotic_to_prim, receiver, 1, &hint_string), 6038 Execution::Call(isolate, exotic_to_prim, receiver, 1, &hint_string),
6038 Object); 6039 Object);
6039 if (result->IsPrimitive()) return result; 6040 if (result->IsPrimitive()) return result;
6040 THROW_NEW_ERROR(isolate, 6041 THROW_NEW_ERROR(isolate,
6041 NewTypeError(MessageTemplate::kCannotConvertToPrimitive), 6042 NewTypeError(MessageTemplate::kCannotConvertToPrimitive),
6042 Object); 6043 Object);
6043 } 6044 }
6044 return OrdinaryToPrimitive(receiver, 6045 return OrdinaryToPrimitive(receiver, (hint == ToPrimitiveHint::kString)
6045 (hint == ToPrimitiveHint::kString) 6046 ? OrdinaryToPrimitiveHint::kString
6046 ? isolate->factory()->string_string() 6047 : OrdinaryToPrimitiveHint::kNumber);
6047 : isolate->factory()->number_string());
6048 } 6048 }
6049 6049
6050 6050
6051 // static 6051 // static
6052 MaybeHandle<Object> JSReceiver::OrdinaryToPrimitive(Handle<JSReceiver> receiver, 6052 MaybeHandle<Object> JSReceiver::OrdinaryToPrimitive(
6053 Handle<String> hint) { 6053 Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint) {
6054 Isolate* const isolate = receiver->GetIsolate(); 6054 Isolate* const isolate = receiver->GetIsolate();
6055 Handle<String> method_names[2]; 6055 Handle<String> method_names[2];
6056 if (hint.is_identical_to(isolate->factory()->number_string())) { 6056 switch (hint) {
6057 method_names[0] = isolate->factory()->valueOf_string(); 6057 case OrdinaryToPrimitiveHint::kNumber:
6058 method_names[1] = isolate->factory()->toString_string(); 6058 method_names[0] = isolate->factory()->valueOf_string();
6059 } else { 6059 method_names[1] = isolate->factory()->toString_string();
6060 DCHECK(hint.is_identical_to(isolate->factory()->string_string())); 6060 break;
6061 method_names[0] = isolate->factory()->toString_string(); 6061 case OrdinaryToPrimitiveHint::kString:
6062 method_names[1] = isolate->factory()->valueOf_string(); 6062 method_names[0] = isolate->factory()->toString_string();
6063 method_names[1] = isolate->factory()->valueOf_string();
6064 break;
6063 } 6065 }
6064 for (Handle<String> name : method_names) { 6066 for (Handle<String> name : method_names) {
6065 Handle<Object> method; 6067 Handle<Object> method;
6066 ASSIGN_RETURN_ON_EXCEPTION(isolate, method, 6068 ASSIGN_RETURN_ON_EXCEPTION(isolate, method,
6067 JSReceiver::GetProperty(receiver, name), Object); 6069 JSReceiver::GetProperty(receiver, name), Object);
6068 if (method->IsCallable()) { 6070 if (method->IsCallable()) {
6069 Handle<Object> result; 6071 Handle<Object> result;
6070 ASSIGN_RETURN_ON_EXCEPTION( 6072 ASSIGN_RETURN_ON_EXCEPTION(
6071 isolate, result, Execution::Call(isolate, method, receiver, 0, NULL), 6073 isolate, result, Execution::Call(isolate, method, receiver, 0, NULL),
6072 Object); 6074 Object);
(...skipping 2270 matching lines...) Expand 10 before | Expand all | Expand 10 after
8343 } 8345 }
8344 #endif 8346 #endif
8345 8347
8346 8348
8347 bool String::LooksValid() { 8349 bool String::LooksValid() {
8348 if (!GetIsolate()->heap()->Contains(this)) return false; 8350 if (!GetIsolate()->heap()->Contains(this)) return false;
8349 return true; 8351 return true;
8350 } 8352 }
8351 8353
8352 8354
8355 // static
8356 MaybeHandle<String> Name::ToFunctionName(Handle<Name> name) {
8357 if (name->IsString()) return Handle<String>::cast(name);
8358 // ES6 section 9.2.11 SetFunctionName, step 4.
8359 Isolate* const isolate = name->GetIsolate();
8360 Handle<Object> description(Handle<Symbol>::cast(name)->name(), isolate);
8361 if (description->IsUndefined()) return isolate->factory()->empty_string();
8362 IncrementalStringBuilder builder(isolate);
8363 builder.AppendCharacter('[');
8364 builder.AppendString(Handle<String>::cast(description));
8365 builder.AppendCharacter(']');
8366 return builder.Finish();
8367 }
8368
8369
8353 namespace { 8370 namespace {
8354 8371
8355 bool AreDigits(const uint8_t* s, int from, int to) { 8372 bool AreDigits(const uint8_t* s, int from, int to) {
8356 for (int i = from; i < to; i++) { 8373 for (int i = from; i < to; i++) {
8357 if (s[i] < '0' || s[i] > '9') return false; 8374 if (s[i] < '0' || s[i] > '9') return false;
8358 } 8375 }
8359 8376
8360 return true; 8377 return true;
8361 } 8378 }
8362 8379
(...skipping 7496 matching lines...) Expand 10 before | Expand all | Expand 10 after
15859 set_hour(nan, SKIP_WRITE_BARRIER); 15876 set_hour(nan, SKIP_WRITE_BARRIER);
15860 set_min(nan, SKIP_WRITE_BARRIER); 15877 set_min(nan, SKIP_WRITE_BARRIER);
15861 set_sec(nan, SKIP_WRITE_BARRIER); 15878 set_sec(nan, SKIP_WRITE_BARRIER);
15862 set_weekday(nan, SKIP_WRITE_BARRIER); 15879 set_weekday(nan, SKIP_WRITE_BARRIER);
15863 } else { 15880 } else {
15864 set_cache_stamp(Smi::FromInt(DateCache::kInvalidStamp), SKIP_WRITE_BARRIER); 15881 set_cache_stamp(Smi::FromInt(DateCache::kInvalidStamp), SKIP_WRITE_BARRIER);
15865 } 15882 }
15866 } 15883 }
15867 15884
15868 15885
15886 // static
15887 MaybeHandle<Object> JSDate::ToPrimitive(Handle<JSReceiver> receiver,
15888 Handle<Object> hint) {
15889 Isolate* const isolate = receiver->GetIsolate();
15890 if (hint->IsString()) {
15891 Handle<String> hint_string = Handle<String>::cast(hint);
15892 if (hint_string->Equals(isolate->heap()->number_string())) {
15893 return JSReceiver::OrdinaryToPrimitive(receiver,
15894 OrdinaryToPrimitiveHint::kNumber);
15895 }
15896 if (hint_string->Equals(isolate->heap()->default_string()) ||
15897 hint_string->Equals(isolate->heap()->string_string())) {
15898 return JSReceiver::OrdinaryToPrimitive(receiver,
15899 OrdinaryToPrimitiveHint::kString);
15900 }
15901 }
15902 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kInvalidHint, hint),
15903 Object);
15904 }
15905
15906
15869 void JSDate::SetCachedFields(int64_t local_time_ms, DateCache* date_cache) { 15907 void JSDate::SetCachedFields(int64_t local_time_ms, DateCache* date_cache) {
15870 int days = DateCache::DaysFromTime(local_time_ms); 15908 int days = DateCache::DaysFromTime(local_time_ms);
15871 int time_in_day_ms = DateCache::TimeInDay(local_time_ms, days); 15909 int time_in_day_ms = DateCache::TimeInDay(local_time_ms, days);
15872 int year, month, day; 15910 int year, month, day;
15873 date_cache->YearMonthDayFromDays(days, &year, &month, &day); 15911 date_cache->YearMonthDayFromDays(days, &year, &month, &day);
15874 int weekday = date_cache->Weekday(days); 15912 int weekday = date_cache->Weekday(days);
15875 int hour = time_in_day_ms / (60 * 60 * 1000); 15913 int hour = time_in_day_ms / (60 * 60 * 1000);
15876 int min = (time_in_day_ms / (60 * 1000)) % 60; 15914 int min = (time_in_day_ms / (60 * 1000)) % 60;
15877 int sec = (time_in_day_ms / 1000) % 60; 15915 int sec = (time_in_day_ms / 1000) % 60;
15878 set_cache_stamp(date_cache->stamp()); 15916 set_cache_stamp(date_cache->stamp());
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
16126 if (cell->value() != *new_value) { 16164 if (cell->value() != *new_value) {
16127 cell->set_value(*new_value); 16165 cell->set_value(*new_value);
16128 Isolate* isolate = cell->GetIsolate(); 16166 Isolate* isolate = cell->GetIsolate();
16129 cell->dependent_code()->DeoptimizeDependentCodeGroup( 16167 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16130 isolate, DependentCode::kPropertyCellChangedGroup); 16168 isolate, DependentCode::kPropertyCellChangedGroup);
16131 } 16169 }
16132 } 16170 }
16133 16171
16134 } // namespace internal 16172 } // namespace internal
16135 } // namespace v8 16173 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698