public override bool Equals(Object obj) { if (this == obj) { return(true); } if (obj == null) { return(false); } if (GetType() != obj.GetType()) { return(false); } CallDef other = (CallDef)obj; if (this.GetHashCode() != other.GetHashCode()) { return(false); } //if (NomeDef == null) { // if (other.NomeDef != null) // return false; //} else if (!NomeDef.Equals(other.NomeDef)) // return false; //if (parValues == null) { // if (other.parValues != null) // return false; //} else if (this.parValues.GetHashCode() != other.parValues.GetHashCode()) //(!parValues.Equals(other.parValues)) // return false; return(true); }
/// <summary> /// <Chamada> ::= Identifier <List_Arg> /// </summary> private object Chamada(Node no) { object retorno = null; string EscopoAtualBak = EscopoAtual; Dictionary <Token, object> frame = new Dictionary <Token, object>(); List <Token> parametros = TabelaSimbolos.getParams(no.GetFilho(0).Token); List <object> argumentos = (List <object>)Executar(no.GetFilho(1)); argumentos.Reverse(); //verificação para Memoization CallDef callDef = new CallDef(); callDef.NomeDef = no.GetFilho(0).Token.Imagem; callDef.ParValues = argumentos; if (memoTab.ContainsKey(callDef)) { return(memoTab[callDef]); //if (valor != null) //{ // return valor; //valor encontrado na tabela da Memoization //} } //termina verificação para Memoization for (int i = 0; i < parametros.Count; i++) { frame.Add(parametros[i], argumentos[i]); } stack.Push(frame); try { EscopoAtual = TabelaSimbolos.getTipo(no.GetFilho(0).Token); Executar(defs[no.GetFilho(0).Token.Imagem]); } catch (RetornoException rex) { Log.println("Terminou no RetornoException: " + rex.Valor, Level.DEBUG); retorno = rex.Valor; //para Memoization memoTab[callDef] = retorno; //fim para Memoization } finally { stack.Pop(); EscopoAtual = EscopoAtualBak; } return(retorno); }