diff options
author | Akira TAGOH <akira@tagoh.org> | 2011-03-09 19:37:51 +0900 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2011-03-09 19:37:51 +0900 |
commit | ef19d1d26af1fa20a50167f59736f26530cca175 (patch) | |
tree | bb8ef6bce9db475b5d690df5ea3caf4484d7c125 | |
parent | 4842fb16d9baee34b141a795b4ab9671a26061d4 (diff) |
add hg_dict_dup for convenience
-rw-r--r-- | hieroglyph/hgdict.c | 53 | ||||
-rw-r--r-- | hieroglyph/hgdict.h | 2 | ||||
-rw-r--r-- | hieroglyph/hgoperator.c | 32 | ||||
-rw-r--r-- | hieroglyph/hgvm.c | 29 | ||||
-rw-r--r-- | hieroglyph/hgvm.h | 7 |
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); |