Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 22.11.2015 18:33 / 22.11.2015 18:42
Например с GET_DEFAULT и использующим его кодом придется проститься. :)Вроде по тому, что я вижу сейчас в реализации GET_ELEMENT_OR_OPERATOR метод Request::execute сначала делает main_class.get_method(), а потом уже делает get_element на текущий контекст. Если элемента нет, то мы возвращаем void. Получается, что этот опкод работает как GET_OPERATOR_OR_ELEMENT.
Текущее поведение в парсере с самого начала, в байткоде команда так и называется GET_ELEMENT_OR_OPERATOR.
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 приведет к проблеме?