mirror of
				https://github.com/pocketpy/pocketpy
				synced 2025-10-31 08:50:17 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "9a23eb6c9e329b7e6153c7bab2c007738f6cda9b" and "a55f62c86091d32d7bef918306fd71fa80d92d17" have entirely different histories.
		
	
	
		
			9a23eb6c9e
			...
			a55f62c860
		
	
		
| @ -4,7 +4,6 @@ | |||||||
| #include "pocketpy/interpreter/vm.h" | #include "pocketpy/interpreter/vm.h" | ||||||
| #include "pocketpy/common/sstream.h" | #include "pocketpy/common/sstream.h" | ||||||
| #include "pocketpy/objects/codeobject.h" | #include "pocketpy/objects/codeobject.h" | ||||||
| #include "pocketpy/objects/exception.h" |  | ||||||
| #include "pocketpy/pocketpy.h" | #include "pocketpy/pocketpy.h" | ||||||
| #include "pocketpy/objects/error.h" | #include "pocketpy/objects/error.h" | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| @ -821,8 +820,7 @@ __NEXT_STEP: | |||||||
|                 return RES_YIELD; |                 return RES_YIELD; | ||||||
|             } else { |             } else { | ||||||
|                 assert(self->last_retval.type == tp_StopIteration); |                 assert(self->last_retval.type == tp_StopIteration); | ||||||
|                 BaseException* ud = py_touserdata(py_retval()); |                 py_ObjectRef value = py_getslot(&self->last_retval, 0); | ||||||
|                 py_ObjectRef value = &ud->args; |  | ||||||
|                 if(py_isnil(value)) value = py_None(); |                 if(py_isnil(value)) value = py_None(); | ||||||
|                 *TOP() = *value;  // [iter] -> [retval]
 |                 *TOP() = *value;  // [iter] -> [retval]
 | ||||||
|                 DISPATCH_JUMP((int16_t)byte.arg); |                 DISPATCH_JUMP((int16_t)byte.arg); | ||||||
|  | |||||||
| @ -635,8 +635,7 @@ void ManagedHeap__mark(ManagedHeap* self) { | |||||||
|     assert(p_stack->length == 0); |     assert(p_stack->length == 0); | ||||||
| 
 | 
 | ||||||
|     // mark value stack
 |     // mark value stack
 | ||||||
|     for(py_TValue* p = vm->stack.begin; p < vm->stack.sp; p++) { |     for(py_TValue* p = vm->stack.begin; p != vm->stack.end; p++) { | ||||||
|         // assert(p->type != tp_nil);
 |  | ||||||
|         pk__mark_value(p); |         pk__mark_value(p); | ||||||
|     } |     } | ||||||
|     // mark modules
 |     // mark modules
 | ||||||
|  | |||||||
| @ -5,29 +5,27 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| 
 | 
 | ||||||
| #define HASH_KEY(__k) ((uintptr_t)(__k) >> 3U) |  | ||||||
| 
 |  | ||||||
| #define HASH_PROBE_0(__k, ok, i)                                                                   \ | #define HASH_PROBE_0(__k, ok, i)                                                                   \ | ||||||
|     ok = false;                                                                                    \ |     ok = false;                                                                                    \ | ||||||
|     i = HASH_KEY(__k) & self->mask;                                                                \ |     i = (uintptr_t)(__k)&self->mask;                                                               \ | ||||||
|     do {                                                                                           \ |     do {                                                                                           \ | ||||||
|         if(self->items[i].key == (__k)) {                                                          \ |         if(self->items[i].key == (__k)) {                                                          \ | ||||||
|             ok = true;                                                                             \ |             ok = true;                                                                             \ | ||||||
|             break;                                                                                 \ |             break;                                                                                 \ | ||||||
|         }                                                                                          \ |         }                                                                                          \ | ||||||
|         if(self->items[i].key == NULL) break;                                                      \ |         if(self->items[i].key == NULL) break;                                                      \ | ||||||
|         i = (i + 1) & self->mask;                                                                  \ |         i = (5 * i + 1) & self->mask;                                                              \ | ||||||
|     } while(true); |     } while(true); | ||||||
| 
 | 
 | ||||||
| #define HASH_PROBE_1(__k, ok, i)                                                                   \ | #define HASH_PROBE_1(__k, ok, i)                                                                   \ | ||||||
|     ok = false;                                                                                    \ |     ok = false;                                                                                    \ | ||||||
|     i = HASH_KEY(__k) & self->mask;                                                                \ |     i = (uintptr_t)(__k)&self->mask;                                                               \ | ||||||
|     while(self->items[i].key != NULL) {                                                            \ |     while(self->items[i].key != NULL) {                                                            \ | ||||||
|         if(self->items[i].key == (__k)) {                                                          \ |         if(self->items[i].key == (__k)) {                                                          \ | ||||||
|             ok = true;                                                                             \ |             ok = true;                                                                             \ | ||||||
|             break;                                                                                 \ |             break;                                                                                 \ | ||||||
|         }                                                                                          \ |         }                                                                                          \ | ||||||
|         i = (i + 1) & self->mask;                                                                  \ |         i = (5 * i + 1) & self->mask;                                                              \ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| static void NameDict__set_capacity_and_alloc_items(NameDict* self, int val) { | static void NameDict__set_capacity_and_alloc_items(NameDict* self, int val) { | ||||||
| @ -113,12 +111,12 @@ bool NameDict__del(NameDict* self, py_Name key) { | |||||||
|     self->items[i].value = *py_NIL(); |     self->items[i].value = *py_NIL(); | ||||||
|     self->length--; |     self->length--; | ||||||
|     /* tidy */ |     /* tidy */ | ||||||
|     uintptr_t posToRemove = i; |     uint32_t posToRemove = i; | ||||||
|     uintptr_t posToShift = posToRemove; |     uint32_t posToShift = posToRemove; | ||||||
|     while(true) { |     while(true) { | ||||||
|         posToShift = (posToShift + 1) & self->mask; |         posToShift = (5 * posToShift + 1) & self->mask; | ||||||
|         if(self->items[posToShift].key == NULL) break; |         if(self->items[posToShift].key == NULL) break; | ||||||
|         uintptr_t hash_z = HASH_KEY(self->items[posToShift].key); |         uintptr_t hash_z = (uintptr_t)self->items[posToShift].key; | ||||||
|         uintptr_t insertPos = hash_z & self->mask; |         uintptr_t insertPos = hash_z & self->mask; | ||||||
|         bool cond1 = insertPos <= posToRemove; |         bool cond1 = insertPos <= posToRemove; | ||||||
|         bool cond2 = posToRemove <= posToShift; |         bool cond2 = posToRemove <= posToShift; | ||||||
| @ -126,7 +124,6 @@ bool NameDict__del(NameDict* self, py_Name key) { | |||||||
|            // chain wrapped around capacity
 |            // chain wrapped around capacity
 | ||||||
|            (posToShift < insertPos && (cond1 || cond2))) { |            (posToShift < insertPos && (cond1 || cond2))) { | ||||||
|             NameDict_KV tmp = self->items[posToRemove]; |             NameDict_KV tmp = self->items[posToRemove]; | ||||||
|             assert(tmp.key == NULL); |  | ||||||
|             self->items[posToRemove] = self->items[posToShift]; |             self->items[posToRemove] = self->items[posToShift]; | ||||||
|             self->items[posToShift] = tmp; |             self->items[posToShift] = tmp; | ||||||
|             posToRemove = posToShift; |             posToRemove = posToShift; | ||||||
| @ -145,4 +142,3 @@ void NameDict__clear(NameDict* self) { | |||||||
| 
 | 
 | ||||||
| #undef HASH_PROBE_0 | #undef HASH_PROBE_0 | ||||||
| #undef HASH_PROBE_1 | #undef HASH_PROBE_1 | ||||||
| #undef HASH_KEY |  | ||||||
| @ -20,14 +20,9 @@ void py_BaseException__stpush(py_Frame* frame, | |||||||
|     frame_dump->lineno = lineno; |     frame_dump->lineno = lineno; | ||||||
|     frame_dump->name = func_name ? c11_string__new(func_name) : NULL; |     frame_dump->name = func_name ? c11_string__new(func_name) : NULL; | ||||||
| 
 | 
 | ||||||
|     if(py_debugger_isattached()) { |     if(py_debugger_isattached() && frame != NULL) { | ||||||
|         if(frame != NULL) { |         py_Frame_newlocals(frame, &frame_dump->locals); | ||||||
|             py_Frame_newlocals(frame, &frame_dump->locals); |         py_Frame_newglobals(frame, &frame_dump->globals); | ||||||
|             py_Frame_newglobals(frame, &frame_dump->globals); |  | ||||||
|         } else { |  | ||||||
|             py_newdict(&frame_dump->locals); |  | ||||||
|             py_newdict(&frame_dump->globals); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -166,16 +166,3 @@ for i in range(len(data)): | |||||||
|     if i % 3 == 0: |     if i % 3 == 0: | ||||||
|         y = b.pop() |         y = b.pop() | ||||||
|         delattr(a, y) |         delattr(a, y) | ||||||
| 
 |  | ||||||
| # bug test |  | ||||||
| d = { |  | ||||||
|     '__name__': '__main__', |  | ||||||
|     '__package__': '', |  | ||||||
|     '__path__': '__main__', |  | ||||||
|     'a': [], |  | ||||||
|     'gc': 1, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| del d['a'] |  | ||||||
| assert 'a' not in d |  | ||||||
| assert d['gc'] == 1 |  | ||||||
| @ -1,35 +0,0 @@ | |||||||
| # a=[] |  | ||||||
| # import gc |  | ||||||
| # gc.collect() |  | ||||||
| 
 |  | ||||||
| # # a.append(a) |  | ||||||
| # print(globals().items()) |  | ||||||
| # del a |  | ||||||
| # print(list(globals().items())) |  | ||||||
| # print(globals()['gc']) |  | ||||||
| # gc.collect() |  | ||||||
| 
 |  | ||||||
| d = object() |  | ||||||
| d.__name__ = '__main__' |  | ||||||
| d.__package__ = '' |  | ||||||
| d.__path__ = '__main__' |  | ||||||
| d.a = [] |  | ||||||
| d.gc = 1 |  | ||||||
| 
 |  | ||||||
| print('-' * 100) |  | ||||||
| assert d.gc == 1 |  | ||||||
| del d.a |  | ||||||
| 
 |  | ||||||
| assert not hasattr(d, 'a') |  | ||||||
| assert d.gc == 1 |  | ||||||
| 
 |  | ||||||
| # [0, 1, 6, 7, 4, 5, 2, 3] |  | ||||||
| 
 |  | ||||||
| # 0 __name__      [0] |  | ||||||
| # 1 __package__   [1] |  | ||||||
| # 2 nil |  | ||||||
| # 3 nil |  | ||||||
| # 4 gc            [4] |  | ||||||
| # 5 nil |  | ||||||
| # 6 __path__      [2] |  | ||||||
| # 7 a             [3] |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user