--- /dev/null
+/*
+ * Variable access
+ */
+
+#include "duk_internal.h"
+
+DUK_EXTERNAL void duk_get_var(duk_context *ctx) {
+ duk_hthread *thr = (duk_hthread *) ctx;
+ duk_activation *act;
+ duk_hstring *h_varname;
+ duk_small_int_t throw_flag = 1; /* always throw ReferenceError for unresolvable */
+
+ DUK_ASSERT_CTX_VALID(ctx);
+
+ h_varname = duk_require_hstring(ctx, -1); /* XXX: tostring? */
+ DUK_ASSERT(h_varname != NULL);
+
+ act = duk_hthread_get_current_activation(thr);
+ if (act) {
+ (void) duk_js_getvar_activation(thr, act, h_varname, throw_flag); /* -> [ ... varname val this ] */
+ } else {
+ /* Outside any activation -> look up from global. */
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL);
+ (void) duk_js_getvar_envrec(thr, thr->builtins[DUK_BIDX_GLOBAL_ENV], h_varname, throw_flag);
+ }
+
+ /* [ ... varname val this ] (because throw_flag == 1, always resolved) */
+
+ duk_pop(ctx);
+ duk_remove(ctx, -2);
+
+ /* [ ... val ] */
+
+ /* Return value would be pointless: because throw_flag==1, we always
+ * throw if the identifier doesn't resolve.
+ */
+ return;
+}
+
+DUK_EXTERNAL void duk_put_var(duk_context *ctx) {
+ duk_hthread *thr = (duk_hthread *) ctx;
+ duk_activation *act;
+ duk_hstring *h_varname;
+ duk_tval *tv_val;
+ duk_small_int_t throw_flag;
+
+ DUK_ASSERT_CTX_VALID(ctx);
+
+ h_varname = duk_require_hstring(ctx, -2); /* XXX: tostring? */
+ DUK_ASSERT(h_varname != NULL);
+
+ tv_val = duk_require_tval(ctx, -1);
+
+ throw_flag = duk_is_strict_call(ctx);
+
+ act = duk_hthread_get_current_activation(thr);
+ if (act) {
+ duk_js_putvar_activation(thr, act, h_varname, tv_val, throw_flag); /* -> [ ... varname val this ] */
+ } else {
+ /* Outside any activation -> put to global. */
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL);
+ duk_js_putvar_envrec(thr, thr->builtins[DUK_BIDX_GLOBAL_ENV], h_varname, tv_val, throw_flag);
+ }
+
+ /* [ ... varname val ] */
+
+ duk_pop_2(ctx);
+
+ /* [ ... ] */
+
+ return;
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_var(duk_context *ctx) {
+ DUK_ASSERT_CTX_VALID(ctx);
+
+ DUK_ERROR_UNIMPLEMENTED_DEFMSG((duk_hthread *) ctx);
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_has_var(duk_context *ctx) {
+ DUK_ASSERT_CTX_VALID(ctx);
+
+ DUK_ERROR_UNIMPLEMENTED_DEFMSG((duk_hthread *) ctx);
+ return 0;
+}