35#define DEFINE_LOCAL_GENERIC_CLASS( _rootClass, _cls ) \
36 _cls##Class::_cls##Class(const MCHAR* name) \
37 : ValueMetaClass (name) \
38 { \
39 } \
40 void _cls##Class::collect() \
41 { \
42 delete this; \
43 } \
44 \
45 _cls::_cls() \
46 { \
47 } \
48 _cls::_cls(const MCHAR*fn_name, local_value_vf fn) \
49 { \
50 tag = &(_cls##_class); \
51 fn_ptr = fn; \
52 name = save_string(fn_name); \
53 } \
54 Value* _cls::apply(Value** arg_list, int count, CallContext* cc) \
55 { \
56 if (thread_local(is_dubugger_thread) && !theMXSDebugger->GetAllowUnsafeMethods()) \
57 throw DebuggerRuntimeError(_M("Method not available from debugger: "),name); \
58 Value* result = NULL; \
59 Value** evald_args; \
60 if (count < 1) \
61 throw ArgCountError(_M("Generic apply"), 1, count); \
62 value_local_array(evald_args, count); \
63 Value** ap = arg_list; \
64 Value** eap = evald_args; \
65 for (int i = count; i > 0; i--) \
66 { \
67 *eap = (*ap)->eval(); \
68 eap++; \
69 ap++; \
70 } \
71 if (evald_args[0]->local_base_class() == &_rootClass##_class) \
72 result = (((_rootClass*)evald_args[0])->*fn_ptr)(&evald_args[1], count - 1); \
73 else \
74 throw NoMethodError (name, evald_args[0]); \
75 return result; \
76 } \
77 void _cls::collect() \
78 { \
79 delete this; \
80 } \
81 _cls##Class _cls##_class (_M(#_cls));