Annotation of parser3/src/include/pa_vframe.h, revision 1.4

1.1       paf         1: /*
1.4     ! paf         2:   $Id: pa_vframe.h,v 1.3 2001/02/23 21:59:07 paf Exp $
1.1       paf         3: */
                      4: 
                      5: #ifndef PA_VFRAME_H
                      6: #define PA_VFRAME_H
                      7: 
                      8: #include "pa_wcontext.h"
                      9: #include "pa_vunknown.h"
                     10: 
                     11: class VFrame : public WContext {
                     12: public: // Value
                     13: 
                     14:        // all: for error reporting after fail(), etc
                     15:        const char *type() const { return "VFrame"; }
                     16:        // frame: my or self_transparent
                     17:        Value *get_element(const String& name) { 
                     18:                Value *result=static_cast<Value *>(my.get(name));
                     19:                if(!result)
                     20:                        result=self->get_element(name);
                     21:                return result; 
                     22:        }
                     23:        // frame: my or self_transparent
                     24:        void put_element(const String& name, Value *value){ 
                     25:                if(!my.replace(name, value))
                     26:                        self->put_element(name, value);
                     27:        }
                     28: 
                     29:        // frame: none yet | transparent
                     30:        VClass *get_class() const { return self->get_class(); }
                     31:        // frame: none yet | transparent
                     32:        bool is_or_derived_from(VClass& ancestor) { return self->is_or_derived_from(ancestor); }
                     33: 
                     34: public: // usage
                     35: 
1.3       paf        36:        VFrame(Pool& apool, const Junction& ajunction) : WContext(apool, 0 /* empty */),
                     37:                junction(ajunction),
1.1       paf        38:                store_param_index(0),
                     39:                my(apool),
                     40:                self(0) {
1.4     ! paf        41:                if(Method* method=junction.method) { // method junction?
        !            42:                        // remember local var names
        !            43:                        // those are flags that name is local == to be looked up in 'my'
        !            44:                        for(int i=0; i<method->locals_names.size(); i++) {
        !            45:                                my.put(
        !            46:                                        *static_cast<String *>(method->locals_names.get(i)), 
        !            47:                                        NEW VUnknown(pool()));
        !            48:                        }
1.1       paf        49:                }
                     50:        }
                     51: 
                     52:        void set_self(Value *aself) { self=aself; }
                     53: 
                     54:        void store_param(Value *value) {
1.4     ! paf        55:                Method *method=junction.method;
        !            56:                if(store_param_index==method->params_names.size())
1.1       paf        57:                        THROW(0,0,
                     58:                                name(),
1.4     ! paf        59:                                "call: too many params (max=%d)", method->params_names.size());
1.1       paf        60:                
1.4     ! paf        61:                my.put(*static_cast<String *>(method->params_names.get(store_param_index++)), value);
1.1       paf        62:        }
1.4     ! paf        63:        void fill_empty_params() {
        !            64:                Method *method=junction.method;
        !            65:                for(; store_param_index<method->locals_names.size(); store_param_index++)
        !            66:                        my.put(
        !            67:                                *static_cast<String *>(method->params_names.get(store_param_index)), 
        !            68:                                NEW VUnknown(pool()));
1.1       paf        69:        }
                     70: 
                     71: public:
                     72:        
1.3       paf        73:        const Junction& junction;
1.1       paf        74: 
                     75: private:
                     76:        int store_param_index;
                     77:        Hash my;
                     78:        Value *self;
                     79: 
                     80: };
                     81: 
                     82: #endif

E-mail: