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. |