Не получится
moko 15.11.2020 18:50
Суть в том, что в случае ^if парсер не пытается искать переменную в текущем контексте, а возвращает оператор. В теории наверное можно разбить получение переменной на 2 части - получение в локальных переменных и все остальное, и вместо такого:
case OP::OP_GET_ELEMENT_OR_OPERATOR:
{
const String& name=stack.pop().string();
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);
}
написать что-нибудь такое:
case OP::OP_GET_ELEMENT_OR_OPERATOR:
{
const String& name=stack.pop().string();
Value& ncontext=stack.pop().value();
if(Value& value=get_element_local(ncontext, name)){ // looking local variable of that name FIRST
stack.push(value);
break;
}
if(Method* method=main_class.get_method(name)){ // looking operator of that name SECOND
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);
}
Но это лишний виртуальный вызов в одном из самых проходных мест (+ реализация get_element_local в value и потомках), не уверен что проблема стоит пары процентов производительности. По мне так проще не определять в main мешающих методов. :)