Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normative: Avoid duplicate reads of since/until options data #2447

Merged

Conversation

gibson042
Copy link
Collaborator

@gibson042 gibson042 commented Dec 8, 2022

Instead, clone options in iteration order and read from the clone (slightly breaking the "read known properties in alphabetical order" goal in a subset of cases to fulfill the higher goals of consistency across types1 and robustness against malicious or broken user code).

Ref #2289 (comment)

If accepted, this will require changing some test262 files:

  • Instant/p/since/order-of-operations.js
  • Instant/p/until/order-of-operations.js
  • PlainDate/p/since/order-of-operations.js
  • PlainDate/p/until/order-of-operations.js
  • PlainDateTime/p/since/order-of-operations.js
  • PlainDateTime/p/until/order-of-operations.js
  • PlainTime/p/since/order-of-operations.js
  • PlainTime/p/until/order-of-operations.js
  • PlainYearMonth/p/since/order-of-operations.js
  • PlainYearMonth/p/until/order-of-operations.js
  • ZonedDateTime/p/since/order-of-operations.js
  • ZonedDateTime/p/until/order-of-operations.js
  • (intl) TimeZone/supported-values-of.js
calendar-insensitive sequence

adds ownKeys and a read of each property

 get other.calendar[Symbol.toPrimitive]
 get other.calendar.toString
 call other.calendar.toString
+ownKeys options
+getOwnPropertyDescriptor options.roundingIncrement
+get options.roundingIncrement
+getOwnPropertyDescriptor options.roundingMode
+get options.roundingMode
+getOwnPropertyDescriptor options.largestUnit
 get options.largestUnit
+getOwnPropertyDescriptor options.smallestUnit
+get options.smallestUnit
+getOwnPropertyDescriptor options.additional
+get options.additional
 get options.largestUnit.toString
 call options.largestUnit.toString
-get options.roundingIncrement
 get options.roundingIncrement.valueOf
 call options.roundingIncrement.valueOf
-get options.roundingMode
 get options.roundingMode.toString
 call options.roundingMode.toString
-get options.smallestUnit
 get options.smallestUnit.toString
 call options.smallestUnit.toString
calendar-sensitive sequence

removes duplicate reads

 get this.calendar.toString
 call this.calendar.toString
 get other.calendar[Symbol.toPrimitive]
 get other.calendar.toString
 call other.calendar.toString
-get options.largestUnit
-get options.largestUnit.toString
-call options.largestUnit.toString
-get options.roundingIncrement
-get options.roundingIncrement.valueOf
-call options.roundingIncrement.valueOf
-get options.roundingMode
-get options.roundingMode.toString
-call options.roundingMode.toString
-get options.smallestUnit
-get options.smallestUnit.toString
-call options.smallestUnit.toString
 ownKeys options
 getOwnPropertyDescriptor options.roundingIncrement
 get options.roundingIncrement
 getOwnPropertyDescriptor options.roundingMode
 get options.roundingMode
 getOwnPropertyDescriptor options.largestUnit
 get options.largestUnit
 getOwnPropertyDescriptor options.smallestUnit
 get options.smallestUnit
 getOwnPropertyDescriptor options.additional
 get options.additional
+get options.largestUnit.toString
+call options.largestUnit.toString
+get options.roundingIncrement.valueOf
+call options.roundingIncrement.valueOf
+get options.roundingMode.toString
+call options.roundingMode.toString
+get options.smallestUnit.toString
+call options.smallestUnit.toString
 get this.calendar.dateUntil
 call this.calendar.dateUntil

Footnotes

  1. Specifically, including {Instant,PlainTime}.{since,until} for consistency with the other types, even though they are not calendar-bearing and therefore options properties not read by GetDifferenceSettings are irrelevant.

@codecov
Copy link

codecov bot commented Dec 8, 2022

Codecov Report

Merging #2447 (4020d99) into main (ea1b491) will decrease coverage by 0.24%.
The diff coverage is 100.00%.

❗ Current head 4020d99 differs from pull request most recent head b1584b6. Consider uploading reports for the commit b1584b6 to get more accurate results

@@            Coverage Diff             @@
##             main    #2447      +/-   ##
==========================================
- Coverage   94.97%   94.73%   -0.24%     
==========================================
  Files          20       20              
  Lines       10905    11156     +251     
  Branches     1995     1981      -14     
==========================================
+ Hits        10357    10569     +212     
- Misses        487      540      +53     
+ Partials       61       47      -14     
Impacted Files Coverage Δ
polyfill/lib/ecmascript.mjs 98.22% <100.00%> (-0.09%) ⬇️
polyfill/runtest262.mjs 87.59% <0.00%> (-2.41%) ⬇️
polyfill/lib/intl.mjs 97.82% <0.00%> (-1.98%) ⬇️
polyfill/lib/plainmonthday.mjs 95.71% <0.00%> (-1.97%) ⬇️
polyfill/lib/plainyearmonth.mjs 96.92% <0.00%> (-1.44%) ⬇️
polyfill/lib/plaindate.mjs 98.71% <0.00%> (-0.96%) ⬇️
polyfill/lib/zoneddatetime.mjs 99.82% <0.00%> (+<0.01%) ⬆️
polyfill/lib/plaindatetime.mjs 97.92% <0.00%> (+0.68%) ⬆️
polyfill/lib/duration.mjs 97.51% <0.00%> (+1.47%) ⬆️
... and 1 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@@ -1796,7 +1796,7 @@ <h1>
<h1>
GetDifferenceSettings (
_operation_: ~since~ or ~until~,
_options_: an ECMAScript language value,
_options_: an Object,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should there be some kind of assertion here that this is an ordinary object with only data properties whose [[Prototype]] is null?

Copy link
Collaborator Author

@gibson042 gibson042 Dec 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's fine without that. The operation remains meaningful regardless (and is not relying upon such assumptions), we're just choosing not to employ it with potentially tricky input.

Copy link
Collaborator

@ptomato ptomato left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had thought about proposing something like this for #2254 but ended up not suggesting it due to it not being an existing precedent in Intl. Now I wish I had, though — it makes a lot of sense, especially for options objects that are passed to calendar methods, and seems pretty uncontroversial either way. The timing is a bit unfortunate for implementors, coming on the heels of that earlier change, but we can try to get all of the observable operation reorderings done and present them at the same time.

ptomato added a commit to ptomato/test262 that referenced this pull request Feb 7, 2023
In since() and until() methods, we copy the options object with
CopyDataProperties. Previously, its properties could be read in more than
one place (the method itself, and the calendar method), triggering user
code each time. Now, we pass around null-prototype objects with only data
properties.

See tc39/proposal-temporal#2447
@ptomato
Copy link
Collaborator

ptomato commented Feb 7, 2023

If accepted, this will require changing some test262 files:

  • Instant/p/since/order-of-operations.js
  • Instant/p/until/order-of-operations.js
  • PlainDate/p/since/order-of-operations.js
  • PlainDate/p/until/order-of-operations.js
  • PlainDateTime/p/since/order-of-operations.js
  • PlainDateTime/p/until/order-of-operations.js
  • PlainTime/p/since/order-of-operations.js
  • PlainTime/p/until/order-of-operations.js
  • PlainYearMonth/p/since/order-of-operations.js
  • PlainYearMonth/p/until/order-of-operations.js
  • ZonedDateTime/p/since/order-of-operations.js
  • ZonedDateTime/p/until/order-of-operations.js
  • (intl) TimeZone/supported-values-of.js

I've made these changes in tc39/test262#3781, though I could not find anything that needed to be changed in the last one in that list.

ptomato added a commit to ptomato/test262 that referenced this pull request Feb 14, 2023
In since() and until() methods, we copy the options object with
CopyDataProperties. Previously, its properties could be read in more than
one place (the method itself, and the calendar method), triggering user
code each time. Now, we pass around null-prototype objects with only data
properties.

See tc39/proposal-temporal#2447
ptomato added a commit to tc39/test262 that referenced this pull request Feb 14, 2023
In since() and until() methods, we copy the options object with
CopyDataProperties. Previously, its properties could be read in more than
one place (the method itself, and the calendar method), triggering user
code each time. Now, we pass around null-prototype objects with only data
properties.

See tc39/proposal-temporal#2447
gibson042 and others added 3 commits February 14, 2023 09:48
Make a clone in iteration order and read from that
Properties not read by GetDifferenceSettings are irrelevant,
but this preserves consistency with analogous since/until operations
on calendar-bearing types.
@ptomato ptomato force-pushed the 2022-12-difference-options-observable-reads branch from 4020d99 to b1584b6 Compare February 14, 2023 17:51
@ptomato
Copy link
Collaborator

ptomato commented Feb 14, 2023

This was adopted in the January-February 2023 TC39 meeting, and the tests have landed in test262 now.

@ptomato ptomato merged commit 0141b15 into tc39:main Feb 14, 2023
ptomato added a commit that referenced this pull request Mar 11, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Mar 11, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Apr 22, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Apr 22, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Apr 26, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Apr 26, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Apr 27, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Apr 27, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request May 3, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request May 3, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request May 11, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request May 11, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request May 13, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request May 13, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request May 19, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request May 19, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request May 31, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request May 31, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Jun 12, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Jun 12, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Jun 20, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Jun 20, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.

(We don't necessarily have to include this commit if others don't want it.
I'm including it for completeness because that's what we did in Richard's
change in #2447.)
ptomato added a commit that referenced this pull request Aug 11, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

In PlainDateTime.from, delay validation of the options until after
validation of the ISO string, for consistency with ZonedDateTime.from and
in accordance with our general principle of validating arguments in order.

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Aug 11, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.
ptomato added a commit that referenced this pull request Aug 16, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

In PlainDateTime.from, delay validation of the options until after
validation of the ISO string, for consistency with ZonedDateTime.from and
in accordance with our general principle of validating arguments in order.

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Aug 16, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.
ptomato added a commit that referenced this pull request Aug 16, 2023
Following the precedent set in #2447, if we're going to pass the options
object to a calendar method we should make a copy of it. Also flatten the
'options' property once it's read and converted to a string in
InterpretTemporalDateTimeFields, so that it doesn't have to be observably
converted to a string again in Calendar.p.dateFromFields().

In PlainDateTime.from, delay validation of the options until after
validation of the ISO string, for consistency with ZonedDateTime.from and
in accordance with our general principle of validating arguments in order.

This affects the following APIs, which are all callers of
InterpretTemporalDateTimeFields:
- Temporal.PlainDateTime.from()
- Temporal.PlainDateTime.prototype.with()
- Temporal.ZonedDateTime.from()
- Temporal.ZonedDateTime.prototype.with()

It does not affect ToRelativeTemporalObject, even though that also calls
InterpretTemporalDateTimeFields, because it does not take an options
object from userland.
ptomato added a commit that referenced this pull request Aug 16, 2023
…m,p.with}

Also following the precedent set in #2447, this preserves consistency with
analogous from/with operations in {Plain,Zoned}DateTime that need to read
the overflow option twice in order to deal with time and date units
separately.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants