[svn:parrot] r39621 - branches/tt761_keys_revamp/src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Wed Jun 17 12:43:31 UTC 2009


Author: bacek
Date: Wed Jun 17 12:43:31 2009
New Revision: 39621
URL: https://trac.parrot.org/parrot/changeset/39621

Log:
[pmc] Fix (and add couple of XXX comments) Env.

Modified:
   branches/tt761_keys_revamp/src/pmc/env.pmc

Modified: branches/tt761_keys_revamp/src/pmc/env.pmc
==============================================================================
--- branches/tt761_keys_revamp/src/pmc/env.pmc	Wed Jun 17 12:43:11 2009	(r39620)
+++ branches/tt761_keys_revamp/src/pmc/env.pmc	Wed Jun 17 12:43:31 2009	(r39621)
@@ -10,6 +10,9 @@
 
 C<Env> is a singleton class which provides access to the system environment.
 
+XXX Think about returning Pair back. Currently there is no way to iterate over
+environment I<keys>.
+
 =head2 Methods
 
 =over 4
@@ -71,19 +74,7 @@
 */
 
     VTABLE PMC *get_iter() {
-        STRING *name         = CONST_STRING(interp, "set_key");
-        PMC    *iter         = pmc_new_init(interp, enum_class_Iterator, SELF);
-        PMC    *key          = pmc_new(interp, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (!environ[0])
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*
@@ -143,40 +134,53 @@
 
 */
 
-    VTABLE STRING *get_string_keyed(PMC *key) {
-        if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_integer_FLAG) {
-            INTVAL const keynum = VTABLE_get_integer(INTERP, key);
-            if (keynum < 0 || keynum >= SELF.elements()) {
-                return string_from_literal(interp, "");
-            }
-            else {
-                const char * const envp = environ[keynum];
-                const char * const p    = strchr(envp, '=');
-                return Parrot_str_new(interp, envp, (UINTVAL)(p - envp));
+    VTABLE STRING *get_string_keyed_str(STRING *key) {
+        char * const keyname = Parrot_str_to_cstring(interp, key);
+
+        if (keyname) {
+            int free_it = 0;
+            char * const val = Parrot_getenv(keyname, &free_it);
+            Parrot_str_free_cstring(keyname);
+
+            if (val) {
+                STRING * const retval = Parrot_str_new(interp, val, 0);
+
+                if (free_it)
+                    mem_sys_free(val);
+
+                return retval;
+
             }
         }
-        else {
-            char * const keyname = Parrot_str_to_cstring(interp,
-                VTABLE_get_string(interp, key));
 
-            if (keyname) {
-                int free_it = 0;
-                char * const val = Parrot_getenv(keyname, &free_it);
-                Parrot_str_free_cstring(keyname);
+        return string_from_literal(interp, "");
+    }
 
-                if (val) {
-                    STRING * const retval = Parrot_str_new(interp, val, 0);
+    VTABLE STRING *get_string_keyed(PMC *key) {
+        return SELF.get_string_keyed_str(VTABLE_get_string(INTERP, key));
+    }
 
-                    if (free_it)
-                        mem_sys_free(val);
+/*
 
-                    return retval;
+=item C<STRING *get_string_keyed_int(PMC *key)>
 
-                }
-            }
+Returns the Parrot string value for the environment variable at position C<pos>.
 
+Used during iteration.
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed_int(INTVAL pos) {
+        if (pos < 0 || pos >= SELF.elements()) {
             return string_from_literal(interp, "");
         }
+        else {
+            const char * const envp = environ[pos];
+            const char * const p    = strchr(envp, '=');
+            return Parrot_str_new(interp, envp, (UINTVAL)(p - envp));
+        }
     }
 
 /*


More information about the parrot-commits mailing list