mirror of
https://github.com/boostorg/build.git
synced 2026-02-15 13:02:11 +00:00
Refactorings.
* jam_src/modules.c: (import_module, imported_modules): New functions. * jam_src/builtins.c (builtin_import_module, builtin_imported_modules): Just call the above. * new/class.jam: Add some extra tests. [SVN r19424]
This commit is contained in:
@@ -871,38 +871,19 @@ LIST *builtin_import_module( PARSE *parse, FRAME *frame )
|
||||
LIST* arg2 = lol_get( frame->args, 1 );
|
||||
|
||||
module_t* m = arg2 ? bindmodule(arg2->string) : root_module();
|
||||
|
||||
for(;arg1; arg1 = arg1->next) {
|
||||
|
||||
char* s = arg1->string;
|
||||
char** ss = &s;
|
||||
if (!m->imported_modules)
|
||||
m->imported_modules = hashinit( sizeof(char*), "imported");
|
||||
|
||||
hashenter(m->imported_modules, (HASHDATA**)&ss);
|
||||
}
|
||||
|
||||
import_module(arg1, m);
|
||||
|
||||
return L0;
|
||||
}
|
||||
|
||||
static void add_module_name( void* r_, void* result_ )
|
||||
{
|
||||
char** r = (char**)r_;
|
||||
LIST** result = (LIST**)result_;
|
||||
|
||||
*result = list_new( *result, copystr( *r ) );
|
||||
}
|
||||
|
||||
|
||||
LIST *builtin_imported_modules( PARSE *parse, FRAME *frame )
|
||||
{
|
||||
LIST *arg0 = lol_get( frame->args, 0 );
|
||||
LIST *result = L0;
|
||||
module_t* source_module = bindmodule( arg0 ? arg0->string : 0 );
|
||||
|
||||
if ( source_module->rules )
|
||||
hashenumerate( source_module->imported_modules, add_module_name, &result );
|
||||
return result;
|
||||
return imported_modules(source_module);
|
||||
}
|
||||
|
||||
LIST *builtin_instance( PARSE *parse, FRAME *frame )
|
||||
|
||||
@@ -111,3 +111,39 @@ void exit_module( module_t* m )
|
||||
{
|
||||
var_hash_swap( &m->variables );
|
||||
}
|
||||
|
||||
void import_module(LIST* module_names, module_t* target_module)
|
||||
{
|
||||
struct hash* h;
|
||||
|
||||
if (!target_module->imported_modules)
|
||||
target_module->imported_modules = hashinit( sizeof(char*), "imported");
|
||||
h = target_module->imported_modules;
|
||||
|
||||
for(;module_names; module_names = module_names->next) {
|
||||
|
||||
char* s = module_names->string;
|
||||
char** ss = &s;
|
||||
|
||||
hashenter(h, (HASHDATA**)&ss);
|
||||
}
|
||||
}
|
||||
|
||||
static void add_module_name( void* r_, void* result_ )
|
||||
{
|
||||
char** r = (char**)r_;
|
||||
LIST** result = (LIST**)result_;
|
||||
|
||||
*result = list_new( *result, copystr( *r ) );
|
||||
}
|
||||
|
||||
LIST* imported_modules(module_t* module)
|
||||
{
|
||||
LIST *result = L0;
|
||||
|
||||
if ( module->rules )
|
||||
hashenumerate( module->imported_modules, add_module_name, &result );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#ifndef MODULES_DWA10182001_H
|
||||
# define MODULES_DWA10182001_H
|
||||
|
||||
#include "lists.h"
|
||||
|
||||
struct module_t
|
||||
{
|
||||
char* name;
|
||||
@@ -23,7 +25,12 @@ void bind_module_var( module_t*, char* name );
|
||||
void enter_module( module_t* );
|
||||
void exit_module( module_t* );
|
||||
void delete_module( module_t* );
|
||||
|
||||
void import_module(LIST* module_names, module_t* target_module);
|
||||
LIST* imported_modules(module_t* module);
|
||||
|
||||
struct hash* demand_rules( module_t* );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -871,38 +871,19 @@ LIST *builtin_import_module( PARSE *parse, FRAME *frame )
|
||||
LIST* arg2 = lol_get( frame->args, 1 );
|
||||
|
||||
module_t* m = arg2 ? bindmodule(arg2->string) : root_module();
|
||||
|
||||
for(;arg1; arg1 = arg1->next) {
|
||||
|
||||
char* s = arg1->string;
|
||||
char** ss = &s;
|
||||
if (!m->imported_modules)
|
||||
m->imported_modules = hashinit( sizeof(char*), "imported");
|
||||
|
||||
hashenter(m->imported_modules, (HASHDATA**)&ss);
|
||||
}
|
||||
|
||||
import_module(arg1, m);
|
||||
|
||||
return L0;
|
||||
}
|
||||
|
||||
static void add_module_name( void* r_, void* result_ )
|
||||
{
|
||||
char** r = (char**)r_;
|
||||
LIST** result = (LIST**)result_;
|
||||
|
||||
*result = list_new( *result, copystr( *r ) );
|
||||
}
|
||||
|
||||
|
||||
LIST *builtin_imported_modules( PARSE *parse, FRAME *frame )
|
||||
{
|
||||
LIST *arg0 = lol_get( frame->args, 0 );
|
||||
LIST *result = L0;
|
||||
module_t* source_module = bindmodule( arg0 ? arg0->string : 0 );
|
||||
|
||||
if ( source_module->rules )
|
||||
hashenumerate( source_module->imported_modules, add_module_name, &result );
|
||||
return result;
|
||||
return imported_modules(source_module);
|
||||
}
|
||||
|
||||
LIST *builtin_instance( PARSE *parse, FRAME *frame )
|
||||
|
||||
@@ -111,3 +111,39 @@ void exit_module( module_t* m )
|
||||
{
|
||||
var_hash_swap( &m->variables );
|
||||
}
|
||||
|
||||
void import_module(LIST* module_names, module_t* target_module)
|
||||
{
|
||||
struct hash* h;
|
||||
|
||||
if (!target_module->imported_modules)
|
||||
target_module->imported_modules = hashinit( sizeof(char*), "imported");
|
||||
h = target_module->imported_modules;
|
||||
|
||||
for(;module_names; module_names = module_names->next) {
|
||||
|
||||
char* s = module_names->string;
|
||||
char** ss = &s;
|
||||
|
||||
hashenter(h, (HASHDATA**)&ss);
|
||||
}
|
||||
}
|
||||
|
||||
static void add_module_name( void* r_, void* result_ )
|
||||
{
|
||||
char** r = (char**)r_;
|
||||
LIST** result = (LIST**)result_;
|
||||
|
||||
*result = list_new( *result, copystr( *r ) );
|
||||
}
|
||||
|
||||
LIST* imported_modules(module_t* module)
|
||||
{
|
||||
LIST *result = L0;
|
||||
|
||||
if ( module->rules )
|
||||
hashenumerate( module->imported_modules, add_module_name, &result );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#ifndef MODULES_DWA10182001_H
|
||||
# define MODULES_DWA10182001_H
|
||||
|
||||
#include "lists.h"
|
||||
|
||||
struct module_t
|
||||
{
|
||||
char* name;
|
||||
@@ -23,7 +25,12 @@ void bind_module_var( module_t*, char* name );
|
||||
void enter_module( module_t* );
|
||||
void exit_module( module_t* );
|
||||
void delete_module( module_t* );
|
||||
|
||||
void import_module(LIST* module_names, module_t* target_module);
|
||||
LIST* imported_modules(module_t* module);
|
||||
|
||||
struct hash* demand_rules( module_t* );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -357,6 +357,8 @@ local rule __test__ ( )
|
||||
# 'myclass'
|
||||
xclass myclass
|
||||
{
|
||||
import assert ;
|
||||
|
||||
rule __init__ ( x_ * : y_ * )
|
||||
{
|
||||
# set some instance variables
|
||||
@@ -409,6 +411,17 @@ local rule __test__ ( )
|
||||
{
|
||||
return $(__class__) ;
|
||||
}
|
||||
|
||||
rule get-instance ( )
|
||||
{
|
||||
return $(__name__) ;
|
||||
}
|
||||
|
||||
rule invariant ( )
|
||||
{
|
||||
assert.equal 1 : 1 ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
xclass derived1 : myclass
|
||||
@@ -434,6 +447,11 @@ local rule __test__ ( )
|
||||
{
|
||||
return $(z) ;
|
||||
}
|
||||
|
||||
rule invariant2 ( )
|
||||
{
|
||||
assert.equal 2 : 2 ;
|
||||
}
|
||||
}
|
||||
|
||||
xclass derived2 : myclass
|
||||
@@ -456,7 +474,6 @@ local rule __test__ ( )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
xclass derived2a : derived2
|
||||
{
|
||||
rule __init__
|
||||
@@ -524,10 +541,14 @@ local rule __test__ ( )
|
||||
assert.result derived1.g : $(b).f ;
|
||||
assert.result derived2.g : $(c).f ;
|
||||
assert.result derived2.g : $(d).f ;
|
||||
|
||||
|
||||
$(a).invariant ;
|
||||
$(b).invariant2 ;
|
||||
|
||||
# Check that the __class__ attribute is getting properly set.
|
||||
assert.result myclass : $(a).get-class ;
|
||||
assert.result derived1 : $(b).get-class ;
|
||||
assert.result $(a) : $(a).get-instance ;
|
||||
|
||||
$(a).set-x a.x ;
|
||||
$(b).set-x b.x ;
|
||||
|
||||
@@ -357,6 +357,8 @@ local rule __test__ ( )
|
||||
# 'myclass'
|
||||
xclass myclass
|
||||
{
|
||||
import assert ;
|
||||
|
||||
rule __init__ ( x_ * : y_ * )
|
||||
{
|
||||
# set some instance variables
|
||||
@@ -409,6 +411,17 @@ local rule __test__ ( )
|
||||
{
|
||||
return $(__class__) ;
|
||||
}
|
||||
|
||||
rule get-instance ( )
|
||||
{
|
||||
return $(__name__) ;
|
||||
}
|
||||
|
||||
rule invariant ( )
|
||||
{
|
||||
assert.equal 1 : 1 ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
xclass derived1 : myclass
|
||||
@@ -434,6 +447,11 @@ local rule __test__ ( )
|
||||
{
|
||||
return $(z) ;
|
||||
}
|
||||
|
||||
rule invariant2 ( )
|
||||
{
|
||||
assert.equal 2 : 2 ;
|
||||
}
|
||||
}
|
||||
|
||||
xclass derived2 : myclass
|
||||
@@ -456,7 +474,6 @@ local rule __test__ ( )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
xclass derived2a : derived2
|
||||
{
|
||||
rule __init__
|
||||
@@ -524,10 +541,14 @@ local rule __test__ ( )
|
||||
assert.result derived1.g : $(b).f ;
|
||||
assert.result derived2.g : $(c).f ;
|
||||
assert.result derived2.g : $(d).f ;
|
||||
|
||||
|
||||
$(a).invariant ;
|
||||
$(b).invariant2 ;
|
||||
|
||||
# Check that the __class__ attribute is getting properly set.
|
||||
assert.result myclass : $(a).get-class ;
|
||||
assert.result derived1 : $(b).get-class ;
|
||||
assert.result $(a) : $(a).get-instance ;
|
||||
|
||||
$(a).set-x a.x ;
|
||||
$(b).set-x b.x ;
|
||||
|
||||
Reference in New Issue
Block a user