void VariableScope::removeId(int id) { if (id >= 0 && id < (int)scope->size() && (*scope)[id]) { removeChildFromParent((*scope)[id]); removeDependencies((*scope)[id]); (*scope)[id] = 0; freePlaces->push(id); } }
Expression Analitza::evaluate() { if(m_exp.isCorrect()) { Expression e(m_exp); //FIXME: That's a strange trick, wouldn't have to copy e.m_tree=removeDependencies(e.m_tree); e.m_tree=simp(e.m_tree); e.m_tree=eval(e.m_tree); e.m_tree=simp(e.m_tree); return e; } else { m_err << i18n("Must specify an operation"); return Expression(); } }
Object* Analitza::removeDependencies(Object * o) const { Q_ASSERT(o); if(o->type()==Object::variable) { Ci* var=(Ci*) o; qDebug() << "Wanna remove" << var->name() << m_vars->value(var->name()); if(m_vars->contains(var->name()) && m_vars->value(var->name())) { Object *value=Expression::objectCopy(m_vars->value(var->name())); Object *no = removeDependencies(value); delete o; return no; } } else if(o->type()==Object::container) { Container *c = (Container*) o; Operator op(c->firstOperator()); if(c->containerType()==Object::apply && op.isBounded()) { //it is a function Container *cbody = c; QStringList bvars; if(op.operatorType()==Object::function) { Ci *func= (Ci*) c->m_params[0]; Object* body= (Object*) m_vars->value(func->name()); if(body->type()!=Object::container) return body; cbody = (Container*) body; } bvars = cbody->bvarList(); qDebug() << bvars; if(op.operatorType()==Object::function) { QStringList::const_iterator iBvars(bvars.constBegin()); int i=0; for(; iBvars!=bvars.constEnd(); ++iBvars) m_vars->stack(*iBvars, c->m_params[++i]); delete c; } QList<Object*>::iterator fval(cbody->firstValue()); qDebug() << "removing: " << (*fval)->toString(); Object *ret= removeDependencies(Expression::objectCopy(*fval)); QStringList::const_iterator iBvars(bvars.constBegin()); for(; iBvars!=bvars.constEnd(); ++iBvars) m_vars->destroy(*iBvars); if(op.operatorType()==Object::function) return ret; else { delete *fval; *fval=ret; return c; } } else { QList<Object*>::iterator it(c->m_params.begin()); for(; it!=c->m_params.end(); ++it) *it = removeDependencies(*it); } } return o; }