| /* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
| * |
| * ***** BEGIN LICENSE BLOCK ***** |
| * Version: MPL 1.1/GPL 2.0 |
| * |
| * The contents of this file are subject to the Mozilla Public License Version |
| * 1.1 (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * http://www.mozilla.org/MPL/ |
| * |
| * Software distributed under the License is distributed on an "AS IS" basis, |
| * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
| * for the specific language governing rights and limitations under the |
| * License. |
| * |
| * The Original Code is Rhino code, released |
| * May 6, 1999. |
| * |
| * The Initial Developer of the Original Code is |
| * Netscape Communications Corporation. |
| * Portions created by the Initial Developer are Copyright (C) 1997-1999 |
| * the Initial Developer. All Rights Reserved. |
| * |
| * Contributor(s): |
| * Igor Bukanov |
| * Roger Lawrence |
| * |
| * Alternatively, the contents of this file may be used under the terms of |
| * the GNU General Public License Version 2 or later (the "GPL"), in which |
| * case the provisions of the GPL are applicable instead of those above. If |
| * you wish to allow use of your version of this file only under the terms of |
| * the GPL and not to allow others to use your version of this file under the |
| * MPL, indicate your decision by deleting the provisions above and replacing |
| * them with the notice and other provisions required by the GPL. If you do |
| * not delete the provisions above, a recipient may use your version of this |
| * file under either the MPL or the GPL. |
| * |
| * ***** END LICENSE BLOCK ***** */ |
| |
| |
| package org.mozilla.javascript; |
| |
| /** |
| * |
| * The class of error objects |
| * |
| * ECMA 15.11 |
| */ |
| final class NativeError extends IdScriptableObject |
| { |
| static final long serialVersionUID = -5338413581437645187L; |
| |
| private static final Object ERROR_TAG = new Object(); |
| |
| static void init(Scriptable scope, boolean sealed) |
| { |
| NativeError obj = new NativeError(); |
| ScriptableObject.putProperty(obj, "name", "Error"); |
| ScriptableObject.putProperty(obj, "message", ""); |
| ScriptableObject.putProperty(obj, "fileName", ""); |
| ScriptableObject.putProperty(obj, "lineNumber", new Integer(0)); |
| obj.exportAsJSClass(MAX_PROTOTYPE_ID, scope, sealed); |
| } |
| |
| static NativeError make(Context cx, Scriptable scope, |
| IdFunctionObject ctorObj, Object[] args) |
| { |
| Scriptable proto = (Scriptable)(ctorObj.get("prototype", ctorObj)); |
| |
| NativeError obj = new NativeError(); |
| obj.setPrototype(proto); |
| obj.setParentScope(scope); |
| |
| int arglen = args.length; |
| if (arglen >= 1) { |
| ScriptableObject.putProperty(obj, "message", |
| ScriptRuntime.toString(args[0])); |
| if (arglen >= 2) { |
| ScriptableObject.putProperty(obj, "fileName", args[1]); |
| if (arglen >= 3) { |
| int line = ScriptRuntime.toInt32(args[2]); |
| ScriptableObject.putProperty(obj, "lineNumber", |
| new Integer(line)); |
| } |
| } |
| } |
| if(arglen < 3 && cx.hasFeature(Context.FEATURE_LOCATION_INFORMATION_IN_ERROR)) { |
| // Fill in fileName and lineNumber automatically when not specified |
| // explicitly, see Bugzilla issue #342807 |
| int[] linep = new int[1]; |
| String fileName = Context.getSourcePositionFromStack(linep); |
| ScriptableObject.putProperty(obj, "lineNumber", |
| new Integer(linep[0])); |
| if(arglen < 2) { |
| ScriptableObject.putProperty(obj, "fileName", fileName); |
| } |
| } |
| return obj; |
| } |
| |
| public String getClassName() |
| { |
| return "Error"; |
| } |
| |
| public String toString() |
| { |
| return js_toString(this); |
| } |
| |
| protected void initPrototypeId(int id) |
| { |
| String s; |
| int arity; |
| switch (id) { |
| case Id_constructor: arity=1; s="constructor"; break; |
| case Id_toString: arity=0; s="toString"; break; |
| case Id_toSource: arity=0; s="toSource"; break; |
| default: throw new IllegalArgumentException(String.valueOf(id)); |
| } |
| initPrototypeMethod(ERROR_TAG, id, s, arity); |
| } |
| |
| public Object execIdCall(IdFunctionObject f, Context cx, Scriptable scope, |
| Scriptable thisObj, Object[] args) |
| { |
| if (!f.hasTag(ERROR_TAG)) { |
| return super.execIdCall(f, cx, scope, thisObj, args); |
| } |
| int id = f.methodId(); |
| switch (id) { |
| case Id_constructor: |
| return make(cx, scope, f, args); |
| |
| case Id_toString: |
| return js_toString(thisObj); |
| |
| case Id_toSource: |
| return js_toSource(cx, scope, thisObj); |
| } |
| throw new IllegalArgumentException(String.valueOf(id)); |
| } |
| |
| private static String js_toString(Scriptable thisObj) |
| { |
| return getString(thisObj, "name")+": "+getString(thisObj, "message"); |
| } |
| |
| private static String js_toSource(Context cx, Scriptable scope, |
| Scriptable thisObj) |
| { |
| // Emulation of SpiderMonkey behavior |
| Object name = ScriptableObject.getProperty(thisObj, "name"); |
| Object message = ScriptableObject.getProperty(thisObj, "message"); |
| Object fileName = ScriptableObject.getProperty(thisObj, "fileName"); |
| Object lineNumber = ScriptableObject.getProperty(thisObj, "lineNumber"); |
| |
| StringBuffer sb = new StringBuffer(); |
| sb.append("(new "); |
| if (name == NOT_FOUND) { |
| name = Undefined.instance; |
| } |
| sb.append(ScriptRuntime.toString(name)); |
| sb.append("("); |
| if (message != NOT_FOUND |
| || fileName != NOT_FOUND |
| || lineNumber != NOT_FOUND) |
| { |
| if (message == NOT_FOUND) { |
| message = ""; |
| } |
| sb.append(ScriptRuntime.uneval(cx, scope, message)); |
| if (fileName != NOT_FOUND || lineNumber != NOT_FOUND) { |
| sb.append(", "); |
| if (fileName == NOT_FOUND) { |
| fileName = ""; |
| } |
| sb.append(ScriptRuntime.uneval(cx, scope, fileName)); |
| if (lineNumber != NOT_FOUND) { |
| int line = ScriptRuntime.toInt32(lineNumber); |
| if (line != 0) { |
| sb.append(", "); |
| sb.append(ScriptRuntime.toString(line)); |
| } |
| } |
| } |
| } |
| sb.append("))"); |
| return sb.toString(); |
| } |
| |
| private static String getString(Scriptable obj, String id) |
| { |
| Object value = ScriptableObject.getProperty(obj, id); |
| if (value == NOT_FOUND) return ""; |
| return ScriptRuntime.toString(value); |
| } |
| |
| protected int findPrototypeId(String s) |
| { |
| int id; |
| // #string_id_map# |
| // #generated# Last update: 2007-05-09 08:15:45 EDT |
| L0: { id = 0; String X = null; int c; |
| int s_length = s.length(); |
| if (s_length==8) { |
| c=s.charAt(3); |
| if (c=='o') { X="toSource";id=Id_toSource; } |
| else if (c=='t') { X="toString";id=Id_toString; } |
| } |
| else if (s_length==11) { X="constructor";id=Id_constructor; } |
| if (X!=null && X!=s && !X.equals(s)) id = 0; |
| break L0; |
| } |
| // #/generated# |
| return id; |
| } |
| |
| private static final int |
| Id_constructor = 1, |
| Id_toString = 2, |
| Id_toSource = 3, |
| |
| MAX_PROTOTYPE_ID = 3; |
| |
| // #/string_id_map# |
| } |