浏览代码

Add argc and argv properties for ENV class

bynect 4 年之前
父节点
当前提交
e69fe0217d
共有 3 个文件被更改,包括 47 次插入3 次删除
  1. 3 0
      src/cli/gravity.c
  2. 43 3
      src/optionals/gravity_opt_env.c
  3. 1 0
      src/optionals/gravity_opt_env.h

+ 3 - 0
src/cli/gravity.c

@@ -11,6 +11,7 @@
 #include "gravity_utils.h"
 #include "gravity_core.h"
 #include "gravity_vm.h"
+#include "gravity_opt_env.h"
 
 #define DEFAULT_OUTPUT "gravity.g"
 
@@ -421,6 +422,8 @@ int main (int argc, const char* argv[]) {
     // create VM
     gravity_vm *vm = gravity_vm_new(&delegate);
 
+    gravity_env_register_args(vm, argc, argv);
+
     // check if input file is source code that needs to be compiled
     if ((type == OP_COMPILE) || (type == OP_COMPILE_RUN) || (type == OP_INLINE_RUN)) {
 

+ 43 - 3
src/optionals/gravity_opt_env.c

@@ -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,24 @@ 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_argv(gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+    
+    if (argv)
+        RETURN_VALUE(VALUE_FROM_OBJECT(argv), rindex);
+
+    RETURN_VALUE(VALUE_FROM_NULL, rindex);
+}
+
+static bool gravity_env_argc(gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+
+    if (argc != -1)
+        RETURN_VALUE(VALUE_FROM_INT(argc), rindex);
+
+    RETURN_VALUE(VALUE_FROM_NULL, rindex);
+}
+
 // MARK: - Internals -
 
 static void create_optional_class (void) {
@@ -110,7 +131,14 @@ 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));
-    
+
+    // argc and argv properties
+    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 +152,26 @@ 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) {
+    gravity_value_t tmp[_argc];
+    for (int i = 0; i < _argc; ++i) {
+        tmp[i] = VALUE_FROM_CSTRING(NULL, _argv[i]);
+    }
+
+    argc = _argc;
+    argv = gravity_list_from_array(vm, argc, tmp);
+}
+
 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;
 }
 

+ 1 - 0
src/optionals/gravity_opt_env.h

@@ -6,6 +6,7 @@
 #include "gravity_value.h"
 
 void gravity_env_register (gravity_vm *vm);
+void gravity_env_register_args(gravity_vm *vm, uint32_t _argc, const char **_argv);
 void gravity_env_free (void);
 bool gravity_isenv_class (gravity_class_t *c);
 const char *gravity_env_name (void);