From: Artem S. Povalyukhin Date: Fri, 17 Jan 2020 07:04:28 +0000 (+0300) Subject: Introduced njs_fs_path_arg(). X-Git-Tag: 0.3.8~4 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=1e9f7f506472cb7f1ae218681b319bdd279bb1ec;p=njs.git Introduced njs_fs_path_arg(). --- diff --git a/src/njs_fs.c b/src/njs_fs.c index 80514602..8fd22706 100644 --- a/src/njs_fs.c +++ b/src/njs_fs.c @@ -69,6 +69,24 @@ static njs_fs_entry_t njs_flags_table[] = { }; +njs_inline njs_int_t +njs_fs_path_arg(njs_vm_t *vm, const char **dst, + const njs_value_t* src, const njs_str_t *prop_name) +{ + if (njs_slow_path(!njs_is_string(src))) { + njs_type_error(vm, "\"%V\" must be a string", prop_name); + return NJS_ERROR; + } + + *dst = njs_string_to_c_string(vm, njs_value_arg(src)); + if (njs_slow_path(*dst == NULL)) { + return NJS_ERROR; + } + + return NJS_OK; +} + + static njs_int_t njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) @@ -85,13 +103,14 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; - if (njs_slow_path(nargs < 3)) { - njs_type_error(vm, "too few arguments"); - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1), + &njs_str_value("path")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } - if (njs_slow_path(!njs_is_string(&args[1]))) { - njs_type_error(vm, "path must be a string"); + if (njs_slow_path(nargs < 3)) { + njs_type_error(vm, "too few arguments"); return NJS_ERROR; } @@ -156,11 +175,6 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - path = njs_string_to_c_string(vm, &args[1]); - if (njs_slow_path(path == NULL)) { - return NJS_ERROR; - } - if (encoding.length != 0 && (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0)) { @@ -320,13 +334,14 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; - if (njs_slow_path(nargs < 2)) { - njs_type_error(vm, "too few arguments"); - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1), + &njs_str_value("path")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } - if (njs_slow_path(!njs_is_string(&args[1]))) { - njs_type_error(vm, "path must be a string"); + if (njs_slow_path(nargs < 2)) { + njs_type_error(vm, "too few arguments"); return NJS_ERROR; } @@ -557,13 +572,14 @@ static njs_int_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; - if (njs_slow_path(nargs < 4)) { - njs_type_error(vm, "too few arguments"); - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1), + &njs_str_value("path")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } - if (njs_slow_path(!njs_is_string(&args[1]))) { - njs_type_error(vm, "path must be a string"); + if (njs_slow_path(nargs < 4)) { + njs_type_error(vm, "too few arguments"); return NJS_ERROR; } @@ -654,11 +670,6 @@ static njs_int_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, md = 0666; } - path = njs_string_to_c_string(vm, &args[1]); - if (njs_slow_path(path == NULL)) { - return NJS_ERROR; - } - if (encoding.length != 0 && (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0)) { @@ -745,13 +756,14 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; - if (njs_slow_path(nargs < 3)) { - njs_type_error(vm, "too few arguments"); - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1), + &njs_str_value("path")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } - if (njs_slow_path(!njs_is_string(&args[1]))) { - njs_type_error(vm, "path must be a string"); + if (njs_slow_path(nargs < 3)) { + njs_type_error(vm, "too few arguments"); return NJS_ERROR; } @@ -827,11 +839,6 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, md = 0666; } - path = njs_string_to_c_string(vm, &args[1]); - if (njs_slow_path(path == NULL)) { - return NJS_ERROR; - } - if (encoding.length != 0 && (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0)) { @@ -896,45 +903,19 @@ static njs_int_t njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - int ret; - const char *old_path, *new_path; - njs_value_t *old, *new; - - if (njs_slow_path(nargs < 3)) { - if (nargs < 2) { - njs_type_error(vm, "oldPath must be a string"); - return NJS_ERROR; - } - - njs_type_error(vm, "newPath must be a string"); - return NJS_ERROR; - } - - old = njs_argument(args, 1); - new = njs_argument(args, 2); + njs_int_t ret; + const char *old_path, *new_path; - if (njs_slow_path(!njs_is_string(old))) { - ret = njs_value_to_string(vm, old, old); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } - } - - if (njs_slow_path(!njs_is_string(new))) { - ret = njs_value_to_string(vm, new, new); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } - } - - old_path = njs_string_to_c_string(vm, old); - if (njs_slow_path(old_path == NULL)) { - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &old_path, njs_arg(args, nargs, 1), + &njs_str_value("oldPath")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } - new_path = njs_string_to_c_string(vm, new); - if (njs_slow_path(new_path == NULL)) { - return NJS_ERROR; + ret = njs_fs_path_arg(vm, &new_path, njs_arg(args, nargs, 2), + &njs_str_value("newPath")); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } ret = rename(old_path, new_path); diff --git a/src/test/njs_interactive_test.c b/src/test/njs_interactive_test.c index 221eff4b..39fd2854 100644 --- a/src/test/njs_interactive_test.c +++ b/src/test/njs_interactive_test.c @@ -233,7 +233,7 @@ static njs_interactive_test_t njs_test[] = " at main (native)\n") }, { njs_str("var fs = require('fs'); fs.readFile()" ENTER), - njs_str("TypeError: too few arguments\n" + njs_str("TypeError: \"path\" must be a string\n" " at fs.readFile (native)\n" " at main (native)\n") }, diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 553d3709..fcbd7aec 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -15520,7 +15520,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.readFile()"), - njs_str("TypeError: too few arguments") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.readFile('/njs_unknown_path')"), @@ -15550,11 +15550,11 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.readFileSync()"), - njs_str("TypeError: too few arguments") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.readFileSync({})"), - njs_str("TypeError: path must be a string") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.readFileSync('/njs_unknown_path', {flag:'xx'})"), @@ -15577,7 +15577,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.writeFile()"), - njs_str("TypeError: too few arguments") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.writeFile('/njs_unknown_path')"), @@ -15589,7 +15589,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.writeFile({}, '', function () {})"), - njs_str("TypeError: path must be a string") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.writeFile('/njs_unknown_path', '', 'utf8')"), @@ -15615,7 +15615,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.writeFileSync()"), - njs_str("TypeError: too few arguments") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.writeFileSync('/njs_unknown_path')"), @@ -15623,7 +15623,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs');" "fs.writeFileSync({}, '')"), - njs_str("TypeError: path must be a string") }, + njs_str("TypeError: \"path\" must be a string") }, { njs_str("var fs = require('fs');" "fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"), @@ -15641,15 +15641,47 @@ static njs_unit_test_t njs_test[] = "fs.writeFileSync('/njs_unknown_path', '', true)"), njs_str("TypeError: Unknown options type (a string or object required)") }, - /* require('fs').writeFileSync() */ + /* require('fs').renameSync() */ { njs_str("var fs = require('fs');" "fs.renameSync()"), - njs_str("TypeError: oldPath must be a string") }, + njs_str("TypeError: \"oldPath\" must be a string") }, + + { njs_str("var fs = require('fs');" + "fs.renameSync('/njs_unknown_path')"), + njs_str("TypeError: \"newPath\" must be a string") }, { njs_str("var fs = require('fs');" - "fs.renameSync({toString(){return '/path/1'}})"), - njs_str("TypeError: newPath must be a string") }, + "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]" + ".map((x) => { try { fs.renameSync(x, '/njs_unknown_path'); } " + " catch (e) { return (e instanceof TypeError); } })" + ".every((x) => x === true)"), + njs_str("true")}, + + { njs_str("var fs = require('fs');" + "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]" + ".map((x) => { try { fs.renameSync('/njs_unknown_path', x); } " + " catch (e) { return (e instanceof TypeError); } })" + ".every((x) => x === true)"), + njs_str("true")}, + + { njs_str("var " + "fs = require('fs')," + "func = [" + "'readFile'," + "'readFileSync'," + "'writeFile'," + "'writeFileSync'," + "'appendFile'," + "'appendFileSync'," + "]," + "test = (fname) =>" + "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]" + ".map((x) => { try { fs[fname](x); } " + " catch (e) { return (e instanceof TypeError); } })" + ".every((x) => x === true);" + "func.map(test).every((x) => x)"), + njs_str("true")}, /* require('crypto').createHash() */