Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 12344) +++ trunk/src/layer.c (revision 12345) @@ -207,14 +207,9 @@ /* bound layer: if it is already bound to a real layer, use that, whatever it is (manual binding may override our local type match pattern) */ if (layer->meta.bound.real != NULL) { - int rec = 0; - while(layer->is_bound) { - layer = layer->meta.bound.real; - rec++; - if ((rec > PCB_MAX_BOUND_LAYER_RECURSION) || (layer == 0)) - return 0; - } - + layer = pcb_layer_get_real(layer); + if (layer == NULL) + return 0; return pcb_layer_flags_(layer); /* tail recursion */ } Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 12344) +++ trunk/src/layer.h (revision 12345) @@ -28,8 +28,6 @@ #ifndef PCB_LAYER_H #define PCB_LAYER_H -/* How deep subcs can be nested */ -#define PCB_MAX_BOUND_LAYER_RECURSION 128 typedef long int pcb_layer_id_t; typedef long int pcb_layergrp_id_t; @@ -268,6 +266,25 @@ /* Open the attribute editor for a layer */ void pcb_layer_edit_attrib(pcb_layer_t *layer); + +/* How deep subcs can be nested */ +#define PCB_MAX_BOUND_LAYER_RECURSION 128 + +/* Return the real layer, resolving layer bindings. Returns NULL on + error (e.g. binding loop) */ +static inline PCB_FUNC_UNUSED pcb_layer_t *pcb_layer_get_real(pcb_layer_t *layer) +{ + int rec = 0; + + while(layer->is_bound) { + layer = layer->meta.bound.real; + rec++; + if ((rec > PCB_MAX_BOUND_LAYER_RECURSION) || (layer == NULL)) + return NULL; + } + return layer; +} + /* list of virtual layers: these are generated by the draw code but do not have a real layer in the array */ typedef struct pcb_virt_layer_s {