- 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:
brendan%netscape.com 1999-03-02 02:38:45 +00:00
Родитель ec6cc19953
Коммит 090bf16404
3 изменённых файлов: 66 добавлений и 19 удалений

Просмотреть файл

@ -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,21 +996,25 @@ 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),
JS_GetStringBytes(JS_ValueToString(cx, OBJECT_TO_JSVAL(obj))),
JS_GetStringBytes(JS_DecompileFunction(cx, fun, 4)),
JS_GetStringBytes(JS_ValueToString(cx, v)));
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)));
return JS_TRUE;
}
#endif

Просмотреть файл

@ -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,18 +162,18 @@ 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);
*va_arg(ap, JSString **) = 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':
if (!js_ValueToObject(cx, argv[i], &obj))

Просмотреть файл

@ -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)