summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2011-03-09 19:37:51 +0900
committerAkira TAGOH <akira@tagoh.org>2011-03-09 19:37:51 +0900
commitef19d1d26af1fa20a50167f59736f26530cca175 (patch)
treebb8ef6bce9db475b5d690df5ea3caf4484d7c125
parent4842fb16d9baee34b141a795b4ab9671a26061d4 (diff)
add hg_dict_dup for convenience
-rw-r--r--hieroglyph/hgdict.c53
-rw-r--r--hieroglyph/hgdict.h2
-rw-r--r--hieroglyph/hgoperator.c32
-rw-r--r--hieroglyph/hgvm.c29
-rw-r--r--hieroglyph/hgvm.h7
5 files changed, 58 insertions, 65 deletions
diff --git a/hieroglyph/hgdict.c b/hieroglyph/hgdict.c
index 7439605..44d6920 100644
--- a/hieroglyph/hgdict.c
+++ b/hieroglyph/hgdict.c
@@ -848,6 +848,19 @@ _hg_dict_traverse_first_item(hg_mem_t *mem,
return FALSE;
}
+static hg_bool_t
+_hg_dict_traverse_dup(hg_mem_t *mem,
+ hg_quark_t qkey,
+ hg_quark_t qval,
+ hg_pointer_t data)
+{
+ hg_dict_t *d = data;
+
+ hg_dict_add(d, qkey, qval, TRUE);
+
+ return TRUE;
+}
+
/*< public >*/
void
_hg_dict_node_set_size(hg_usize_t size)
@@ -894,6 +907,46 @@ hg_dict_new(hg_mem_t *mem,
}
/**
+ * hg_dict_dup:
+ * @dict:
+ * @ret:
+ *
+ * FIXME
+ *
+ * Returns:
+ */
+hg_quark_t
+hg_dict_dup(hg_dict_t *dict,
+ hg_pointer_t *ret)
+{
+ hg_quark_t retval;
+ hg_dict_t *d;
+
+ hg_return_val_if_fail (dict != NULL, Qnil, HG_e_typecheck);
+ hg_return_val_if_fail (dict->o.type == HG_TYPE_DICT, Qnil, HG_e_typecheck);
+
+ retval = hg_dict_new(dict->o.mem,
+ hg_dict_maxlength(dict),
+ dict->raise_dictfull,
+ (hg_pointer_t *)&d);
+ if (retval != Qnil) {
+ /* copy ACLs */
+ d->o.acl = dict->o.acl;
+ hg_quark_set_acl(&retval, d->o.acl);
+
+ /* copy nodes */
+ hg_dict_foreach(dict, _hg_dict_traverse_dup, d);
+
+ if (ret)
+ *ret = d;
+ else
+ hg_mem_unlock_object(dict->o.mem, retval);
+ }
+
+ return retval;
+}
+
+/**
* hg_dict_add:
* @dict:
* @qkey:
diff --git a/hieroglyph/hgdict.h b/hieroglyph/hgdict.h
index f566d77..fff1597 100644
--- a/hieroglyph/hgdict.h
+++ b/hieroglyph/hgdict.h
@@ -64,6 +64,8 @@ hg_quark_t hg_dict_new (hg_mem_t *mem,
hg_usize_t size,
hg_bool_t raise_dictfull,
hg_pointer_t *ret);
+hg_quark_t hg_dict_dup (hg_dict_t *dict,
+ hg_pointer_t *ret);
hg_bool_t hg_dict_add (hg_dict_t *dict,
hg_quark_t qkey,
hg_quark_t qval,
diff --git a/hieroglyph/hgoperator.c b/hieroglyph/hgoperator.c
index ec7595a..b1a843b 100644
--- a/hieroglyph/hgoperator.c
+++ b/hieroglyph/hgoperator.c
@@ -3905,17 +3905,6 @@ DEFUNC_OPER (for)
SET_EXPECTED_STACK_SIZE (-4, 5, 0);
} DEFUNC_OPER_END
-static hg_bool_t
-_hg_operator_dup_dict(hg_mem_t *mem,
- hg_quark_t qkey,
- hg_quark_t qval,
- hg_pointer_t data)
-{
- hg_dict_t *dict = data;
-
- return hg_dict_add(dict, qkey, qval, TRUE);
-}
-
/* <array> <proc> forall -
* <packedarray> <proc> forall -
* <dict> <proc> forall -
@@ -3924,7 +3913,7 @@ _hg_operator_dup_dict(hg_mem_t *mem,
DEFUNC_OPER (forall)
{
hg_quark_t arg0, arg1, q = Qnil, qd;
- hg_dict_t *dict, *new_dict;
+ hg_dict_t *dict;
CHECK_STACK (ostack, 2);
@@ -3943,31 +3932,15 @@ DEFUNC_OPER (forall)
HG_QNAME ("%forall_array_continue"),
FALSE);
} else if (HG_IS_QDICT (arg0)) {
- hg_quark_acl_t acl = 0;
-
dict = HG_VM_LOCK (vm, arg0);
if (dict == NULL)
return FALSE;
- qd = hg_dict_new(dict->o.mem,
- hg_dict_maxlength(dict),
- dict->raise_dictfull,
- (hg_pointer_t *)&new_dict);
+ qd = hg_dict_dup(dict, NULL);
if (qd == Qnil) {
HG_VM_UNLOCK (vm, arg0);
- HG_VM_UNLOCK (vm, qd);
hg_error_return (HG_STATUS_FAILED, HG_e_VMerror);
}
- if (hg_vm_quark_is_readable(vm, &arg0))
- acl |= HG_ACL_READABLE;
- if (hg_vm_quark_is_writable(vm, &arg0))
- acl |= HG_ACL_WRITABLE;
- if (hg_vm_quark_is_executable(vm, &arg0))
- acl |= HG_ACL_EXECUTABLE;
- if (hg_vm_quark_is_accessible(vm, &arg0))
- acl |= HG_ACL_ACCESSIBLE;
- hg_vm_quark_set_acl(vm, &qd, acl);
- hg_dict_foreach(dict, _hg_operator_dup_dict, new_dict);
HG_VM_UNLOCK (vm, arg0);
arg0 = qd;
@@ -3975,7 +3948,6 @@ DEFUNC_OPER (forall)
q = hg_vm_dict_lookup(vm, vm->qsystemdict,
HG_QNAME ("%forall_dict_continue"),
FALSE);
- HG_VM_UNLOCK (vm, qd);
} else if (HG_IS_QSTRING (arg0)) {
q = hg_vm_dict_lookup(vm, vm->qsystemdict,
HG_QNAME ("%forall_string_continue"),
diff --git a/hieroglyph/hgvm.c b/hieroglyph/hgvm.c
index 9ade0fc..362ba58 100644
--- a/hieroglyph/hgvm.c
+++ b/hieroglyph/hgvm.c
@@ -723,19 +723,6 @@ _hg_vm_run_gc(hg_mem_t *mem,
}
static hg_bool_t
-_hg_vm_dup_dict(hg_mem_t *mem,
- hg_quark_t qkey,
- hg_quark_t qval,
- hg_pointer_t data)
-{
- hg_dict_t *dict = data;
-
- hg_dict_add(dict, qkey, qval, TRUE);
-
- return TRUE;
-}
-
-static hg_bool_t
_hg_vm_dup_stack(hg_mem_t *mem,
hg_quark_t qdata,
hg_pointer_t data)
@@ -1811,7 +1798,6 @@ hg_vm_eval(hg_vm_t *vm,
if (protect_systemdict) {
hg_dict_t *d, *o;
hg_bool_t flag = TRUE;
- hg_quark_acl_t acl = 0;
old_systemdict = vm->qsystemdict;
old_state_hold_langlevel = vm->hold_lang_level;
@@ -1821,25 +1807,12 @@ hg_vm_eval(hg_vm_t *vm,
hg_warning("Unable to protect systemdict.");
return FALSE;
}
- vm->qsystemdict = hg_dict_new(o->o.mem,
- hg_dict_maxlength(o),
- o->raise_dictfull,
- (hg_pointer_t *)&d);
+ vm->qsystemdict = hg_dict_dup(o, (hg_pointer_t *)&d);
if (vm->qsystemdict == Qnil) {
hg_warning("Unable to duplicate systemdict.");
flag = FALSE;
goto fini_systemdict;
}
- if (hg_vm_quark_is_readable(vm, &old_systemdict))
- acl |= HG_ACL_READABLE;
- if (hg_vm_quark_is_writable(vm, &old_systemdict))
- acl |= HG_ACL_WRITABLE;
- if (hg_vm_quark_is_executable(vm, &old_systemdict))
- acl |= HG_ACL_EXECUTABLE;
- if (hg_vm_quark_is_accessible(vm, &old_systemdict))
- acl |= HG_ACL_ACCESSIBLE;
- hg_vm_quark_set_acl(vm, &vm->qsystemdict, acl);
- hg_dict_foreach(o, _hg_vm_dup_dict, d);
hg_vm_hold_language_level(vm, FALSE);
if (!hg_dict_add(d,
HG_QNAME ("systemdict"),
diff --git a/hieroglyph/hgvm.h b/hieroglyph/hgvm.h
index d3a75a5..3b16a8d 100644
--- a/hieroglyph/hgvm.h
+++ b/hieroglyph/hgvm.h
@@ -233,13 +233,6 @@ hg_uint_t hg_vm_get_current_time (hg_vm_t *vm);
hg_bool_t hg_vm_has_error (hg_vm_t *vm);
void hg_vm_clear_error (hg_vm_t *vm);
void hg_vm_reset_error (hg_vm_t *vm);
-#if 0
-hg_bool_t hg_vm_set_error (hg_vm_t *vm,
- hg_quark_t qdata,
- hg_error_reason_t error);
-hg_bool_t hg_vm_set_error0 (hg_vm_t *vm,
- hg_quark_t qdata);
-#endif
void hg_vm_reserved_spool_dump(hg_vm_t *vm,
hg_mem_t *mem,
hg_file_t *ofile);