1 #include <ferite.h>
2 #include "reflection_header.h"
3 
reflection_variable_get(FeriteScript * script,FeriteVariable * var)4 void reflection_variable_get( FeriteScript *script, FeriteVariable *var )
5 {
6     FeriteObject *object = var->accessors->odata;
7     FeriteFunction *function = ferite_object_get_function( script, object, "get" );
8     FeriteVariable *rval = NULL;
9     void *a = var->accessors;
10 
11     FE_ENTER_FUNCTION;
12 
13     if( function != NULL )
14     {
15         rval = ferite_call_function( script, object, NULL, function, NULL );
16 
17         if( rval->type != F_VAR_VOID )
18         {
19             var->accessors = NULL;
20             ferite_variable_destroy( script, ferite_op_assign( script, var, rval ) );
21             var->accessors = a;
22         }
23 
24         ferite_variable_destroy( script, rval );
25     }
26 
27     FE_LEAVE_FUNCTION(NOWT);
28 }
29 
reflection_variable_set(FeriteScript * script,FeriteVariable * var,FeriteVariable * newvalue)30 void reflection_variable_set( FeriteScript *script, FeriteVariable *var, FeriteVariable *newvalue )
31 {
32     FeriteObject *object = var->accessors->odata;
33     FeriteFunction *function = ferite_object_get_function( script, object, "set" );
34     FeriteVariable **plist = ferite_create_parameter_list( 4 );
35     FeriteVariable *rval = NULL;
36     void *a = var->accessors;
37 
38     FE_ENTER_FUNCTION;
39 
40     if( function != NULL )
41     {
42         plist = ferite_add_to_parameter_list( plist, ferite_duplicate_variable( script, newvalue, NULL ) );
43         MARK_VARIABLE_AS_DISPOSABLE( plist[0] );
44         rval = ferite_call_function( script, object, NULL, function, plist );
45 
46         if( rval->type != F_VAR_VOID )
47         {
48             var->accessors = NULL;
49             ferite_variable_destroy( script, ferite_op_assign( script, var, rval ) );
50             var->accessors = a;
51         }
52 
53         ferite_variable_destroy( script, rval );
54     }
55     ferite_delete_parameter_list( script, plist );
56     FE_LEAVE_FUNCTION(NOWT);
57 }
58 
reflection_variable_cleanup(FeriteScript * script,void * odata)59 void reflection_variable_cleanup( FeriteScript *script, void *odata )
60 {
61     FeriteObject *object = odata;
62     FeriteFunction *function = ferite_object_get_function( script, object, "cleanup" );
63     FeriteVariable *rval = NULL;
64 
65     FE_ENTER_FUNCTION;
66 
67     if( function != NULL )
68     {
69         rval = ferite_call_function( script, object, NULL, function, NULL );
70         ferite_variable_destroy( script, rval );
71     }
72     object->refcount--;
73     FE_LEAVE_FUNCTION(NOWT);
74 }
75 
reflection_ns_get_list(FeriteScript * script,FeriteNamespace * space,int type)76 FeriteVariable *reflection_ns_get_list( FeriteScript *script, FeriteNamespace *space, int type )
77 {
78     FeriteHashBucket *buk = NULL;
79     FeriteVariable *array = NULL, *var = NULL;
80     FeriteIterator *iter = NULL;
81     FeriteFunction *func = NULL;
82 
83     FE_ENTER_FUNCTION;
84     array = ferite_create_uarray_variable( script, "NS:getFunctions", space->code_fork->size, FE_STATIC);
85     iter = ferite_create_iterator(script);
86     while((buk = (FeriteHashBucket*)ferite_hash_walk(script,space->code_fork,iter)) != NULL)
87     {
88         FeriteNamespaceBucket *b = buk->data;
89         if( b->type == type )
90         {
91             func = b->data;
92             var = fe_new_str(buk->id,func->name, 0, FE_CHARSET_DEFAULT);
93             ferite_uarray_add(script,VAUA(array),var,NULL,FE_ARRAY_ADD_AT_END);
94         }
95     }
96     ffree(iter);
97     FE_LEAVE_FUNCTION(array);
98 }
99