1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
/*
FALCON - The Falcon Programming Language.
FILE: attrib_ext.cpp
Facilities handling attributes.
-------------------------------------------------------------------
Author: Giancarlo Niccolai
Begin: Sat, 11 Jul 2009 23:26:40 +0200
-------------------------------------------------------------------
(C) Copyright 2009: the FALCON developers (see list in AUTHORS file)
See LICENSE file for licensing details.
*/
#include <falcon/setup.h>
#include <falcon/module.h>
#include <falcon/attribmap.h>
#include <falcon/corefunc.h>
#include "core_module.h"
/*#
@beginmodule core
*/
namespace Falcon {
namespace core {
static void inner_make_item( VarDef* vd, Item& itm )
{
switch( vd->type() )
{
case VarDef::t_bool: itm.setBoolean( vd->asBool() ); break;
case VarDef::t_int: itm.setInteger( vd->asInteger() ); break;
case VarDef::t_num: itm.setNumeric( vd->asNumeric() ); break;
case VarDef::t_string:
{
itm.setString( new CoreString( *vd->asString() ) );
}
break;
default:
itm.setNil();
}
}
static CoreDict* interal_make_attrib_dict( Map* attr )
{
CoreDict* cd = new CoreDict( new LinearDict( attr->size() ) );
MapIterator iter = attr->begin();
while( iter.hasCurrent() )
{
VarDef* vd = *(VarDef**) iter.currentValue();
Item temp;
inner_make_item( vd, temp );
cd->put( new CoreString(
*(String*) iter.currentKey() ),
temp
);
iter.next();
}
return cd;
}
/*#
@function attributes
@brief Returns a dictionary containing annotation attributes of the current module.
@return Nil if the current module has no attributes, or a string-indexed dictionary.
@see Function.attributes
@see Class.attributes
@see Object.attributes
*/
FALCON_FUNC attributes ( ::Falcon::VMachine *vm )
{
// we want to know the attributes of the module calling us.
StackFrame* cf = vm->currentFrame();
const Module* mod = cf->m_module->module();
Map* attr = mod->attributes();
if( attr != 0 )
{
vm->retval( interal_make_attrib_dict( attr ) );
}
}
/*#
@method attributes Class
@brief Returns a dictionary containing annotation attributes of the given class.
@return Nil if the class has no attributes, or a string-indexed dictionary.
@see attributes
*/
FALCON_FUNC Class_attributes ( ::Falcon::VMachine *vm )
{
Map* attr = vm->self().asClass()->symbol()->getClassDef()->attributes();
if( attr != 0 )
{
vm->retval( interal_make_attrib_dict( attr ) );
}
}
/*#
@method attributes Object
@brief Returns a dictionary containing annotation attributes of the given object.
@return Nil if the object has no attributes, or a string-indexed dictionary.
If the object is a class instance, this method will return the attributes of
the generator class.
@see attributes
*/
FALCON_FUNC Object_attributes ( ::Falcon::VMachine *vm )
{
Map* attr = vm->self().asObject()->generator()->symbol()->getClassDef()->attributes();
if( attr != 0 )
{
vm->retval( interal_make_attrib_dict( attr ) );
}
}
/*#
@method attributes Function
@brief Returns a dictionary containing annotation attributes of the given function.
@return Nil if the function has no attributes, or a string-indexed dictionary.
@see attributes
*/
FALCON_FUNC Function_attributes ( ::Falcon::VMachine *vm )
{
const Symbol* sym = vm->self().asFunction()->symbol();
// currently, extfunc are not supported; let the VM return nil
if ( sym->isExtFunc() )
return;
Map* attr = sym->getFuncDef()->attributes();
if( attr != 0 )
{
vm->retval( interal_make_attrib_dict( attr ) );
}
}
/*#
@method attributes Method
@brief Returns the attributes associated with the method function.
@return Nil if the function has no attributes, or a string-indexed dictionary.
@see attributes
*/
/*#
@method attributes ClassMethod
@brief Returns the attributes associated with the method function.
@return Nil if the function has no attributes, or a string-indexed dictionary.
@see attributes
*/
FALCON_FUNC Method_attributes ( ::Falcon::VMachine *vm )
{
if ( ! vm->self().asMethodFunc()->isFunc() )
return;
const Symbol* sym = static_cast<CoreFunc*>(vm->self().asMethodFunc())->symbol();
// currently, extfunc are not supported; let the VM return nil
if ( sym->isExtFunc() )
return;
Map* attr = sym->getFuncDef()->attributes();
if( attr != 0 )
{
vm->retval( interal_make_attrib_dict( attr ) );
}
}
}
}
/* end of attrib_ext.cpp */
|