| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 8f14bd0f318925311481d5c088e7af48e6f2f971..13f92c00d4056e9db6b07e09932085914a7ae5f5 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -1027,6 +1027,33 @@ Object* FunctionTemplateInfo::GetCompatibleReceiver(Isolate* isolate,
|
| }
|
|
|
|
|
| +// static
|
| +MaybeHandle<JSObject> JSObject::New(Handle<JSFunction> constructor,
|
| + Handle<JSReceiver> new_target,
|
| + Handle<AllocationSite> site) {
|
| + // If called through new, new.target can be:
|
| + // - a subclass of constructor,
|
| + // - a proxy wrapper around constructor, or
|
| + // - the constructor itself.
|
| + // If called through Reflect.construct, it's guaranteed to be a constructor.
|
| + Isolate* const isolate = constructor->GetIsolate();
|
| + DCHECK(constructor->IsConstructor());
|
| + DCHECK(new_target->IsConstructor());
|
| + DCHECK(!constructor->has_initial_map() ||
|
| + constructor->initial_map()->instance_type() != JS_FUNCTION_TYPE);
|
| +
|
| + Handle<Map> initial_map;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, initial_map,
|
| + JSFunction::GetDerivedMap(isolate, constructor, new_target), JSObject);
|
| + Handle<JSObject> result =
|
| + isolate->factory()->NewJSObjectFromMap(initial_map, NOT_TENURED, site);
|
| + isolate->counters()->constructed_objects()->Increment();
|
| + isolate->counters()->constructed_objects_runtime()->Increment();
|
| + return result;
|
| +}
|
| +
|
| +
|
| Handle<FixedArray> JSObject::EnsureWritableFastElements(
|
| Handle<JSObject> object) {
|
| DCHECK(object->HasFastSmiOrObjectElements());
|
| @@ -19094,6 +19121,39 @@ int BreakPointInfo::GetBreakPointCount() {
|
| }
|
|
|
|
|
| +// static
|
| +MaybeHandle<JSDate> JSDate::New(Handle<JSFunction> constructor,
|
| + Handle<JSReceiver> new_target, double tv) {
|
| + Isolate* const isolate = constructor->GetIsolate();
|
| + Handle<JSObject> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
|
| + JSObject::New(constructor, new_target), JSDate);
|
| + if (-DateCache::kMaxTimeInMs <= tv && tv <= DateCache::kMaxTimeInMs) {
|
| + tv = DoubleToInteger(tv) + 0.0;
|
| + } else {
|
| + tv = std::numeric_limits<double>::quiet_NaN();
|
| + }
|
| + Handle<Object> value = isolate->factory()->NewNumber(tv);
|
| + Handle<JSDate>::cast(result)->SetValue(*value, std::isnan(tv));
|
| + return Handle<JSDate>::cast(result);
|
| +}
|
| +
|
| +
|
| +// static
|
| +double JSDate::CurrentTimeValue(Isolate* isolate) {
|
| + if (FLAG_log_timer_events || FLAG_prof_cpp) LOG(isolate, CurrentTimeEvent());
|
| +
|
| + // According to ECMA-262, section 15.9.1, page 117, the precision of
|
| + // the number in a Date object representing a particular instant in
|
| + // time is milliseconds. Therefore, we floor the result of getting
|
| + // the OS time.
|
| + return Floor(FLAG_verify_predictable
|
| + ? isolate->heap()->MonotonicallyIncreasingTimeInMs()
|
| + : base::OS::TimeCurrentMillis());
|
| +}
|
| +
|
| +
|
| +// static
|
| Object* JSDate::GetField(Object* object, Smi* index) {
|
| return JSDate::cast(object)->DoGetField(
|
| static_cast<FieldIndex>(index->value()));
|
|
|