summaryrefslogtreecommitdiffhomepage
path: root/lib.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-03-14 16:25:30 +0100
committerJo-Philipp Wich <jo@mein.io>2022-03-14 19:33:40 +0100
commitb4a1fd5bb4b24cec6b1410209de3f9511a00ff28 (patch)
tree016872e56c12f5edb3df12cf9a9cc87680f2bcc5 /lib.c
parent46188077ef727c21513008f4e0c42e8cb211e90e (diff)
lib: adjust require(), render() and include() raw mode semantics
- Let `require()` always evaluate the executed code in raw mode - Let `render()` always evaluate the executed code in template mode - Let `include()` inherit the raw mode semantics of the calling scope Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/lib.c b/lib.c
index f715484..df05250 100644
--- a/lib.c
+++ b/lib.c
@@ -1505,14 +1505,16 @@ uc_require_so(uc_vm_t *vm, const char *path, uc_value_t **res)
}
static bool
-uc_require_ucode(uc_vm_t *vm, const char *path, uc_value_t *scope, uc_value_t **res)
+uc_require_ucode(uc_vm_t *vm, const char *path, uc_value_t *scope, uc_value_t **res, bool raw_mode)
{
+ uc_parse_config_t config = { 0 };
uc_exception_type_t extype;
uc_program_t *program;
uc_value_t *prev_scope;
uc_value_t *closure;
uc_source_t *source;
struct stat st;
+ bool prev_mode;
char *err;
if (stat(path, &st))
@@ -1527,6 +1529,12 @@ uc_require_ucode(uc_vm_t *vm, const char *path, uc_value_t *scope, uc_value_t **
return true;
}
+ if (!vm->config)
+ vm->config = &config;
+
+ prev_mode = vm->config->raw_mode;
+ vm->config->raw_mode = raw_mode;
+
program = uc_compile(vm->config, source, &err);
uc_source_put(source);
@@ -1537,6 +1545,8 @@ uc_require_ucode(uc_vm_t *vm, const char *path, uc_value_t *scope, uc_value_t **
free(err);
+ vm->config->raw_mode = prev_mode;
+
return true;
}
@@ -1558,6 +1568,8 @@ uc_require_ucode(uc_vm_t *vm, const char *path, uc_value_t *scope, uc_value_t **
if (extype == EXCEPTION_NONE)
*res = uc_vm_stack_pop(vm);
+ vm->config->raw_mode = prev_mode;
+
return true;
}
@@ -1604,7 +1616,7 @@ uc_require_path(uc_vm_t *vm, const char *path_template, const char *name, uc_val
if (!strcmp(p + 1, ".so"))
rv = uc_require_so(vm, buf->buf, res);
else if (!strcmp(p + 1, ".uc"))
- rv = uc_require_ucode(vm, buf->buf, NULL, res);
+ rv = uc_require_ucode(vm, buf->buf, NULL, res, true);
if (rv)
ucv_object_add(modtable, name, ucv_get(*res));
@@ -2124,7 +2136,7 @@ include_path(const char *curpath, const char *incpath)
}
static uc_value_t *
-uc_include(uc_vm_t *vm, size_t nargs)
+uc_include_common(uc_vm_t *vm, size_t nargs, bool raw_mode)
{
uc_value_t *path = uc_fn_arg(0);
uc_value_t *scope = uc_fn_arg(1);
@@ -2182,7 +2194,7 @@ uc_include(uc_vm_t *vm, size_t nargs)
sc = ucv_get(uc_vm_scope_get(vm));
}
- if (uc_require_ucode(vm, p, sc, &rv))
+ if (uc_require_ucode(vm, p, sc, &rv, raw_mode))
ucv_put(rv);
ucv_put(sc);
@@ -2192,6 +2204,12 @@ uc_include(uc_vm_t *vm, size_t nargs)
}
static uc_value_t *
+uc_include(uc_vm_t *vm, size_t nargs)
+{
+ return uc_include_common(vm, nargs, vm->config && vm->config->raw_mode);
+}
+
+static uc_value_t *
uc_render(uc_vm_t *vm, size_t nargs)
{
uc_string_t hdr = { .header = { .type = UC_STRING, .refcount = 1 } };
@@ -2213,7 +2231,7 @@ uc_render(uc_vm_t *vm, size_t nargs)
vm->output = mem;
/* execute include */
- (void) uc_include(vm, nargs);
+ (void) uc_include_common(vm, nargs, false);
/* restore previous VM output */
vm->output = prev;