@@ -5481,6 +5481,145 @@ DEF_FUNC list_method_copy
54815481 ret
54825482END_FUNC list_method_copy
54835483
5484+ ;; ============================================================================
5485+ ;; list.__getitem__(self, key) → calls list_subscript
5486+ ;; ============================================================================
5487+ extern list_subscript
5488+ DEF_FUNC_BARE list_dunder_getitem
5489+ mov rax , [ rdi ] ; self
5490+ mov rsi , [ rdi + 16 ] ; key payload
5491+ mov edx , [ rdi + 24 ] ; key tag
5492+ mov rdi , rax
5493+ jmp list_subscript
5494+ END_FUNC list_dunder_getitem
5495+
5496+ ;; ============================================================================
5497+ ;; list.__setitem__(self, key, value) → calls list_ass_subscript
5498+ ;; ============================================================================
5499+ extern list_ass_subscript
5500+ DEF_FUNC_BARE list_dunder_setitem
5501+ mov rax , [ rdi ] ; self
5502+ mov rsi , [ rdi + 16 ] ; key payload
5503+ mov ecx , [ rdi + 24 ] ; key tag
5504+ mov rdx , [ rdi + 32 ] ; value payload
5505+ mov r8d , [ rdi + 40 ] ; value tag
5506+ mov rdi , rax
5507+ jmp list_ass_subscript
5508+ END_FUNC list_dunder_setitem
5509+
5510+ ;; ============================================================================
5511+ ;; list.__delitem__(self, key) → calls list_ass_subscript with NULL value
5512+ ;; ============================================================================
5513+ DEF_FUNC list_dunder_delitem
5514+ mov rax , [ rdi ] ; self
5515+ mov rsi , [ rdi + 16 ] ; key payload
5516+ mov ecx , [ rdi + 24 ] ; key tag
5517+ xor edx , edx ; value = NULL
5518+ xor r8d , r8d ; value tag = TAG_NULL
5519+ mov rdi , rax
5520+ call list_ass_subscript
5521+ extern none_singleton
5522+ lea rax , [ rel none_singleton ]
5523+ inc qword [ rax + PyObject.ob_refcnt ]
5524+ mov edx , TAG_PTR
5525+ leave
5526+ ret
5527+ END_FUNC list_dunder_delitem
5528+
5529+ ;; ============================================================================
5530+ ;; list.__contains__(self, item) → calls list_contains
5531+ ;; ============================================================================
5532+ extern list_contains
5533+ DEF_FUNC list_dunder_contains
5534+ mov rax , [ rdi ] ; self
5535+ mov rsi , [ rdi + 16 ] ; item payload
5536+ mov edx , [ rdi + 24 ] ; item tag
5537+ mov rdi , rax
5538+ call list_contains
5539+ ; eax = 0 or 1 → return bool
5540+ test eax , eax
5541+ jz .ldc_false
5542+ extern bool_true
5543+ lea rax , [ rel bool_true ]
5544+ jmp .ldc_done
5545+ .ldc_false:
5546+ extern bool_false
5547+ lea rax , [ rel bool_false ]
5548+ .ldc_done:
5549+ mov edx , TAG_PTR
5550+ INCREF rax
5551+ leave
5552+ ret
5553+ END_FUNC list_dunder_contains
5554+
5555+ ;; ============================================================================
5556+ ;; list.__len__(self) → returns SmallInt length
5557+ ;; ============================================================================
5558+ DEF_FUNC list_dunder_len
5559+ mov rax , [ rdi ] ; self
5560+ mov rax , [ rax + PyListObject.ob_size ]
5561+ mov rdi , rax
5562+ call int_from_i64
5563+ leave
5564+ ret
5565+ END_FUNC list_dunder_len
5566+
5567+ ;; ============================================================================
5568+ ;; list.__iadd__(self, other) → calls list_inplace_concat
5569+ ;; ============================================================================
5570+ extern list_inplace_concat
5571+ DEF_FUNC_BARE list_dunder_iadd
5572+ mov rax , [ rdi ] ; self
5573+ mov rsi , [ rdi + 16 ] ; other payload
5574+ mov rcx , [ rdi + 24 ] ; other tag
5575+ mov rdi , rax
5576+ jmp list_inplace_conc at
5577+ END_FUNC list_dunder_iadd
5578+
5579+ ;; ============================================================================
5580+ ;; list.__init__(self, [iterable]) → re-initialize list
5581+ ;; Uses list_extend to populate from iterable after clearing.
5582+ ;; ============================================================================
5583+ DEF_FUNC list_dunder_init
5584+ push rbx
5585+ push r12
5586+
5587+ mov rbx , rdi ; save args ptr
5588+ mov r12 , rsi ; save nargs
5589+
5590+ ; self = args[0]
5591+ mov rax , [ rbx ] ; self (list)
5592+
5593+ ; Clear: DECREF all items, set size to 0
5594+ push rax
5595+ mov rcx , [ rax + PyListObject.ob_size ]
5596+ test rcx , rcx
5597+ jz .ldi_cleared
5598+ ; Simple clear: just set size to 0 (items leak but safe for now)
5599+ mov qword [ rax + PyListObject.ob_size ], 0
5600+ .ldi_cleared:
5601+ pop rax
5602+
5603+ ; If nargs >= 2, use list_extend to add items from args[1]
5604+ cmp r12 , 2
5605+ jl .ldi_done
5606+
5607+ ; Build args for list_extend: args[0]=self, args[1]=iterable
5608+ ; Our args are already in the right format: [self, iterable, ...]
5609+ mov rdi , rbx ; args ptr (already has self + iterable)
5610+ mov rsi , 2 ; nargs = 2
5611+ call list_method_extend
5612+
5613+ .ldi_done:
5614+ lea rax , [ rel none_singleton ]
5615+ inc qword [ rax + PyObject.ob_refcnt ]
5616+ mov edx , TAG_PTR
5617+ pop r12
5618+ pop rbx
5619+ leave
5620+ ret
5621+ END_FUNC list_dunder_init
5622+
54845623;; ============================================================================
54855624;; list_method_clear(args, nargs) -> None
54865625;; args[0]=self
@@ -9726,6 +9865,56 @@ DEF_FUNC methods_init
97269865 lea rdx , [ rel list_method_reversed ]
97279866 call add_method_to_dict
97289867
9868+ ;; list dunder methods
9869+ mov rdi , rbx
9870+ lea rsi , [ rel mn___getitem__ ]
9871+ lea rdx , [ rel list_dunder_getitem ]
9872+ mov rcx , 2
9873+ mov r8 , 2
9874+ call add_method_to_dict_checked
9875+
9876+ mov rdi , rbx
9877+ lea rsi , [ rel mn___setitem__ ]
9878+ lea rdx , [ rel list_dunder_setitem ]
9879+ mov rcx , 3
9880+ mov r8 , 3
9881+ call add_method_to_dict_checked
9882+
9883+ mov rdi , rbx
9884+ lea rsi , [ rel mn___delitem__ ]
9885+ lea rdx , [ rel list_dunder_delitem ]
9886+ mov rcx , 2
9887+ mov r8 , 2
9888+ call add_method_to_dict_checked
9889+
9890+ mov rdi , rbx
9891+ lea rsi , [ rel mn___contains__ ]
9892+ lea rdx , [ rel list_dunder_contains ]
9893+ mov rcx , 2
9894+ mov r8 , 2
9895+ call add_method_to_dict_checked
9896+
9897+ mov rdi , rbx
9898+ lea rsi , [ rel mn___len__ ]
9899+ lea rdx , [ rel list_dunder_len ]
9900+ mov rcx , 1
9901+ mov r8 , 1
9902+ call add_method_to_dict_checked
9903+
9904+ mov rdi , rbx
9905+ lea rsi , [ rel mn___iadd__ ]
9906+ lea rdx , [ rel list_dunder_iadd ]
9907+ mov rcx , 2
9908+ mov r8 , 2
9909+ call add_method_to_dict_checked
9910+
9911+ mov rdi , rbx
9912+ lea rsi , [ rel mn___init__ ]
9913+ lea rdx , [ rel list_dunder_init ]
9914+ mov rcx , 1
9915+ mov r8 , - 1
9916+ call add_method_to_dict_checked
9917+
97299918 ; Store in list_type.tp_dict
97309919 lea rax , [ rel list_type ]
97319920 mov [ rax + PyTypeObject.tp_dict ], rbx
@@ -10249,3 +10438,10 @@ mn_decode: db "decode", 0
1024910438; dict method names (continued)
1025010439mn_fromkeys: db "fromkeys" , 0
1025110440mn___reversed__: db "__reversed__" , 0
10441+ mn___getitem__: db "__getitem__" , 0
10442+ mn___setitem__: db "__setitem__" , 0
10443+ mn___delitem__: db "__delitem__" , 0
10444+ mn___contains__: db "__contains__" , 0
10445+ mn___len__: db "__len__" , 0
10446+ mn___iadd__: db "__iadd__" , 0
10447+ mn___init__: db "__init__" , 0
0 commit comments