зеркало из https://github.com/mozilla/pjs.git
- Added 'W' format to JS_ConvertArguments, for conversion to string and return
via a jschar* out parameter. - Fused common string conversion and argv[i] GC-rooting code in JS_ConvertArgs. - Added to cvtargs test command, which really needs to stop using a hardwired format string! - Fixed char-typed fgetc-receiving variable to be of int type for correct EOF comparison on machines with unsigned chars.
This commit is contained in:
Родитель
ec6cc19953
Коммит
090bf16404
59
js/src/js.c
59
js/src/js.c
|
@ -154,7 +154,7 @@ Process(JSContext *cx, JSObject *obj, char *filename)
|
|||
* as a legal js program (using sharp variables) might start with '#'.
|
||||
* But that would require multi-character lookahead.
|
||||
*/
|
||||
char ch = fgetc(ts->file);
|
||||
int ch = fgetc(ts->file);
|
||||
if (ch == '#') {
|
||||
while((ch = fgetc(ts->file)) != EOF) {
|
||||
if(ch == '\n' || ch == '\r')
|
||||
|
@ -945,6 +945,47 @@ DoExport(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
|||
#endif
|
||||
|
||||
#ifdef TEST_CVTARGS
|
||||
#include <ctype.h>
|
||||
|
||||
static const char *
|
||||
EscapeWideString(jschar *w)
|
||||
{
|
||||
static char enuf[80];
|
||||
static char hex[] = "0123456789abcdef";
|
||||
jschar u;
|
||||
unsigned char b, c;
|
||||
int i, j;
|
||||
|
||||
for (i = j = 0; i < sizeof enuf - 1; i++, j++) {
|
||||
u = w[j];
|
||||
if (u == 0)
|
||||
break;
|
||||
b = (unsigned char)(u >> 8);
|
||||
c = (unsigned char)(u);
|
||||
if (b) {
|
||||
if (i >= sizeof enuf - 6)
|
||||
break;
|
||||
enuf[i++] = '\\';
|
||||
enuf[i++] = 'u';
|
||||
enuf[i++] = hex[b >> 4];
|
||||
enuf[i++] = hex[b & 15];
|
||||
enuf[i++] = hex[c >> 4];
|
||||
enuf[i] = hex[c & 15];
|
||||
} else if (!isprint(c)) {
|
||||
if (i >= sizeof enuf - 4)
|
||||
break;
|
||||
enuf[i++] = '\\';
|
||||
enuf[i++] = 'x';
|
||||
enuf[i++] = hex[c >> 4];
|
||||
enuf[i] = hex[c & 15];
|
||||
} else {
|
||||
enuf[i] = (char)c;
|
||||
}
|
||||
}
|
||||
enuf[i] = 0;
|
||||
return enuf;
|
||||
}
|
||||
|
||||
static JSBool
|
||||
ConvertArgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
{
|
||||
|
@ -955,18 +996,22 @@ ConvertArgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
|||
jsdouble d, I;
|
||||
char *s;
|
||||
JSString *str;
|
||||
jschar *w;
|
||||
JSObject *obj;
|
||||
JSFunction *fun;
|
||||
jsval v;
|
||||
|
||||
if (!JS_ConvertArguments(cx, argc, argv, "b/ciujdIsSofv*",
|
||||
&b, &c, &i, &u, &j, &d, &I, &s, &str, &obj, &fun,
|
||||
&v)) {
|
||||
if (!JS_ConvertArguments(cx, argc, argv, "b/ciujdIsSWofv*",
|
||||
&b, &c, &i, &u, &j, &d, &I, &s, &str, &w, &obj,
|
||||
&fun, &v)) {
|
||||
return JS_FALSE;
|
||||
}
|
||||
fprintf(gOutFile, "b %u, c %x (%c), i %ld, u %lu, j %ld\n", b, c, (char)c, i, u, j);
|
||||
fprintf(gOutFile, "d %g, I %g, s %s, S %s, obj %s, fun %s, v %s\n",
|
||||
d, I, s, JS_GetStringBytes(str),
|
||||
fprintf(gOutFile,
|
||||
"b %u, c %x (%c), i %ld, u %lu, j %ld\n",
|
||||
b, c, (char)c, i, u, j);
|
||||
fprintf(gOutFile,
|
||||
"d %g, I %g, s %s, S %s, W %s, obj %s, fun %s, v %s\n",
|
||||
d, I, s, JS_GetStringBytes(str), EscapeWideString(w),
|
||||
JS_GetStringBytes(JS_ValueToString(cx, OBJECT_TO_JSVAL(obj))),
|
||||
JS_GetStringBytes(JS_DecompileFunction(cx, fun, 4)),
|
||||
JS_GetStringBytes(JS_ValueToString(cx, v)));
|
||||
|
|
|
@ -99,6 +99,7 @@ JS_ConvertArguments(JSContext *cx, uintN argc, jsval *argv, const char *format,
|
|||
uintN i;
|
||||
JSBool required;
|
||||
const char *cp;
|
||||
char c;
|
||||
JSFunction *fun;
|
||||
jsdouble d;
|
||||
JSString *str;
|
||||
|
@ -130,7 +131,7 @@ JS_ConvertArguments(JSContext *cx, uintN argc, jsval *argv, const char *format,
|
|||
}
|
||||
break;
|
||||
}
|
||||
switch (*cp) {
|
||||
switch ((c = *cp)) {
|
||||
case 'b':
|
||||
if (!js_ValueToBoolean(cx, argv[i], va_arg(ap, JSBool *)))
|
||||
return JS_FALSE;
|
||||
|
@ -161,17 +162,17 @@ JS_ConvertArguments(JSContext *cx, uintN argc, jsval *argv, const char *format,
|
|||
*va_arg(ap, jsdouble *) = js_DoubleToInteger(d);
|
||||
break;
|
||||
case 's':
|
||||
str = js_ValueToString(cx, argv[i]);
|
||||
if (!str)
|
||||
return JS_FALSE;
|
||||
argv[i] = STRING_TO_JSVAL(str);
|
||||
*va_arg(ap, char **) = JS_GetStringBytes(str);
|
||||
break;
|
||||
case 'S':
|
||||
case 'W':
|
||||
str = js_ValueToString(cx, argv[i]);
|
||||
if (!str)
|
||||
return JS_FALSE;
|
||||
argv[i] = STRING_TO_JSVAL(str);
|
||||
if (c == 's')
|
||||
*va_arg(ap, char **) = JS_GetStringBytes(str);
|
||||
else if (c == 'W')
|
||||
*va_arg(ap, jschar **) = str->chars;
|
||||
else
|
||||
*va_arg(ap, JSString **) = str;
|
||||
break;
|
||||
case 'o':
|
||||
|
|
|
@ -139,7 +139,8 @@ JS_GetEmptyStringValue(JSContext *cx);
|
|||
* d jsdouble IEEE double
|
||||
* I jsdouble Integral IEEE double
|
||||
* s char * C string
|
||||
* S JSString * Unicode string
|
||||
* S JSString * Unicode string, accessed by a JSString pointer
|
||||
* W jschar * Unicode character vector, 0-terminated (W for wide)
|
||||
* o JSObject * Object reference
|
||||
* f JSFunction * Function private
|
||||
* v jsval Argument value (no conversion)
|
||||
|
|
Загрузка…
Ссылка в новой задаче