-/* Initialize the class stack
- If the class_stack hasn't been allocated yet, allocates a page for pointers
- to be stored in. Initializes class stack pointer, and inserts the root class
- from IR
- Returns the root class given by IR.
-*/
-static
-ir_class class_stack_init
-( void )
-{ if (class_stack == NULL)
- { class_stack_size = (size_t) sys_pagesize;
- class_stack = (ir_class*) malloc(class_stack_size);
- if (class_stack == NULL)
- { yyerror(ERR_MEM);
- exit(1);
- }
- }
- csp = class_stack;
- return class_stack_push(ir_class_root());
-}
-
-/* Add a Class to the Stack
- Allocated in page-sized chunks, potentially infinite depth is supported.
- Returns the input class.
-*/
-static
-ir_class class_stack_push
-#define class_size (sizeof(*class_stack))
-( ir_class class )
-{ size_t class_stack_len = csp - class_stack;
- ir_class* new_class_stack;
- if ((class_stack_len * class_size + class_size) > class_stack_size)
- { class_stack_size += (size_t) sys_pagesize;
- new_class_stack = (ir_class*) realloc(class_stack, class_stack_size);
- if (new_class_stack == NULL)
- { free(class_stack); //realloc failure does not free class_stack
- yyerror("realloc " ERR_MEM);
- exit(1);
- }
- class_stack = new_class_stack;
- csp = class_stack + class_stack_len;
- }
- return (*csp++ = class);
-}
-
-yycstate*
-yycstate_new