/**
   * ECMA 15.11.4.4 Error.prototype.toString ( )
   *
   * @param self self reference
   * @return this NativeError as a string
   */
  @Function(attributes = Attribute.NOT_ENUMERABLE)
  public static Object toString(final Object self) {
    // Step 1 and 2 : check if 'self' is object it not throw TypeError
    final ScriptObject sobj = Global.checkObject(self);

    // Step 3 & 4 : get "name" and convert to String.
    // But if message is undefined make it "Error".
    Object name = sobj.get("name");
    if (name == UNDEFINED) {
      name = "Error";
    } else {
      name = JSType.toString(name);
    }

    // Steps 5, 6, & 7 : get "message" and convert to String.
    // if 'message' is undefined make it "" (empty String).
    Object msg = sobj.get("message");
    if (msg == UNDEFINED) {
      msg = "";
    } else {
      msg = JSType.toString(msg);
    }

    // Step 8 : if name is empty, return msg
    if (((String) name).isEmpty()) {
      return msg;
    }

    // Step 9 : if message is empty, return name
    if (((String) msg).isEmpty()) {
      return name;
    }
    // Step 10 : return name + ": " + msg
    return name + ": " + msg;
  }
 /**
  * Nashorn extension: global.input (shell-interactive-mode-only) Read one or more lines of input
  * from the standard input till the given end marker is seen in standard input.
  *
  * @param self self reference
  * @param endMarker String used as end marker for input
  * @param prompt String used as input prompt
  * @return line that was read
  * @throws IOException if an exception occurs
  */
 public static Object input(final Object self, final Object endMarker, final Object prompt)
     throws IOException {
   final String endMarkerStr = (endMarker != UNDEFINED) ? JSType.toString(endMarker) : "";
   final String promptStr = (prompt != UNDEFINED) ? JSType.toString(prompt) : ">> ";
   final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   final StringBuilder buf = new StringBuilder();
   while (true) {
     System.out.print(promptStr);
     final String line = reader.readLine();
     if (line == null || line.equals(endMarkerStr)) {
       break;
     }
     buf.append(line);
     buf.append('\n');
   }
   return buf.toString();
 }
 @SuppressWarnings("LeakingThisInConstructor")
 private NativeError(final Object msg, final ScriptObject proto, final PropertyMap map) {
   super(proto, map);
   if (msg != UNDEFINED) {
     this.instMessage = JSType.toString(msg);
   } else {
     this.delete(NativeError.MESSAGE, false);
   }
   initException(this);
 }
 public String toJson(Object aObj) {
   assert writeJsonFunc != null : SCRIPT_NOT_INITIALIZED;
   if (aObj instanceof Undefined) { // nashorn JSON parser could not work with undefined.
     aObj = null;
   }
   if (aObj instanceof JSObject
       || aObj instanceof CharSequence
       || aObj instanceof Number
       || aObj instanceof Boolean
       || aObj instanceof ScriptObject
       || aObj == null) {
     return JSType.toString(writeJsonFunc.call(null, new Object[] {aObj}));
   } else {
     throw new IllegalArgumentException("Java object couldn't be converted to JSON!");
   }
 }
 private static String getScriptStackString(final ScriptObject sobj, final Throwable exp) {
   return JSType.toString(sobj) + "\n" + NashornException.getScriptStackString(exp);
 }
 /**
  * Fetch String value of node.
  *
  * @return String value of node.
  */
 public String getString() {
   return JSType.toString(value);
 }
 @Override
 public String getPropertyName() {
   return JSType.toString(getObject());
 }