Re: [jsapigen-devel] [PATCH 2/3] Update character parameter passing for spidermonkey 1.8.5 API
Status: Beta
Brought to you by:
tdz
|
From: Thomas Z. <td...@us...> - 2012-07-08 15:19:08
|
Hi Vincent,
I also applied this patch. Thank you very much! A review is below.
Best regards,
Thomas
Am Samstag, den 30.06.2012, 13:30 +0100 schrieb Vincent Sanders:
> From: Vincent Sanders <vi...@co...>
>
> The charp parameter passing required updating to allow compilation useing
> spidermonkey 1.8.5. In addition the constructed output was altered to use
> the new charcter encoding routines to convert directly to utf-8 if
> appropriate.
>
> Signed-off-by: Vincent Sanders <vi...@ky...>
> ---
> src/hlcl.c | 2 +-
> src/jsapi.c | 2 +-
> src/jsapiout.c | 47 +++++++++++++++++++++++++++++++++--------------
> 3 files changed, 35 insertions(+), 16 deletions(-)
>
> diff --git a/src/hlcl.c b/src/hlcl.c
> index a06cba2..cee1edc 100644
> --- a/src/hlcl.c
> +++ b/src/hlcl.c
> @@ -144,7 +144,7 @@ static const struct hlcl_desc jjhlcldesc[] = {
> {"CONVERT_INT32_TO_INT", PARAM_I_I},
> {"CONVERT_JSDOUBLE_TO_FLOAT", PARAM_I_I},
> {"CONVERT_JSDOUBLE_TO_DOUBLE", PARAM_I_I},
> - {"CONVERT_JSCHARP_TO_CHARP", PARAM_I_I_I},
> + {"CONVERT_JSCHARP_TO_CHARP", PARAM_I_I_I_I},
> {"CONVERT_JSCHARP_TO_WCHARP", PARAM_I_I_I},
> {"CONVERT_WCHARP_TO_JSCHARP", PARAM_I_I_I},
> {"OBJ_TO_VAR", PARAM_I},
> diff --git a/src/jsapi.c b/src/jsapi.c
> index 0af8e46..c50a52d 100644
> --- a/src/jsapi.c
> +++ b/src/jsapi.c
> @@ -187,7 +187,7 @@ jsapi_append_jsstringp_to_charp_ip(int src, int dst, int len)
>
> return -((jsapi_append_vardecl(JSAPI_VARTYPE_JSCHAR, 1, var) < 0) ||
The statements
> (hlcltab_append_i_i( HLCL_JS_GET_STRING_CHARS, src, var) < 0) ||
> - (hlcltab_append_i_i_i(HLCL_CONVERT_JSCHARP_TO_CHARP, dst, var, len) < 0));
belong together. The first one retrieves src's characters, which are
then converted by the second. I see why you pass src to the statement
below,
> + (hlcltab_append_i_i_i_i(HLCL_CONVERT_JSCHARP_TO_CHARP, dst, var, len, src) < 0));
but the real solution would introduce new IR tokens that check for UTF-8
encoding and call the respective functions. But your solution is ok for
now.
> }
>
> static int
> diff --git a/src/jsapiout.c b/src/jsapiout.c
> index db741d6..ac7de1d 100644
> --- a/src/jsapiout.c
> +++ b/src/jsapiout.c
> @@ -1028,7 +1028,14 @@ jsapi_out_js_get_string_length(const struct hlcl *hlcl, struct jsapi_state *stat
> src = hlcl->data.ii.i[0];
> dst = hlcl->data.ii.i[1];
>
> - return sigfprintf(f, " var%d = JS_GetStringLength(var%d);\n", dst, src);
> + return sigfprintf(f,
> + "#if JS_VERSION >= 185\n"
> + " if (JS_CStringsAreUTF8()) \n"
> + " var%d = JS_GetStringEncodingLength(cx, var%d);\n"
> + " else \n"
> + "#endif\n"
> + " var%d = JS_GetStringLength(var%d);\n",
> + dst, src, dst, src);
> }
>
> static int
> @@ -1044,7 +1051,12 @@ jsapi_out_js_get_string_chars(const struct hlcl *hlcl, struct jsapi_state *state
> src = hlcl->data.ii.i[0];
> dst = hlcl->data.ii.i[1];
>
> - return sigfprintf(f, " var%d = JS_GetStringChars(var%d);\n", dst, src);
> + return sigfprintf(f,
> + "#if JS_VERSION >= 182\n"
Is the test for 182 intentionally? AFAIK there is no version 182, just
180 and 185.
> + " var%d = JS_GetStringCharsZ(cx, var%d);\n"
> + "#else\n"
> + " var%d = JS_GetStringChars(var%d);\n"
> + "#endif\n", dst, src, dst, src);
> }
>
> static int
> @@ -1898,24 +1910,31 @@ jsapi_out_convert_jsdouble_to_double(const struct hlcl *hlcl, struct jsapi_state
> static int
> jsapi_out_convert_jscharp_to_charp(const struct hlcl *hlcl, struct jsapi_state *state, FILE * f)
> {
> - int src, dst, len;
> + int src, dst, len, jsstr;
>
> assert(hlcl);
> assert(hlcl->op == HLCL_CONVERT_JSCHARP_TO_CHARP);
> assert(state);
> assert(f);
>
> - dst = hlcl->data.iii.i[0];
> - src = hlcl->data.iii.i[1];
> - len = hlcl->data.iii.i[2];
> -
> - return sigfprintf(f, " {\n"
> - " size_t i;\n"
> - " for (i = 0; i < var%d; ++i) {\n"
> - " var%d[i] = wctob(var%d[i]);\n"
> - " }\n"
> - " var%d[var%d] = '\\0';\n"
> - " }\n", len, dst, src, dst, len);
> + dst = hlcl->data.iiii.i[0];
> + src = hlcl->data.iiii.i[1];
> + len = hlcl->data.iiii.i[2];
> + jsstr = hlcl->data.iiii.i[3];
> +
> + return sigfprintf(f,
> + "#if JS_VERSION >= 185\n"
> + " if (JS_CStringsAreUTF8()) {\n"
> + " JS_EncodeStringToBuffer(var%d, var%d, var%d);\n"
> + " } else \n"
> + "#endif\n"
> + " {\n"
> + " size_t i;\n"
> + " for (i = 0; i < var%d; ++i) {\n"
> + " var%d[i] = wctob(var%d[i]);\n"
> + " }\n"
> + " var%d[var%d] = '\\0';\n"
> + " }\n", jsstr, dst, len, len, dst, src, dst, len);
> }
>
> static int
--
GnuPG: http://tdz.users.sourceforge.net/tdz.asc
Fingerprint: 16FF F599 82F8 E5AA 18C6 5220 D9DA D7D4 4EF1 DF08
jsapigen - A free glue-code generator for Mozilla SpiderMonkey. See
http://jsapigen.sourceforge.net for more information.
|