]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani.mdc
oceani: improve reporting of variables being freed at end of block.
[ocean] / csrc / oceani.mdc
index 0eaa9c8952623a0364d61689d423dce1a7b560c4..76c8c9b4efd96414511685e620c4d7b7e849acbd 100644 (file)
@@ -236,6 +236,11 @@ structures can be used.
                        }
                } else
                        ss = s;                         // NOTEST
+               if (!ss->code) {
+                       fprintf(stderr, "oceani: no code found in requested section\n");        // NOTEST
+                       exit(1);                        // NOTEST
+               }
+
                parse_oceani(ss->code, &context.config, dotrace ? stderr : NULL);
 
                if (!context.prog) {
@@ -1148,6 +1153,7 @@ all pending-scope variables become conditionally scoped.
                v->scope = InScope;
                v->in_scope = c->in_scope;
                c->in_scope = v;
+               ## variable init
                return v;
        }
 
@@ -1294,9 +1300,15 @@ the frame needs to be reallocated as it grows so it can store those
 values.  The local frame doesn't get values until the interpreted phase
 is started, so there is no need to allocate until the size is known.
 
+We initialize the `frame_pos` to an impossible value, so that we can
+tell if it was set or not later.
+
 ###### variable fields
-               short frame_pos;
-               short global;
+       short frame_pos;
+       short global;
+
+###### variable init
+       v->frame_pos = -1;
 
 ###### parse context
 
@@ -1533,10 +1545,12 @@ also want to know what sort of bracketing to use.
                if (e->to_free) {
                        struct variable *v;
                        do_indent(indent, "/* FREE");
-                       for (v = e->to_free; v; v = v->next_free)
-                               printf(" %.*s(%c%d+%d)", v->name->name.len, v->name->name.txt,
-                                      v->global ? 'G':'L',
-                                      v->frame_pos, v->type ? v->type->size:0);
+                       for (v = e->to_free; v; v = v->next_free) {
+                               printf(" %.*s", v->name->name.len, v->name->name.txt);
+                               if (v->frame_pos >= 0)
+                                       printf("(%d+%d)", v->frame_pos,
+                                              v->type ? v->type->size:0);
+                       }
                        printf(" */\n");
                }
        }