private boolean computeEvalFlag() { // ENEBO: This could be made into a recursive two-method thing so then: send(:send, :send, :send, :send, :eval, "Hosed") works String mname = getId(); // checking for "call" is conservative. It can be eval only if the receiver is a Method // CON: Removed "call" check because we didn't do it in 1.7 and it deopts all callers of Method or Proc objects. // CON: eval forms with no arguments are block or block pass, and do not need to deopt if (getArgsCount() != 0 && (mname.equals("eval") || mname.equals("module_eval") || mname.equals("class_eval") || mname.equals("instance_eval"))) { return true; } // Calls to 'send' where the first arg is either unknown or is eval or send (any others?) if (potentiallySend(mname, argsCount)) { Operand meth = getArg1(); if (!(meth instanceof StringLiteral)) return true; // We don't know String name = ((StringLiteral) meth).getString(); // FIXME: ENEBO - Half of these are name and half mname? return name.equals("call") || name.equals("eval") || mname.equals("module_eval") || mname.equals("class_eval") || mname.equals("instance_eval") || name.equals("send") || name.equals("__send__"); } return false; // All checks passed }
private boolean computeEvalFlag() { // ENEBO: This could be made into a recursive two-method thing so then: send(:send, :send, :send, :send, :eval, "Hosed") works String mname = getId(); // checking for "call" is conservative. It can be eval only if the receiver is a Method // CON: Removed "call" check because we didn't do it in 1.7 and it deopts all callers of Method or Proc objects. // CON: eval forms with no arguments are block or block pass, and do not need to deopt if (getArgsCount() != 0 && (mname.equals("eval") || mname.equals("module_eval") || mname.equals("class_eval") || mname.equals("instance_eval"))) { return true; } // Calls to 'send' where the first arg is either unknown or is eval or send (any others?) if (potentiallySend(mname, argsCount)) { Operand meth = getArg1(); if (!(meth instanceof StringLiteral)) return true; // We don't know String name = ((StringLiteral) meth).getString(); // FIXME: ENEBO - Half of these are name and half mname? return name.equals("call") || name.equals("eval") || mname.equals("module_eval") || mname.equals("class_eval") || mname.equals("instance_eval") || name.equals("send") || name.equals("__send__"); } return false; // All checks passed }
String sendName = ((StringLiteral) meth).getString(); if (MethodIndex.SCOPE_AWARE_METHODS.contains(sendName)) { modifiedScope = true;
String sendName = ((StringLiteral) meth).getString(); if (MethodIndex.SCOPE_AWARE_METHODS.contains(sendName)) { modifiedScope = true;
if (!(meth instanceof StringLiteral)) return true; // We don't know -- could be anything return MethodIndex.SCOPE_AWARE_METHODS.contains(((StringLiteral) meth).getString());
if (!(meth instanceof StringLiteral)) return true; // We don't know -- could be anything return MethodIndex.SCOPE_AWARE_METHODS.contains(((StringLiteral) meth).getString());