@@ -454,12 +454,12 @@ path_gethome(mrb_state *mrb, const char **pathp)
454454}
455455456456static mrb_value
457-path_expand(mrb_state *mrb, const char *path, const char *base)
457+path_expand(mrb_state *mrb, const char *path, const char *base, mrb_bool tilda)
458458{
459459mrb_value ary;
460460461461// split path conponents as array and normalization
462-if (path[0] == '~') {
462+if (tilda && path[0] == '~') {
463463base = path_gethome(mrb, &path);
464464ary = path_split(mrb, path, base, NULL);
465465 }
@@ -468,7 +468,7 @@ path_expand(mrb_state *mrb, const char *path, const char *base)
468468 }
469469else {
470470const char *wd = NULL;
471-if (base[0] == '~') {
471+if (tilda && base[0] == '~') {
472472wd = path_gethome(mrb, &base);
473473 }
474474#ifndef _WIN32
@@ -537,7 +537,16 @@ mrb_file_expand_path(mrb_state *mrb, mrb_value self)
537537const char *path;
538538const char *default_dir = ".";
539539mrb_get_args(mrb, "z|z", &path, &default_dir);
540-return path_expand(mrb, path, default_dir);
540+return path_expand(mrb, path, default_dir, TRUE);
541+}
542+543+static mrb_value
544+mrb_file_absolute_path(mrb_state *mrb, mrb_value self)
545+{
546+const char *path;
547+const char *default_dir = ".";
548+mrb_get_args(mrb, "z|z", &path, &default_dir);
549+return path_expand(mrb, path, default_dir, FALSE);
541550}
542551543552static mrb_value
@@ -796,6 +805,7 @@ mrb_init_file(mrb_state *mrb)
796805mrb_define_class_method_id(mrb, file, MRB_SYM(dirname), mrb_file_dirname, MRB_ARGS_REQ(1));
797806mrb_define_class_method_id(mrb, file, MRB_SYM(basename), mrb_file_basename, MRB_ARGS_REQ(1));
798807mrb_define_class_method_id(mrb, file, MRB_SYM(realpath), mrb_file_realpath, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
808+mrb_define_class_method_id(mrb, file, MRB_SYM(absolute_path), mrb_file_absolute_path, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
799809mrb_define_class_method_id(mrb, file, MRB_SYM_Q(absolute_path), mrb_file_absolute_path_p, MRB_ARGS_REQ(1));
800810mrb_define_class_method_id(mrb, file, MRB_SYM(expand_path), mrb_file_expand_path, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
801811