|
@@ -27,6 +27,9 @@
|
|
|
static gravity_class_t *gravity_class_env = NULL;
|
|
|
static uint32_t refcount = 0;
|
|
|
|
|
|
+static int argc = -1;
|
|
|
+static gravity_list_t *argv = NULL;
|
|
|
+
|
|
|
/**
|
|
|
* Wraps `getenv()` to be used with Gravity.
|
|
|
*
|
|
@@ -96,6 +99,16 @@ static bool gravity_env_keys(gravity_vm *vm, gravity_value_t *args, uint16_t npa
|
|
|
RETURN_VALUE(VALUE_FROM_OBJECT(keys), rindex);
|
|
|
}
|
|
|
|
|
|
+static bool gravity_env_argc(gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
|
+ #pragma unused(vm, args, nargs)
|
|
|
+ RETURN_VALUE((argc != -1) ? VALUE_FROM_INT(argc) : VALUE_FROM_NULL, rindex);
|
|
|
+}
|
|
|
+
|
|
|
+static bool gravity_env_argv(gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
|
+ #pragma unused(vm, args, nargs)
|
|
|
+ RETURN_VALUE((argv) ? VALUE_FROM_OBJECT(argv) : VALUE_FROM_NULL, rindex);
|
|
|
+}
|
|
|
+
|
|
|
// MARK: - Internals -
|
|
|
|
|
|
static void create_optional_class (void) {
|
|
@@ -110,7 +123,13 @@ static void create_optional_class (void) {
|
|
|
// Allow map-access
|
|
|
gravity_class_bind(meta, GRAVITY_INTERNAL_LOADAT_NAME, NEW_CLOSURE_VALUE(gravity_env_get));
|
|
|
gravity_class_bind(meta, GRAVITY_INTERNAL_STOREAT_NAME, NEW_CLOSURE_VALUE(gravity_env_set));
|
|
|
-
|
|
|
+
|
|
|
+ gravity_closure_t *closure = NULL;
|
|
|
+ closure = computed_property_create(NULL, NEW_FUNCTION(gravity_env_argc), NULL);
|
|
|
+ gravity_class_bind(meta, "argc", VALUE_FROM_OBJECT(closure));
|
|
|
+ closure = computed_property_create(NULL, NEW_FUNCTION(gravity_env_argv), NULL);
|
|
|
+ gravity_class_bind(meta, "argv", VALUE_FROM_OBJECT(closure));
|
|
|
+
|
|
|
SETMETA_INITED(gravity_class_env);
|
|
|
}
|
|
|
|
|
@@ -124,14 +143,25 @@ void gravity_env_register(gravity_vm *vm) {
|
|
|
gravity_vm_setvalue(vm, GRAVITY_CLASS_ENV_NAME, VALUE_FROM_OBJECT(gravity_class_env));
|
|
|
}
|
|
|
|
|
|
+void gravity_env_register_args(gravity_vm *vm, uint32_t _argc, const char **_argv) {
|
|
|
+ argc = _argc;
|
|
|
+ argv = gravity_list_new(vm, argc);
|
|
|
+ for (int i = 0; i < _argc; ++i) {
|
|
|
+ gravity_value_t arg = VALUE_FROM_CSTRING(vm, _argv[i]);
|
|
|
+ marray_push(gravity_value_t, argv->array, arg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void gravity_env_free (void) {
|
|
|
if (!gravity_class_env) return;
|
|
|
if (--refcount) return;
|
|
|
-
|
|
|
+
|
|
|
gravity_class_t *meta = gravity_class_get_meta(gravity_class_env);
|
|
|
+ computed_property_free(meta, "argc", true);
|
|
|
+ computed_property_free(meta, "argv", true);
|
|
|
gravity_class_free_core(NULL, meta);
|
|
|
gravity_class_free_core(NULL, gravity_class_env);
|
|
|
-
|
|
|
+
|
|
|
gravity_class_env = NULL;
|
|
|
}
|
|
|
|