| Новости | 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 приведет к проблеме?