Browse Source

fix a bug of `large_objects`

blueloveTH 1 year ago
parent
commit
60802a8e36

+ 1 - 1
include/pocketpy/interpreter/heap.h

@@ -3,7 +3,7 @@
 
 typedef struct ManagedHeap {
     MultiPool small_objects;
-    c11_vector large_objects;
+    c11_vector /* PyObject* */ large_objects;
 
     int freed_ma[3];
     int gc_threshold;  // threshold for gc_counter

+ 2 - 3
src/interpreter/heap.c

@@ -63,14 +63,13 @@ int ManagedHeap__sweep(ManagedHeap* self) {
         } else {
             PyObject__dtor(obj);
             PK_FREE(obj);
-            // type and module objects are perpectual
-            assert(obj->type != tp_type);
-            assert(obj->type != tp_module);
         }
     }
     // shrink `self->large_objects`
     int large_freed = self->large_objects.length - large_living_count;
     self->large_objects.length = large_living_count;
+    // printf("large_freed=%d\n", large_freed);
+    // printf("small_freed=%d\n", small_freed);
     return small_freed + large_freed;
 }
 

+ 0 - 5
src/interpreter/vm.c

@@ -636,11 +636,6 @@ void CodeObject__gc_mark(const CodeObject* self) {
 
 void ManagedHeap__mark(ManagedHeap* self) {
     VM* vm = pk_current_vm;
-    // mark large objects
-    for(int i = 0; i < self->large_objects.length; i++) {
-        PyObject* obj = c11__getitem(PyObject*, &self->large_objects, i);
-        mark_object(obj);
-    }
     // mark value stack
     for(py_TValue* p = vm->stack.begin; p != vm->stack.end; p++) {
         pk__mark_value(p);

+ 4 - 2
src/modules/pkpy.c

@@ -45,8 +45,10 @@ static bool pkpy_memory_usage(int argc, py_Ref argv) {
     c11_sbuf__write_cstr(&buf, "== heap.small_objects ==\n");
     c11_sbuf__write_cstr(&buf, small_objects_usage->data);
     c11_sbuf__write_cstr(&buf, "== heap.large_objects ==\n");
-    c11_sbuf__write_cstr(&buf, "len(large_objects)=");
-    c11_sbuf__write_int(&buf, large_object_count);
+    pk_sprintf(&buf, "len(large_objects)=%d\n", large_object_count);
+    c11_sbuf__write_cstr(&buf, "== heap.gc ==\n");
+    pk_sprintf(&buf, "gc_counter=%d\n", heap->gc_counter);
+    pk_sprintf(&buf, "gc_threshold=%d", heap->gc_threshold);
     // c11_sbuf__write_cstr(&buf, "== vm.pool_frame ==\n");
     c11_sbuf__py_submit(&buf, py_retval());
     c11_string__delete(small_objects_usage);

+ 2 - 2
src/public/modules.c

@@ -204,13 +204,13 @@ static bool builtins_input(int argc, py_Ref argv) {
         if(!py_checkstr(argv)) return false;
         prompt = py_tostr(argv);
     }
-    printf("%s", prompt);
+    pk_current_vm->callbacks.print(prompt);
 
     c11_sbuf buf;
     c11_sbuf__ctor(&buf);
     while(true) {
         int c = pk_current_vm->callbacks.getchar();
-        if(c == '\n') break;
+        if(c == '\n' || c == '\r') break;
         if(c == EOF) break;
         c11_sbuf__write_char(&buf, c);
     }