]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/build/src/engine/class.cpp
2 * Copyright Vladimir Prus 2003.
3 * Distributed under the Boost Software License, Version 1.0.
4 * (See accompanying file LICENSE_1_0.txt or copy at
5 * http://www.boost.org/LICENSE_1_0.txt)
10 #include "constants.h"
24 static struct hash
* classes
= 0;
27 static void check_defined( LIST
* class_names
)
29 LISTITER iter
= list_begin( class_names
);
30 LISTITER
const end
= list_end( class_names
);
31 for ( ; iter
!= end
; iter
= list_next( iter
) )
33 if ( !hash_find( classes
, list_item( iter
) ) )
35 out_printf( "Class %s is not defined\n", object_str( list_item( iter
) )
43 static OBJECT
* class_module_name( OBJECT
* declared_name
)
49 string_append( name
, "class@" );
50 string_append( name
, object_str( declared_name
) );
52 result
= object_new( name
->value
);
59 struct import_base_data
62 module_t
* base_module
;
63 module_t
* class_module
;
67 static void import_base_rule( void * r_
, void * d_
)
69 RULE
* r
= (RULE
*)r_
;
72 struct import_base_data
* d
= (struct import_base_data
*)d_
;
75 string qualified_name
[ 1 ];
76 string_new ( qualified_name
);
77 string_append ( qualified_name
, object_str( d
->base_name
) );
78 string_push_back( qualified_name
, '.' );
79 string_append ( qualified_name
, object_str( r
->name
) );
80 qname
= object_new( qualified_name
->value
);
81 string_free( qualified_name
);
83 ir1
= import_rule( r
, d
->class_module
, r
->name
);
84 ir2
= import_rule( r
, d
->class_module
, qname
);
88 /* Copy 'exported' flag. */
89 ir1
->exported
= ir2
->exported
= r
->exported
;
91 /* If we are importing a class method, localize it. */
92 if ( ( r
->module
== d
->base_module
) || ( r
->module
->class_module
&&
93 ( r
->module
->class_module
== d
->base_module
) ) )
95 rule_localize( ir1
, d
->class_module
);
96 rule_localize( ir2
, d
->class_module
);
102 * For each exported rule 'n', declared in class module for base, imports that
103 * rule in 'class' as 'n' and as 'base.n'. Imported rules are localized and
104 * marked as exported.
107 static void import_base_rules( module_t
* class_
, OBJECT
* base
)
109 OBJECT
* module_name
= class_module_name( base
);
110 module_t
* base_module
= bindmodule( module_name
);
112 struct import_base_data d
;
114 d
.base_module
= base_module
;
115 d
.class_module
= class_
;
116 object_free( module_name
);
118 if ( base_module
->rules
)
119 hashenumerate( base_module
->rules
, import_base_rule
, &d
);
121 imported
= imported_modules( base_module
);
122 import_module( imported
, class_
);
123 list_free( imported
);
127 OBJECT
* make_class_module( LIST
* xname
, LIST
* bases
, FRAME
* frame
)
129 OBJECT
* name
= class_module_name( list_front( xname
) );
131 module_t
* class_module
= 0;
132 module_t
* outer_module
= frame
->module
;
136 classes
= hashinit( sizeof( OBJECT
* ), "classes" );
138 pp
= (OBJECT
* *)hash_insert( classes
, list_front( xname
), &found
);
141 *pp
= object_copy( list_front( xname
) );
145 out_printf( "Class %s already defined\n", object_str( list_front( xname
) )
149 check_defined( bases
);
151 class_module
= bindmodule( name
);
155 Initialize variables that Boost.Build inserts in every object.
156 We want to avoid creating the object's hash if it isn't needed.
158 int num
= class_module
->num_fixed_variables
;
159 module_add_fixed_var( class_module
, constant_name
, &num
);
160 module_add_fixed_var( class_module
, constant_class
, &num
);
161 module_set_fixed_variables( class_module
, num
);
164 var_set( class_module
, constant_name
, xname
, VAR_SET
);
165 var_set( class_module
, constant_bases
, bases
, VAR_SET
);
168 LISTITER iter
= list_begin( bases
);
169 LISTITER
const end
= list_end( bases
);
170 for ( ; iter
!= end
; iter
= list_next( iter
) )
171 import_base_rules( class_module
, list_item( iter
) );
178 static void free_class( void * xclass
, void * data
)
180 object_free( *(OBJECT
* *)xclass
);
184 void class_done( void )
188 hashenumerate( classes
, free_class
, (void *)0 );