Annotation of parser3/src/types/pa_method.h, revision 1.1.2.4.2.3
1.1.2.1 paf 1: /** @file
2: Parser: Method class decl.
3:
4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
6: */
7:
8: #ifndef PA_METHOD_H
9: #define PA_METHOD_H
10:
1.1.2.4.2.3! paf 11: static const char* IDENT_METHOD_H="$Date: 2003/03/19 12:22:37 $";
1.1.2.4.2.1 paf 12:
1.1.2.1 paf 13:
14: /*#include "pa_string.h"
15: #include "pa_array.h"
16: #include "pa_exception.h"
17: */
18: #include "pa_operation.h"
19:
20: /**
21: native code method
22: params can be NULL when
23: method min&max params (see VStateless_class::add_native_method)
24: counts are zero.
25: */
26: typedef void (*NativeCodePtr)(Request& request,
1.1.2.4.2.1 paf 27: const String& method_name,
1.1.2.4 paf 28: MethodParams* params);
1.1.2.1 paf 29:
30:
31: /**
32: class method.
33:
34: methods can have
35: - named or
36: - numbered parameters
37:
38: methods can be
39: - parser or
40: - native onces
41:
42: holds
43: - parameter names or number limits
44: - local names
45: - code [parser or native]
46: */
47: class Method: public PA_Object {
48: public:
49:
50: /// allowed method call types
51: enum Call_type {
52: CT_ANY, ///< method can be called either statically or dynamically
53: CT_STATIC, ///< method can be called only statically
54: CT_DYNAMIC ///< method can be called only dynamically
55: };
56:
57: /// name for error reporting
1.1.2.4.2.1 paf 58: const String& name;
1.1.2.1 paf 59: ///
60: Call_type call_type;
61: //@{
62: /// @name either numbered params // for native-code methods = operators
63: int min_numbered_params_count, max_numbered_params_count;
64: //@}
65: //@{
66: /// @name or named params&locals // for parser-code methods
1.1.2.4.2.3! paf 67: ArrayString* params_names; ArrayString* locals_names;
1.1.2.1 paf 68: //@}
69: //@{
70: /// @name the Code
1.1.2.4.2.3! paf 71: ArrayOperation* parser_code;/*OR*/NativeCodePtr native_code;
1.1.2.1 paf 72: //@}
73:
74: Method::Method(
1.1.2.4.2.1 paf 75: const String& aname,
1.1.2.1 paf 76: Call_type call_type,
77: int amin_numbered_params_count, int amax_numbered_params_count,
1.1.2.4.2.3! paf 78: ArrayString* aparams_names, ArrayString* alocals_names,
! 79: ArrayOperation* aparser_code, NativeCodePtr anative_code) :
1.1.2.1 paf 80:
81: name(aname),
82: call_type(call_type),
83: min_numbered_params_count(amin_numbered_params_count),
84: max_numbered_params_count(amax_numbered_params_count),
85: params_names(aparams_names), locals_names(alocals_names),
86: parser_code(aparser_code), native_code(anative_code) {
87: }
88:
89: /// call this before invoking to ensure proper actual numbered params count
90: void check_actual_numbered_params(
1.1.2.4.2.1 paf 91: Value& self, const String& actual_name, MethodParams* actual_numbered_params) const;
1.1.2.1 paf 92: };
93:
94: /// Auto-object used for temporarily substituting/removing elements
95: class Temp_value_element {
96: Value& fwhere;
1.1.2.4.2.1 paf 97: const String& fname;
1.1.2.4.2.3! paf 98: Value* saved;
1.1.2.1 paf 99: public:
1.1.2.4.2.3! paf 100: Temp_value_element(Value& awhere, const String& aname, Value* awhat) :
1.1.2.1 paf 101: fwhere(awhere),
102: fname(aname),
103: saved(awhere.get_element(aname, awhere, false)) {
104: fwhere.put_element(aname, awhat, false);
105: }
106: ~Temp_value_element() {
107: fwhere.put_element(fname, saved, false);
108: }
109: };
110:
111:
112: #endif
E-mail: