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

1.2       paf         1: /**    @file
                      2:        Parser: method frame class.
                      3: 
1.19      moko        4:        Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
1.2       paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)\
                      6: */
                      7: 
                      8: #include "pa_vmethod_frame.h"
                      9: #include "pa_request.h"
                     10: 
1.21    ! misha      11: volatile const char * IDENT_PA_VMETHOD_FRAME_C="$Id: pa_vmethod_frame.C,v 1.20 2012-05-07 20:05:10 moko Exp $" IDENT_PA_VMETHOD_FRAME_H;
1.19      moko       12: 
1.2       paf        13: // globals
                     14: 
1.15      misha      15: const String result_var_name(RESULT_VAR_NAME), caller_element_name(CALLER_ELEMENT_NAME), self_element_name(SELF_ELEMENT_NAME);
1.14      misha      16: VVoid void_result; // unique value to be sure the result is changed
1.2       paf        17: 
                     18: // MethodParams: methods
                     19: 
1.7       paf        20: Value& MethodParams::get_processed(Value* value, const char* msg, int index, Request& r) {
                     21:                return r.process_to_value(as_junction(value, msg, index), false /*do not intercept string*/);
1.2       paf        22: }
                     23: 
1.21    ! misha      24: HashStringValue* MethodParams::as_hash(int index, const char* name) {
        !            25:        Value* value=get(index);
        !            26:        if(value) {
        !            27:                if(value->get_junction())
        !            28:                        throw Exception(PARSER_RUNTIME,
        !            29:                                0,
        !            30:                                "%s param must not be code (parameter #%d)", name ? name : "options", 1+index);
        !            31:                if(!value->is_defined()) // empty hash is not defined, but we don't need it anyway
        !            32:                        return 0;
        !            33:                if(HashStringValue* result=value->get_hash())
        !            34:                        return result;
        !            35:                if(value->is_string() && value->get_string()->trim().is_empty())
        !            36:                        return 0;
        !            37:        }
        !            38:        throw Exception(PARSER_RUNTIME,
        !            39:                0,
        !            40:                "%s must have hash representation (parameter #%d)", name ? name : "options", 1+index);
        !            41: }
        !            42: 
        !            43: Table* MethodParams::as_table(int index, const char* name) {
        !            44:        Value* value=get(index);
        !            45:        if(value) {
        !            46:                if(value->get_junction())
        !            47:                        throw Exception(PARSER_RUNTIME,
        !            48:                                0,
        !            49:                                "%s param must not be code (parameter #%d)", name ? name : "options", 1+index);
        !            50:                if(Table* result=value->get_table())
        !            51:                        return result;
        !            52:        }
        !            53:        throw Exception(PARSER_RUNTIME,
        !            54:                0,
        !            55:                "%s param must have table representation (parameter #%d)", name ? name : "options", 1+index);
        !            56: };
        !            57: 
1.2       paf        58: // VMethodFrame: methods
                     59: 
1.18      moko       60: VMethodFrame::VMethodFrame(const Method& amethod, VMethodFrame *acaller, Value& aself) : 
1.16      misha      61:        WContext(0 /* no parent, junctions can be reattached only up to VMethodFrame */),
1.4       paf        62:        fcaller(acaller),
1.12      misha      63:        my(0),
1.18      moko       64:        fself(aself),
                     65:        method(amethod) {
1.2       paf        66: 
1.18      moko       67:        put_element_impl=(method.all_vars_local)?&VMethodFrame::put_element_local:&VMethodFrame::put_element_global;
1.9       misha      68: 
1.18      moko       69:        if(!method.max_numbered_params_count){ // this method uses numbered params?
1.17      misha      70:                my=new HashString<Value*>;
1.2       paf        71: 
                     72:                if(method.locals_names) { // are there any local var names?
                     73:                        // remember them
                     74:                        // those are flags that fname is local == to be looked up in 'my'
                     75:                        for(Array_iterator<const String*> i(*method.locals_names); i.has_next(); ) {
                     76:                                // speedup: not checking for clash with "result" fname
                     77:                                const String& fname=*i.next();
1.20      moko       78:                                set_my_variable(fname, *VString::empty());
1.2       paf        79:                        }
                     80:                }
1.14      misha      81: #ifdef OPTIMIZE_RESULT
1.18      moko       82:                if(method.result_optimization!=Method::RO_USE_WCONTEXT)
1.14      misha      83: #endif
                     84:                        set_my_variable(result_var_name, void_result);
1.2       paf        85:        }
                     86: }
                     87: 
                     88: Value* VMethodFrame::get_result_variable() {
1.11      misha      89:        if(!my)
                     90:                return 0;
                     91: 
1.15      misha      92:        Value* result=my->get(result_var_name);
1.14      misha      93:        return result!=&void_result?result:0;
1.2       paf        94: }

E-mail: