parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Sumo 22.11.2015 18:33 / 22.11.2015 18:42

Например с GET_DEFAULT и использующим его кодом придется проститься. :)

Текущее поведение в парсере с самого начала, в байткоде команда так и называется GET_ELEMENT_OR_OPERATOR.
Вроде по тому, что я вижу сейчас в реализации GET_ELEMENT_OR_OPERATOR метод Request::execute сначала делает main_class.get_method(), а потом уже делает get_element на текущий контекст. Если элемента нет, то мы возвращаем void. Получается, что этот опкод работает как GET_OPERATOR_OR_ELEMENT.
                case OP::OP_GET_ELEMENT_OR_OPERATOR:
                        {
                                const String& name=stack.pop().string();  debug_name=&name;
                                Value& ncontext=stack.pop().value();
                                if(Method* method=main_class.get_method(name)){ // looking operator of that name FIRST
                                        if(!method->junction_template) method->junction_template=new VJunction(main_class, method);
                                        stack.push(*method->junction_template);
                                        break;
                                }
                                Value& value=get_element(ncontext, name);
                                stack.push(value);
                                break;
                        }

...

Value& Request::get_element(Value& ncontext, const String& name) {
#ifdef FEATURE_GET_ELEMENT4CALL
        Value* value=ncontext.get_element(name);
        return *(value ? &process_to_value(*value) : VVoid::get());
}

Value& Request::get_element4call(Value& ncontext, const String& name) {
#endif
        if(wcontext->get_somebody_entered_some_class()) // ^class:method
                if(VStateless_class *called_class=ncontext.get_class())
                        if(VStateless_class *read_class=rcontext->get_class())
                                if(read_class->derived_from(*called_class)){ // current derived from called
                                        Value *value=called_class->get_element(get_self(), name);
                                        return *(value ? &process_to_value(*value) : VVoid::get());
                                }

#ifdef FEATURE_GET_ELEMENT4CALL
        Value* value=ncontext.get_element4call(name);
#else
        Value* value=ncontext.get_element(name);
#endif
        return *(value ? &process_to_value(*value) : VVoid::get());
}
Ты думаешь, что изменить логику и сначала получить элемент из контекста, если его нет поискать метод в main_class и если ничего нет вернуть void приведет к проблеме?