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