OBJECT * make_class_module( LIST * xname, LIST * bases, FRAME * frame ) { OBJECT * name = class_module_name( list_front( xname ) ); OBJECT * * pp; module_t * class_module = 0; module_t * outer_module = frame->module; int found; LISTITER iter, end; if ( !classes ) classes = hashinit( sizeof( OBJECT * ), "classes" ); pp = (OBJECT * *)hash_insert( classes, list_front( xname ), &found ); if ( !found ) { *pp = object_copy( list_front( xname ) ); } else { printf( "Class %s already defined\n", object_str( list_front( xname ) ) ); abort(); } check_defined( bases ); class_module = bindmodule( name ); var_set( class_module, constant_name, xname, VAR_SET ); var_set( class_module, constant_bases, bases, VAR_SET ); iter = list_begin( bases ), end = list_end( bases ); for ( ; iter != end; iter = list_next( iter ) ) import_base_rules( class_module, list_item( iter ) ); return name; }
OBJECT * make_class_module( LIST * xname, LIST * bases, FRAME * frame ) { OBJECT * name = class_module_name( list_front( xname ) ); OBJECT * * pp; module_t * class_module = 0; module_t * outer_module = frame->module; int found; if ( !classes ) classes = hashinit( sizeof( OBJECT * ), "classes" ); pp = (OBJECT * *)hash_insert( classes, list_front( xname ), &found ); if ( !found ) { *pp = object_copy( list_front( xname ) ); } else { out_printf( "Class %s already defined\n", object_str( list_front( xname ) ) ); abort(); } check_defined( bases ); class_module = bindmodule( name ); { /* Initialize variables that Boost.Build inserts in every object. We want to avoid creating the object's hash if it isn't needed. */ int num = class_module->num_fixed_variables; module_add_fixed_var( class_module, constant_name, &num ); module_add_fixed_var( class_module, constant_class, &num ); module_set_fixed_variables( class_module, num ); } var_set( class_module, constant_name, xname, VAR_SET ); var_set( class_module, constant_bases, bases, VAR_SET ); { LISTITER iter = list_begin( bases ); LISTITER const end = list_end( bases ); for ( ; iter != end; iter = list_next( iter ) ) import_base_rules( class_module, list_item( iter ) ); } return name; }
OBJECT * make_class_module( LIST * xname, LIST * bases, FRAME * frame ) { OBJECT * name = class_module_name( xname->value ); OBJECT * * pp = &xname->value; module_t * class_module = 0; module_t * outer_module = frame->module; OBJECT * name_ = object_new( "__name__" ); OBJECT * bases_ = object_new( "__bases__" ); if ( !classes ) classes = hashinit( sizeof( OBJECT * ), "classes" ); if ( hashenter( classes, (HASHDATA * *)&pp ) ) { *pp = object_copy( xname->value ); } else { printf( "Class %s already defined\n", object_str( xname->value ) ); abort(); } check_defined( bases ); class_module = bindmodule( name ); exit_module( outer_module ); enter_module( class_module ); var_set( name_, xname, VAR_SET ); var_set( bases_, bases, VAR_SET ); exit_module( class_module ); enter_module( outer_module ); for ( ; bases; bases = bases->next ) import_base_rules( class_module, bases->value ); object_free( bases_ ); object_free( name_ ); return name; }