2
0
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:
Vladimir Prus
2003-08-04 09:09:49 +00:00
parent d6dfb4f9db
commit 6070dd8fd6
8 changed files with 138 additions and 48 deletions

View File

@@ -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 )

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 )

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 ;

View File

@@ -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 ;