[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