diff --git a/js/src/jsapi.c b/js/src/jsapi.c index 07be2d28accb..ef733c160b05 100644 --- a/js/src/jsapi.c +++ b/js/src/jsapi.c @@ -2000,7 +2000,17 @@ JS_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, CHECK_REQUEST(cx); if (!clasp) clasp = &js_ObjectClass; /* default class is Object */ - return js_ConstructObject(cx, clasp, proto, parent); + return js_ConstructObject(cx, clasp, proto, parent, 0, NULL); +} + +JS_PUBLIC_API(JSObject *) +JS_ConstructObjectWithArguments(JSContext *cx, JSClass *clasp, JSObject *proto, + JSObject *parent, uintN argc, jsval *argv) +{ + CHECK_REQUEST(cx); + if (!clasp) + clasp = &js_ObjectClass; /* default class is Object */ + return js_ConstructObject(cx, clasp, proto, parent, argc, argv); } static JSBool diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 33d3e932f958..2bba779f7749 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -878,6 +878,10 @@ extern JS_PUBLIC_API(JSObject *) JS_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent); +extern JS_PUBLIC_API(JSObject *) +JS_ConstructObjectWithArguments(JSContext *cx, JSClass *clasp, JSObject *proto, + JSObject *parent, uintN argc, jsval *argv); + extern JS_PUBLIC_API(JSObject *) JS_DefineObject(JSContext *cx, JSObject *obj, const char *name, JSClass *clasp, JSObject *proto, uintN attrs); diff --git a/js/src/jsexn.c b/js/src/jsexn.c index 0a41ab50d4c1..78bebfe80b96 100644 --- a/js/src/jsexn.c +++ b/js/src/jsexn.c @@ -408,6 +408,12 @@ Exception(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) older = JS_SetErrorReporter(cx, NULL); state = JS_SaveExceptionState(cx); } +#ifdef __GNUC__ /* suppress bogus gcc warnings */ + else { + older = NULL; + state = NULL; + } +#endif callerid = ATOM_KEY(cx->runtime->atomState.callerAtom); JS_ASSERT(cx->fp); @@ -765,10 +771,12 @@ JSBool js_ErrorToException(JSContext *cx, const char *message, JSErrorReport *reportp) { JSErrNum errorNumber; - JSObject *errObject, *errProto; JSExnType exn; + JSObject *errObject, *errProto; + uintN argc; + jsval *argv; + void *mark; JSExnPrivate *privateData; - JSString *msgstr, *fnamestr; /* Find the exception index associated with this error. */ JS_ASSERT(reportp); @@ -822,44 +830,25 @@ js_ErrorToException(JSContext *cx, const char *message, JSErrorReport *reportp) } /* - * Use js_NewObject instead of js_ConstructObject, because - * js_ConstructObject seems to require a frame. + * Use js_ConstructObject to compute the stack property and any other + * default properties or private data. */ - errObject = js_NewObject(cx, &ExceptionClass, errProto, NULL); + if (reportp) { + argv = JS_PushArguments(cx, &mark, "ssu", + message, reportp->filename, reportp->lineno); + argc = 3; + } else { + argv = JS_PushArguments(cx, &mark, "s", message); + argc = 1; + } + if (!argv) + return JS_FALSE; + errObject = js_ConstructObject(cx, &ExceptionClass, errProto, NULL, + argc, argv); + JS_PopArguments(cx, mark); if (!errObject) return JS_FALSE; - /* Store 'message' as a javascript-visible value. */ - msgstr = JS_NewStringCopyZ(cx, message); - if (!msgstr) - return JS_FALSE; - if (!JS_DefineProperty(cx, errObject, js_message_str, - STRING_TO_JSVAL(msgstr), NULL, NULL, - JSPROP_ENUMERATE)) { - return JS_FALSE; - } - - if (reportp) { - if (reportp->filename) { - fnamestr = JS_NewStringCopyZ(cx, reportp->filename); - if (!fnamestr) - return JS_FALSE; - /* Store 'filename' as a javascript-visible value. */ - if (!JS_DefineProperty(cx, errObject, js_filename_str, - STRING_TO_JSVAL(fnamestr), NULL, NULL, - JSPROP_ENUMERATE)) { - return JS_FALSE; - } - /* Store 'lineno' as a javascript-visible value. */ - if (!JS_DefineProperty(cx, errObject, js_lineno_str, - INT_TO_JSVAL((int)reportp->lineno), NULL, - NULL, JSPROP_ENUMERATE)) { - return JS_FALSE; - } - } - - } - /* * Construct a new copy of the error report, and store it in the * exception objects' private data. We can't use the error report diff --git a/js/src/jsinterp.c b/js/src/jsinterp.c index 0e92d6f76c1b..4fae19e3fb07 100644 --- a/js/src/jsinterp.c +++ b/js/src/jsinterp.c @@ -3451,7 +3451,7 @@ js_Interpret(JSContext *cx, jsval *result) */ SAVE_SP(fp); parent = js_ConstructObject(cx, &js_ObjectClass, NULL, - fp->scopeChain); + fp->scopeChain, 0, NULL); if (!parent) { ok = JS_FALSE; goto out; diff --git a/js/src/jsobj.c b/js/src/jsobj.c index 2a4d4f58e859..2400b5d2966c 100644 --- a/js/src/jsobj.c +++ b/js/src/jsobj.c @@ -1725,7 +1725,7 @@ FindConstructor(JSContext *cx, JSObject *scope, const char *name, jsval *vp) JSObject * js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, - JSObject *parent) + JSObject *parent, uintN argc, jsval *argv) { jsval cval, rval; JSObject *obj, *ctor; @@ -1754,7 +1754,7 @@ js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, if (!obj) return NULL; - if (!js_InternalConstruct(cx, obj, cval, 0, NULL, &rval)) + if (!js_InternalConstruct(cx, obj, cval, argc, argv, &rval)) goto bad; return JSVAL_IS_OBJECT(rval) ? JSVAL_TO_OBJECT(rval) : obj; bad: diff --git a/js/src/jsobj.h b/js/src/jsobj.h index 4a42ecfa042c..fa6eb358eec0 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -292,7 +292,7 @@ js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent); extern JSObject * js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, - JSObject *parent); + JSObject *parent, uintN argc, jsval *argv); extern void js_FinalizeObject(JSContext *cx, JSObject *obj); diff --git a/js/src/jsstr.c b/js/src/jsstr.c index fcfde7786d1f..b28bf4bdb407 100644 --- a/js/src/jsstr.c +++ b/js/src/jsstr.c @@ -1136,7 +1136,7 @@ match_glob(JSContext *cx, jsint count, GlobData *data) mdata = (MatchData *)data; arrayobj = mdata->arrayobj; if (!arrayobj) { - arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL); + arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL, 0, NULL); if (!arrayobj) return JS_FALSE; mdata->arrayobj = arrayobj; @@ -1758,7 +1758,7 @@ str_split(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); - arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL); + arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL, 0, NULL); if (!arrayobj) return JS_FALSE; *rval = OBJECT_TO_JSVAL(arrayobj);