[AI Task] [Tizen.Pims.Contacts] Remove Convert.ChangeType boxing from ContactsRecord Get/Set - #7762
[AI Task] [Tizen.Pims.Contacts] Remove Convert.ChangeType boxing from ContactsRecord Get/Set#7762JoonghyunCho wants to merge 2 commits into
Conversation
…actsRecord Get/Set (Fixes #7667) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Benchmark skipped: no sdb device is connected in the CI/bot environment (sdb devices returned an empty list), so the comparative benchmark could not be deployed or run. Manual benchmark verification is required. Expected direction is strictly non-regressive: the change removes Convert.ChangeType/IConvertible dispatch and CultureInfo lookups from every Get/Set call and eliminates the boxing allocation on the Get/Set paths. |
There was a problem hiding this comment.
Code Review
This pull request refactors the generic Get<T> and Set<T> methods in ContactsRecord.cs to replace Convert helper methods with direct casting, which simplifies the code and avoids unnecessary conversion overhead. The reviewer suggested a more idiomatic C# approach for the string conversion in Set<T> by using the as operator directly on the generic parameter instead of casting it to object first.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| if (typeof(T) == typeof(string)) | ||
| { | ||
| string val = Convert.ToString(value); | ||
| string val = (string)(object)value ?? string.Empty; |
| @@ -255,14 +254,13 @@ public T Get<T>(uint propertyId) | |||
| Log.Error(Globals.LogTag, $"Get Long Failed with error {error}"); | |||
There was a problem hiding this comment.
🤖 [AI Review]
🟡 Suggestion: Pre-existing copy-paste in this double branch logs "Get Long Failed"; since this PR already rewrites these branches, it is worth fixing here (the Set double branch at line 323 has the same "Get Long" text).
| Log.Error(Globals.LogTag, $"Get Long Failed with error {error}"); | |
| Log.Error(Globals.LogTag, $"Get Double Failed with error {error}"); |
There was a problem hiding this comment.
🤖 [AI Review]
Addressed in 3aa053e — the Get double branch now logs "Get Double Failed" and the Set double branch logs "Set Double Failed".
Fix copy-paste log messages in the double branches of Get<T>/Set<T> and use 'as' cast for the string path in Set<T> Applied-Human-Comments: 3610427947 Applied-AI-Comments: 3611527170
|
🤖 [AI Review] |
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
Public API ChangedPlease follow the ACR process for the changed API below. Added: 0, Removed: 43, Changed: 0Removed- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.AttachPanel
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Boolean Tizen.Applications.AttachPanel.AttachPanel::Visible()
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.StateType Tizen.Applications.AttachPanel.AttachPanel::State()
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::.ctor(ElmSharp.Conformant)
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::.ctor(ElmSharp.EvasObject)
- /// <privilege>http://tizen.org/privilege/appmanager.launch</privilege
- /// <privilege>http://tizen.org/privilege/camera</privilege
- /// <privilege>http://tizen.org/privilege/mediastorage</privilege
- /// <privilege>http://tizen.org/privilege/recorder</privilege
- /// <privilege>http://tizen.org/privilege/telephony</privilege
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <privilege>http://tizen.org/feature/camera</privilege
- /// <privilege>http://tizen.org/feature/microphone</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::AddCategory(Tizen.Applications.AttachPanel.ContentCategory,Tizen.Applications.Bundle)
- /// <since_tizen>none</since_tizen
- System.Void Tizen.Applications.AttachPanel.AttachPanel::Finalize()
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::Hide()
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::Hide(System.Boolean)
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::RemoveCategory(Tizen.Applications.AttachPanel.ContentCategory)
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::SetExtraData(Tizen.Applications.AttachPanel.ContentCategory,Tizen.Applications.Bundle)
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::Show()
- /// <privilege>http://tizen.org/feature/attach_panel</privilege
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.Void Tizen.Applications.AttachPanel.AttachPanel::Show(System.Boolean)
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.EventHandler`1<Tizen.Applications.AttachPanel.ResultEventArgs> Tizen.Applications.AttachPanel.AttachPanel::ResultCallback
- /// <since_tizen>4</since_tizen
- [Obsolete]
- System.EventHandler`1<Tizen.Applications.AttachPanel.StateEventArgs> Tizen.Applications.AttachPanel.AttachPanel::EventChanged
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.ContentCategory
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Audio
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Calendar
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Camera
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Contact
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Document
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Image
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Memo
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Myfiles
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::TakePicture
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Video
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::VideoRecorder
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ContentCategory::Voice
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.EventType
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.EventType Tizen.Applications.AttachPanel.EventType::HideFinish
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.EventType Tizen.Applications.AttachPanel.EventType::HideStart
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.EventType Tizen.Applications.AttachPanel.EventType::ShowFinish
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.EventType Tizen.Applications.AttachPanel.EventType::ShowStart
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.ResultEventArgs
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AppControl Tizen.Applications.AttachPanel.ResultEventArgs::Result()
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AppControlReplyResult Tizen.Applications.AttachPanel.ResultEventArgs::ResultCode()
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.ContentCategory Tizen.Applications.AttachPanel.ResultEventArgs::Category()
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.StateEventArgs
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.EventType Tizen.Applications.AttachPanel.StateEventArgs::EventType()
- /// <since_tizen>4</since_tizen
- [Obsolete]
- Tizen.Applications.AttachPanel.StateType
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.StateType Tizen.Applications.AttachPanel.StateType::Full
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.StateType Tizen.Applications.AttachPanel.StateType::Hidden
- /// <since_tizen>none</since_tizen
- static Tizen.Applications.AttachPanel.StateType Tizen.Applications.AttachPanel.StateType::Partial
Internal API ChangedAdded: 1, Removed: 0, Changed: 0Added+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.LottieAnimationView::RefreshDynamicProperty()
|
Summary
Removes the
Convert.ChangeType/Convert.To*conversion paths fromContactsRecord.Get<T>(uint)andSet<T>(uint, T). Each branch already verifies the exact type viatypeof(T) == typeof(X), so the value is converted with a direct cast ((T)(object)val) instead of going through the culture-awareIConvertibledispatch.Get<T>also drops the intermediateobject parsedValuelocal and returns directly from each branch.Per-call effect (e.g.
Get<int>): noConvert.ChangeTypecall, noIConvertiblevtable dispatch, noCultureInfolookup. ForGet<string>/Set<string>the boxing allocation disappears entirely (reference-type cast).ContactsRecordproperty access is the per-field unit of contact serialization, so bulk sync/import workloads (10k records × ~10 properties) save hundreds of thousands of dispatch/boxing operations.Changes
src/Tizen.Pims.Contacts/Tizen.Pims.Contacts/ContactsRecord.csGet<T>: each type branch now ends withreturn (T)(object)val;; removedobject parsedValuelocal,Convert.ChangeTypecalls (5), and the trailing unboxreturn (T)parsedValue;. Unsupported-type branch still throwsNotSupportedas before.Set<T>:Convert.ToString/ToInt32/ToBoolean/ToInt64/ToDoublereplaced with direct casts. The string branch uses(string)(object)value ?? string.Emptyto preserve the exact prior behavior ofConvert.ToString(object), which mapsnulltostring.Empty(so nativeSetStrstill receives an empty string, notnull).Mode
Refactoring
Verification
Public API signatures (
T Get<T>(uint),void Set<T>(uint, T)) are unchanged. Every direct cast is guarded by the exacttypeof(T)check, so noInvalidCastExceptionis reachable on paths that previously succeeded; normal-path results are bit-identical, includingGet<string>returningnullwhen the native value isNULL.Fixes #7667
🤖 Generated with Claude Code