Levente Uzonyi uploaded a new version of Chronology-Core to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-ul.22.mcz ==================== Summary ==================== Name: Chronology-Core-ul.22 Author: ul Time: 14 January 2019, 1:08:48.177246 pm UUID: 025b4802-6281-4674-937e-a345e5a6aded Ancestors: Chronology-Core-ul.21 - added an accessor to Time's ClockPolicy, so that tests can depend on its current value - optimized various DateAndTime methods =============== Diff against Chronology-Core-ul.21 =============== Item was changed: ----- Method: DateAndTime>>= (in category 'ansi protocol') ----- = aDateAndTimeOrTimeStamp "Equal if the absolute time values match, regardless of local time transform" + self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ]. + aDateAndTimeOrTimeStamp species == DateAndTime ifFalse: [ ^false ]. + aDateAndTimeOrTimeStamp utcMicroseconds = utcMicroseconds ifTrue: [ ^true ]. + ^false! - ^aDateAndTimeOrTimeStamp species == DateAndTime - and: [ utcMicroseconds = aDateAndTimeOrTimeStamp utcMicroseconds ]! Item was changed: ----- Method: DateAndTime>>asUTC (in category 'ansi protocol') ----- asUTC localOffsetSeconds = 0 ifTrue: [ ^self ]. + ^self copy makeUTC! - ^self copy - utcMicroseconds: utcMicroseconds - offset: 0 - ! Item was changed: ----- Method: DateAndTime>>asUnixTime (in category 'squeak protocol') ----- asUnixTime "answer number of seconds since unix epoch (midnight Jan 1, 1970, UTC)" + ^utcMicroseconds // 1000000! - ^(self - self class unixEpoch) asSeconds! Item was changed: ----- Method: DateAndTime>>dayMonthYearDo: (in category 'squeak protocol') ----- dayMonthYearDo: aBlock "Evaluation the block with three arguments: day month, year." + | l n i j dd | - | l n i j dd mm yyyy | l := self julianDayNumber + 68569. n := 4 * l // 146097. l := l - (146097 * n + 3 // 4). + i := l + 1 * 4000 // 1461001. - i := 4000 * (l + 1) // 1461001. l := l - (1461 * i // 4) + 31. j := 80 * l // 2447. dd := l - (2447 * j // 80). l := j // 11. - mm := j + 2 - (12 * l). - yyyy := 100 * (n - 49) + i + l. ^ aBlock value: dd + value: -12 * l + 2 + j "month" + value: n - 49 * 100 + i + l "year"! - value: mm - value: yyyy! Item was changed: ----- Method: DateAndTime>>floor (in category 'squeak protocol') ----- floor "Answer a copy with magnitude rounded down to the nearest whole second" ^self class + utcMicroseconds: utcMicroseconds // 1000000 * 1000000 - utcMicroseconds: utcMicroseconds - (utcMicroseconds \\ 1000000) offset: localOffsetSeconds! Item was changed: ----- Method: DateAndTime>>getSeconds (in category 'accessing') ----- getSeconds + + ^utcMicroseconds // 1000000 + localOffsetSeconds \\ 86400! - - | posixDays posixSeconds localSeconds | - posixSeconds := utcMicroseconds // 1000000. - localSeconds := posixSeconds + localOffsetSeconds. - localSeconds < 0 ifTrue: [localSeconds := localSeconds \\ SecondsInDay]. "normalize" - posixDays := localSeconds // SecondsInDay. - ^localSeconds - (posixDays * SecondsInDay). - ! Item was changed: ----- Method: DateAndTime>>julianDayNumber (in category 'squeak protocol') ----- julianDayNumber + ^utcMicroseconds // 1000000 + localOffsetSeconds // 86400 + PosixEpochJulianDays! - | posixDays posixSeconds localSeconds negativeDays | - posixSeconds := utcMicroseconds // 1000000. - localSeconds := posixSeconds + localOffsetSeconds. - negativeDays := 0. - localSeconds < 0 ifTrue: [ "normalize" - negativeDays := localSeconds // SecondsInDay. - localSeconds := negativeDays * SecondsInDay + localSeconds]. - posixDays := localSeconds // SecondsInDay. - ^posixDays + PosixEpochJulianDays - negativeDays. - ! Item was changed: ----- Method: DateAndTime>>microsecondsFromDay:seconds:nanos:offset: (in category 'private') ----- microsecondsFromDay: jdn seconds: s nanos: n offset: localOffsetSeconds + ^jdn - PosixEpochJulianDays "days" * 86400 + + s - localOffsetSeconds "seconds" * 1000000 + + (n / 1000) "nanos"! - | days totalSeconds micros | - days := jdn - PosixEpochJulianDays. - totalSeconds := days * 86400 + s - localOffsetSeconds. "n.g. const 86400 is faster than SecondsInDay" - micros := totalSeconds * 1000000. - ^micros + (n / 1000) - ! Item was added: + ----- Method: Time class>>clockPolicy (in category 'class initialization') ----- + clockPolicy + + ^ClockPolicy! |
Hi Levente,
> On Jan 14, 2019, at 4:18 AM, [hidden email] wrote: > > Levente Uzonyi uploaded a new version of Chronology-Core to project The Inbox: > http://source.squeak.org/inbox/Chronology-Core-ul.22.mcz > > ==================== Summary ==================== > > Name: Chronology-Core-ul.22 > Author: ul > Time: 14 January 2019, 1:08:48.177246 pm > UUID: 025b4802-6281-4674-937e-a345e5a6aded > Ancestors: Chronology-Core-ul.21 > > - added an accessor to Time's ClockPolicy, so that tests can depend on its current value > - optimized various DateAndTime methods > > =============== Diff against Chronology-Core-ul.21 =============== > > Item was changed: > ----- Method: DateAndTime>>= (in category 'ansi protocol') ----- > = aDateAndTimeOrTimeStamp > "Equal if the absolute time values match, regardless of local time transform" > + > self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ]. > + aDateAndTimeOrTimeStamp species == DateAndTime ifFalse: [ ^false ]. > + aDateAndTimeOrTimeStamp utcMicroseconds = utcMicroseconds ifTrue: [ ^true ]. > + ^false! > - ^aDateAndTimeOrTimeStamp species == DateAndTime > - and: [ utcMicroseconds = aDateAndTimeOrTimeStamp utcMicroseconds ]! Can we please avoid the ... ifFalse: [^false] style and keep the much nicer concise and: style? Yes, the former is slightly faster, but not by much, and the JIT has code to minimize the difference and Sista will eliminate the difference. The former style is so ugly. > > Item was changed: > ----- Method: DateAndTime>>asUTC (in category 'ansi protocol') ----- > asUTC > > localOffsetSeconds = 0 ifTrue: [ ^self ]. > + ^self copy makeUTC! > - ^self copy > - utcMicroseconds: utcMicroseconds > - offset: 0 > - ! > > Item was changed: > ----- Method: DateAndTime>>asUnixTime (in category 'squeak protocol') ----- > asUnixTime > "answer number of seconds since unix epoch (midnight Jan 1, 1970, UTC)" > > + ^utcMicroseconds // 1000000! > - ^(self - self class unixEpoch) asSeconds! > > Item was changed: > ----- Method: DateAndTime>>dayMonthYearDo: (in category 'squeak protocol') ----- > dayMonthYearDo: aBlock > "Evaluation the block with three arguments: day month, year." > > + | l n i j dd | > - | l n i j dd mm yyyy | > l := self julianDayNumber + 68569. > n := 4 * l // 146097. > l := l - (146097 * n + 3 // 4). > + i := l + 1 * 4000 // 1461001. > - i := 4000 * (l + 1) // 1461001. > l := l - (1461 * i // 4) + 31. > j := 80 * l // 2447. > dd := l - (2447 * j // 80). > l := j // 11. > - mm := j + 2 - (12 * l). > - yyyy := 100 * (n - 49) + i + l. > > ^ aBlock > value: dd > + value: -12 * l + 2 + j "month" > + value: n - 49 * 100 + i + l "year"! > - value: mm > - value: yyyy! > > Item was changed: > ----- Method: DateAndTime>>floor (in category 'squeak protocol') ----- > floor > "Answer a copy with magnitude rounded down to the nearest whole second" > ^self class > + utcMicroseconds: utcMicroseconds // 1000000 * 1000000 > - utcMicroseconds: utcMicroseconds - (utcMicroseconds \\ 1000000) > offset: localOffsetSeconds! > > Item was changed: > ----- Method: DateAndTime>>getSeconds (in category 'accessing') ----- > getSeconds > + > + ^utcMicroseconds // 1000000 + localOffsetSeconds \\ 86400! > - > - | posixDays posixSeconds localSeconds | > - posixSeconds := utcMicroseconds // 1000000. > - localSeconds := posixSeconds + localOffsetSeconds. > - localSeconds < 0 ifTrue: [localSeconds := localSeconds \\ SecondsInDay]. "normalize" > - posixDays := localSeconds // SecondsInDay. > - ^localSeconds - (posixDays * SecondsInDay). > - ! > > Item was changed: > ----- Method: DateAndTime>>julianDayNumber (in category 'squeak protocol') ----- > julianDayNumber > > + ^utcMicroseconds // 1000000 + localOffsetSeconds // 86400 + PosixEpochJulianDays! > - | posixDays posixSeconds localSeconds negativeDays | > - posixSeconds := utcMicroseconds // 1000000. > - localSeconds := posixSeconds + localOffsetSeconds. > - negativeDays := 0. > - localSeconds < 0 ifTrue: [ "normalize" > - negativeDays := localSeconds // SecondsInDay. > - localSeconds := negativeDays * SecondsInDay + localSeconds]. > - posixDays := localSeconds // SecondsInDay. > - ^posixDays + PosixEpochJulianDays - negativeDays. > - ! > > Item was changed: > ----- Method: DateAndTime>>microsecondsFromDay:seconds:nanos:offset: (in category 'private') ----- > microsecondsFromDay: jdn seconds: s nanos: n offset: localOffsetSeconds > > + ^jdn - PosixEpochJulianDays "days" * 86400 > + + s - localOffsetSeconds "seconds" * 1000000 > + + (n / 1000) "nanos"! > - | days totalSeconds micros | > - days := jdn - PosixEpochJulianDays. > - totalSeconds := days * 86400 + s - localOffsetSeconds. "n.g. const 86400 is faster than SecondsInDay" > - micros := totalSeconds * 1000000. > - ^micros + (n / 1000) > - ! > > Item was added: > + ----- Method: Time class>>clockPolicy (in category 'class initialization') ----- > + clockPolicy > + > + ^ClockPolicy! > > |
This is a good set of cleanups, with an overall performance improvement.
+1 for moving the changes to trunk, with or without the DateAndTime>>#= change. I somewhat agree with Eliot's comment below, although I am happy either way. Dave On Mon, Jan 14, 2019 at 07:07:23AM -0800, Eliot Miranda wrote: > Hi Levente, > > > On Jan 14, 2019, at 4:18 AM, [hidden email] wrote: > > > > Levente Uzonyi uploaded a new version of Chronology-Core to project The Inbox: > > http://source.squeak.org/inbox/Chronology-Core-ul.22.mcz > > > > ==================== Summary ==================== > > > > Name: Chronology-Core-ul.22 > > Author: ul > > Time: 14 January 2019, 1:08:48.177246 pm > > UUID: 025b4802-6281-4674-937e-a345e5a6aded > > Ancestors: Chronology-Core-ul.21 > > > > - added an accessor to Time's ClockPolicy, so that tests can depend on its current value > > - optimized various DateAndTime methods > > > > =============== Diff against Chronology-Core-ul.21 =============== > > > > Item was changed: > > ----- Method: DateAndTime>>= (in category 'ansi protocol') ----- > > = aDateAndTimeOrTimeStamp > > "Equal if the absolute time values match, regardless of local time transform" > > + > > self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ]. > > + aDateAndTimeOrTimeStamp species == DateAndTime ifFalse: [ ^false ]. > > + aDateAndTimeOrTimeStamp utcMicroseconds = utcMicroseconds ifTrue: [ ^true ]. > > + ^false! > > - ^aDateAndTimeOrTimeStamp species == DateAndTime > > - and: [ utcMicroseconds = aDateAndTimeOrTimeStamp utcMicroseconds ]! > > Can we please avoid the ... ifFalse: [^false] style and keep the much nicer concise and: style? Yes, the former is slightly faster, but not by much, and the JIT has code to minimize the difference and Sista will eliminate the difference. The former style is so ugly. > > > > > Item was changed: > > ----- Method: DateAndTime>>asUTC (in category 'ansi protocol') ----- > > asUTC > > > > localOffsetSeconds = 0 ifTrue: [ ^self ]. > > + ^self copy makeUTC! > > - ^self copy > > - utcMicroseconds: utcMicroseconds > > - offset: 0 > > - ! > > > > Item was changed: > > ----- Method: DateAndTime>>asUnixTime (in category 'squeak protocol') ----- > > asUnixTime > > "answer number of seconds since unix epoch (midnight Jan 1, 1970, UTC)" > > > > + ^utcMicroseconds // 1000000! > > - ^(self - self class unixEpoch) asSeconds! > > > > Item was changed: > > ----- Method: DateAndTime>>dayMonthYearDo: (in category 'squeak protocol') ----- > > dayMonthYearDo: aBlock > > "Evaluation the block with three arguments: day month, year." > > > > + | l n i j dd | > > - | l n i j dd mm yyyy | > > l := self julianDayNumber + 68569. > > n := 4 * l // 146097. > > l := l - (146097 * n + 3 // 4). > > + i := l + 1 * 4000 // 1461001. > > - i := 4000 * (l + 1) // 1461001. > > l := l - (1461 * i // 4) + 31. > > j := 80 * l // 2447. > > dd := l - (2447 * j // 80). > > l := j // 11. > > - mm := j + 2 - (12 * l). > > - yyyy := 100 * (n - 49) + i + l. > > > > ^ aBlock > > value: dd > > + value: -12 * l + 2 + j "month" > > + value: n - 49 * 100 + i + l "year"! > > - value: mm > > - value: yyyy! > > > > Item was changed: > > ----- Method: DateAndTime>>floor (in category 'squeak protocol') ----- > > floor > > "Answer a copy with magnitude rounded down to the nearest whole second" > > ^self class > > + utcMicroseconds: utcMicroseconds // 1000000 * 1000000 > > - utcMicroseconds: utcMicroseconds - (utcMicroseconds \\ 1000000) > > offset: localOffsetSeconds! > > > > Item was changed: > > ----- Method: DateAndTime>>getSeconds (in category 'accessing') ----- > > getSeconds > > + > > + ^utcMicroseconds // 1000000 + localOffsetSeconds \\ 86400! > > - > > - | posixDays posixSeconds localSeconds | > > - posixSeconds := utcMicroseconds // 1000000. > > - localSeconds := posixSeconds + localOffsetSeconds. > > - localSeconds < 0 ifTrue: [localSeconds := localSeconds \\ SecondsInDay]. "normalize" > > - posixDays := localSeconds // SecondsInDay. > > - ^localSeconds - (posixDays * SecondsInDay). > > - ! > > > > Item was changed: > > ----- Method: DateAndTime>>julianDayNumber (in category 'squeak protocol') ----- > > julianDayNumber > > > > + ^utcMicroseconds // 1000000 + localOffsetSeconds // 86400 + PosixEpochJulianDays! > > - | posixDays posixSeconds localSeconds negativeDays | > > - posixSeconds := utcMicroseconds // 1000000. > > - localSeconds := posixSeconds + localOffsetSeconds. > > - negativeDays := 0. > > - localSeconds < 0 ifTrue: [ "normalize" > > - negativeDays := localSeconds // SecondsInDay. > > - localSeconds := negativeDays * SecondsInDay + localSeconds]. > > - posixDays := localSeconds // SecondsInDay. > > - ^posixDays + PosixEpochJulianDays - negativeDays. > > - ! > > > > Item was changed: > > ----- Method: DateAndTime>>microsecondsFromDay:seconds:nanos:offset: (in category 'private') ----- > > microsecondsFromDay: jdn seconds: s nanos: n offset: localOffsetSeconds > > > > + ^jdn - PosixEpochJulianDays "days" * 86400 > > + + s - localOffsetSeconds "seconds" * 1000000 > > + + (n / 1000) "nanos"! > > - | days totalSeconds micros | > > - days := jdn - PosixEpochJulianDays. > > - totalSeconds := days * 86400 + s - localOffsetSeconds. "n.g. const 86400 is faster than SecondsInDay" > > - micros := totalSeconds * 1000000. > > - ^micros + (n / 1000) > > - ! > > > > Item was added: > > + ----- Method: Time class>>clockPolicy (in category 'class initialization') ----- > > + clockPolicy > > + > > + ^ClockPolicy! > > > > > |
In reply to this post by Eliot Miranda-2
Hi Eliot,
On Mon, 14 Jan 2019, Eliot Miranda wrote: > Hi Levente, > >> = aDateAndTimeOrTimeStamp >> "Equal if the absolute time values match, regardless of local time transform" >> + >> self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ]. >> + aDateAndTimeOrTimeStamp species == DateAndTime ifFalse: [ ^false ]. >> + aDateAndTimeOrTimeStamp utcMicroseconds = utcMicroseconds ifTrue: [ ^true ]. >> + ^false! >> - ^aDateAndTimeOrTimeStamp species == DateAndTime >> - and: [ utcMicroseconds = aDateAndTimeOrTimeStamp utcMicroseconds ]! > > Can we please avoid the ... ifFalse: [^false] style and keep the much nicer concise and: style? Yes, the former is slightly faster, but not by much, and the JIT has code to minimize the difference and Sista will eliminate the difference. The former style is so ugly. I personally prefer early returns because I find them much more readable: for every boolean term I can tell exactly how it will affect the return value of the method, while that is a lot harder with a single boolean expression. I agree that the last two returns could be simplified into a single return but I see no problem with the rest. Levente |
In reply to this post by David T. Lewis
Thanks Dave. I'll soon upload the changes with or without #=.
Levente On Tue, 15 Jan 2019, David T. Lewis wrote: > This is a good set of cleanups, with an overall performance improvement. > > +1 for moving the changes to trunk, with or without the DateAndTime>>#= change. > > I somewhat agree with Eliot's comment below, although I am happy either way. > > Dave > > > On Mon, Jan 14, 2019 at 07:07:23AM -0800, Eliot Miranda wrote: >> Hi Levente, >> >> > On Jan 14, 2019, at 4:18 AM, [hidden email] wrote: >> > >> > Levente Uzonyi uploaded a new version of Chronology-Core to project The Inbox: >> > http://source.squeak.org/inbox/Chronology-Core-ul.22.mcz >> > >> > ==================== Summary ==================== >> > >> > Name: Chronology-Core-ul.22 >> > Author: ul >> > Time: 14 January 2019, 1:08:48.177246 pm >> > UUID: 025b4802-6281-4674-937e-a345e5a6aded >> > Ancestors: Chronology-Core-ul.21 >> > >> > - added an accessor to Time's ClockPolicy, so that tests can depend on its current value >> > - optimized various DateAndTime methods >> > >> > =============== Diff against Chronology-Core-ul.21 =============== >> > >> > Item was changed: >> > ----- Method: DateAndTime>>= (in category 'ansi protocol') ----- >> > = aDateAndTimeOrTimeStamp >> > "Equal if the absolute time values match, regardless of local time transform" >> > + >> > self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ]. >> > + aDateAndTimeOrTimeStamp species == DateAndTime ifFalse: [ ^false ]. >> > + aDateAndTimeOrTimeStamp utcMicroseconds = utcMicroseconds ifTrue: [ ^true ]. >> > + ^false! >> > - ^aDateAndTimeOrTimeStamp species == DateAndTime >> > - and: [ utcMicroseconds = aDateAndTimeOrTimeStamp utcMicroseconds ]! >> >> Can we please avoid the ... ifFalse: [^false] style and keep the much nicer concise and: style? Yes, the former is slightly faster, but not by much, and the JIT has code to minimize the difference and Sista will eliminate the difference. The former style is so ugly. >> >> > >> > Item was changed: >> > ----- Method: DateAndTime>>asUTC (in category 'ansi protocol') ----- >> > asUTC >> > >> > localOffsetSeconds = 0 ifTrue: [ ^self ]. >> > + ^self copy makeUTC! >> > - ^self copy >> > - utcMicroseconds: utcMicroseconds >> > - offset: 0 >> > - ! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>asUnixTime (in category 'squeak protocol') ----- >> > asUnixTime >> > "answer number of seconds since unix epoch (midnight Jan 1, 1970, UTC)" >> > >> > + ^utcMicroseconds // 1000000! >> > - ^(self - self class unixEpoch) asSeconds! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>dayMonthYearDo: (in category 'squeak protocol') ----- >> > dayMonthYearDo: aBlock >> > "Evaluation the block with three arguments: day month, year." >> > >> > + | l n i j dd | >> > - | l n i j dd mm yyyy | >> > l := self julianDayNumber + 68569. >> > n := 4 * l // 146097. >> > l := l - (146097 * n + 3 // 4). >> > + i := l + 1 * 4000 // 1461001. >> > - i := 4000 * (l + 1) // 1461001. >> > l := l - (1461 * i // 4) + 31. >> > j := 80 * l // 2447. >> > dd := l - (2447 * j // 80). >> > l := j // 11. >> > - mm := j + 2 - (12 * l). >> > - yyyy := 100 * (n - 49) + i + l. >> > >> > ^ aBlock >> > value: dd >> > + value: -12 * l + 2 + j "month" >> > + value: n - 49 * 100 + i + l "year"! >> > - value: mm >> > - value: yyyy! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>floor (in category 'squeak protocol') ----- >> > floor >> > "Answer a copy with magnitude rounded down to the nearest whole second" >> > ^self class >> > + utcMicroseconds: utcMicroseconds // 1000000 * 1000000 >> > - utcMicroseconds: utcMicroseconds - (utcMicroseconds \\ 1000000) >> > offset: localOffsetSeconds! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>getSeconds (in category 'accessing') ----- >> > getSeconds >> > + >> > + ^utcMicroseconds // 1000000 + localOffsetSeconds \\ 86400! >> > - >> > - | posixDays posixSeconds localSeconds | >> > - posixSeconds := utcMicroseconds // 1000000. >> > - localSeconds := posixSeconds + localOffsetSeconds. >> > - localSeconds < 0 ifTrue: [localSeconds := localSeconds \\ SecondsInDay]. "normalize" >> > - posixDays := localSeconds // SecondsInDay. >> > - ^localSeconds - (posixDays * SecondsInDay). >> > - ! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>julianDayNumber (in category 'squeak protocol') ----- >> > julianDayNumber >> > >> > + ^utcMicroseconds // 1000000 + localOffsetSeconds // 86400 + PosixEpochJulianDays! >> > - | posixDays posixSeconds localSeconds negativeDays | >> > - posixSeconds := utcMicroseconds // 1000000. >> > - localSeconds := posixSeconds + localOffsetSeconds. >> > - negativeDays := 0. >> > - localSeconds < 0 ifTrue: [ "normalize" >> > - negativeDays := localSeconds // SecondsInDay. >> > - localSeconds := negativeDays * SecondsInDay + localSeconds]. >> > - posixDays := localSeconds // SecondsInDay. >> > - ^posixDays + PosixEpochJulianDays - negativeDays. >> > - ! >> > >> > Item was changed: >> > ----- Method: DateAndTime>>microsecondsFromDay:seconds:nanos:offset: (in category 'private') ----- >> > microsecondsFromDay: jdn seconds: s nanos: n offset: localOffsetSeconds >> > >> > + ^jdn - PosixEpochJulianDays "days" * 86400 >> > + + s - localOffsetSeconds "seconds" * 1000000 >> > + + (n / 1000) "nanos"! >> > - | days totalSeconds micros | >> > - days := jdn - PosixEpochJulianDays. >> > - totalSeconds := days * 86400 + s - localOffsetSeconds. "n.g. const 86400 is faster than SecondsInDay" >> > - micros := totalSeconds * 1000000. >> > - ^micros + (n / 1000) >> > - ! >> > >> > Item was added: >> > + ----- Method: Time class>>clockPolicy (in category 'class initialization') ----- >> > + clockPolicy >> > + >> > + ^ClockPolicy! >> > >> > >> |
Free forum by Nabble | Edit this page |