Annotation of parser3/src/types/pa_vmethod_frame.C, revision 1.1.2.1

1.1.2.1 ! paf         1: /**    @file
        !             2:        Parser: method frame class.
        !             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: static const char* IDENT_VSTATELESS_CLASS_C="$Date: 2003/01/21 15:51:20 $";
        !             9: 
        !            10: #include "pa_vmethod_frame.h"
        !            11: #include "pa_request.h"
        !            12: 
        !            13: // defines
        !            14: 
        !            15: #define RESULT_VAR_NAME "result"
        !            16: 
        !            17: // globals
        !            18: 
        !            19: StringPtr result_var_name(new String(RESULT_VAR_NAME));
        !            20: 
        !            21: // MethodParams: methods
        !            22: 
        !            23: ValuePtr MethodParams::get_processed(int index, const char *msg, Request& r) {
        !            24:                return r.process_to_value(as_junction(index, msg), 0/*no name*/);
        !            25: }
        !            26: 
        !            27: // VMethodFrame: methods
        !            28: 
        !            29: VMethodFrame::VMethodFrame(Pool& apool, 
        !            30:        ConstStringPtr aname,
        !            31:        const Junction& ajunction/*info: always method-junction*/,
        !            32:        VMethodFrame *acaller) : 
        !            33:        WContext(0 /* empty */, 0 /* no parent, junctions can be reattached only up to VMethodFrame */ ),
        !            34: 
        !            35:        pool(apool),
        !            36:        fname(aname),
        !            37:        junction(ajunction),
        !            38:        fcaller(acaller) {
        !            39: 
        !            40:        if(junction.method->max_numbered_params_count) // this method uses numbered params?
        !            41:                fnumbered_params=MethodParamsPtr(new MethodParams(pool, fname));
        !            42:        else {
        !            43:                my=HashStringValuePtr(new HashStringValue);
        !            44: 
        !            45:                const Method &method=*junction.method;
        !            46:                if(method.locals_names) { // are there any local var names?
        !            47:                        // remember them
        !            48:                        // those are flags that fname is local == to be looked up in 'my'
        !            49:                        for(int i=0; i<method.locals_names->count(); i++) {
        !            50:                                // speedup: not checking for clash with "result" fname
        !            51:                                ValuePtr value(new VVoid);
        !            52:                                ConstStringPtr fname=method.locals_names->get(i);
        !            53:                                set_my_variable(fname, value);
        !            54:                        }
        !            55:                }
        !            56:                { // always there is one local: $result
        !            57:                        fresult_initial_void=ValuePtr(new VVoid);
        !            58:                        set_my_variable(result_var_name, fresult_initial_void);
        !            59:                }
        !            60:        }
        !            61: }
        !            62: 
        !            63: ValuePtr VMethodFrame::get_result_variable() {
        !            64:        ValuePtr result=my?my->get(result_var_name):ValuePtr(0);
        !            65:        return result && result!=fresult_initial_void ? result : ValuePtr(0);
        !            66: }

E-mail: