diff options
author | Akira TAGOH <akira@tagoh.org> | 2007-09-18 12:44:54 +0000 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2007-09-18 12:44:54 +0000 |
commit | bf5354721e0de68731f5aad02afcbb16fbf2e6e8 (patch) | |
tree | b8a1293ee58620e30d1511eb1819468c61fbc349 | |
parent | 61564e7980f1f8bdfbbf9c749e1ac4775f0ebbbd (diff) |
2007-09-18 Akira TAGOH <akira@tagoh.org>
* hieroglyph/vm.c (hg_vm_stepi): new function to step one instruction exactly.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | hieroglyph/version.h.in | 8 | ||||
-rw-r--r-- | hieroglyph/vm.c | 21 | ||||
-rw-r--r-- | hieroglyph/vm.h | 2 |
4 files changed, 30 insertions, 5 deletions
@@ -1,3 +1,7 @@ +2007-09-18 Akira TAGOH <akira@tagoh.org> + + * hieroglyph/vm.c (hg_vm_stepi): new function to step one instruction exactly. + 2006-12-20 Akira TAGOH <at@gclab.org> * hieroglyph/hgfile.c (hg_file_object_ungetc): fix a duplicate of diff --git a/hieroglyph/version.h.in b/hieroglyph/version.h.in index def947c..76dbd93 100644 --- a/hieroglyph/version.h.in +++ b/hieroglyph/version.h.in @@ -21,8 +21,8 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ -#define c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ +#ifndef c51accf3-3007-457c-b903-2c1d7d5bb30cVERSION_H__ +#define c51accf3-3007-457c-b903-2c1d7d5bb30cVERSION_H__ #include <glib/gmacros.h> @@ -30,10 +30,10 @@ G_BEGIN_DECLS #define HIEROGLYPH_VERSION "@VERSION@" -#define HIEROGLYPH_UUID "c914e012-1e1c-44e8-8686-b0eb222c2ac2" +#define HIEROGLYPH_UUID "c51accf3-3007-457c-b903-2c1d7d5bb30c" const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$"; G_END_DECLS -#endif /* c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ */ +#endif /* c51accf3-3007-457c-b903-2c1d7d5bb30cVERSION_H__ */ diff --git a/hieroglyph/vm.c b/hieroglyph/vm.c index cd4a776..fd2c5a1 100644 --- a/hieroglyph/vm.c +++ b/hieroglyph/vm.c @@ -532,7 +532,8 @@ hg_vm_set_emulation_level(hg_vm_t *vm, } gboolean -hg_vm_step(hg_vm_t *vm) +hg_vm_stepi(hg_vm_t *vm, + gboolean *is_proceeded) { hg_vm_private_t *priv; hg_stack_t *estack, *ostack; @@ -541,12 +542,14 @@ hg_vm_step(hg_vm_t *vm) gsize index; hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (is_proceeded != NULL, FALSE); priv = (hg_vm_private_t *)vm; estack = priv->stack[HG_STACK_TYPE_ESTACK]; ostack = priv->stack[HG_STACK_TYPE_OSTACK]; object = hg_stack_index(estack, 0); + *is_proceeded = FALSE; evaluate: switch (HG_OBJECT_GET_TYPE (object)) { case HG_OBJECT_TYPE_ARRAY: @@ -560,6 +563,7 @@ hg_vm_step(hg_vm_t *vm) } } else { result = object; + *is_proceeded = TRUE; } if (!hg_stack_push(estack, result)) { hg_vm_set_error(vm, HG_e_execstackoverflow); @@ -581,6 +585,7 @@ hg_vm_step(hg_vm_t *vm) retval = FALSE; } hg_stack_pop(estack); + *is_proceeded = TRUE; break; case HG_OBJECT_TYPE_EVAL: result = hg_vm_dict_lookup(vm, object); @@ -598,6 +603,7 @@ hg_vm_step(hg_vm_t *vm) retval = hg_object_operator_invoke(vm, object); hg_stack_roll(estack, hg_stack_length(estack) - index + 1, 1); hg_stack_pop(estack); + *is_proceeded = TRUE; break; default: g_warning("[BUG] Unknown object type `%d'", HG_OBJECT_GET_TYPE (object)); @@ -607,6 +613,19 @@ hg_vm_step(hg_vm_t *vm) return retval; } +gboolean +hg_vm_step(hg_vm_t *vm) +{ + gboolean retval, is_proceeded; + + while ((retval = hg_vm_stepi(vm, &is_proceeded))) { + if (is_proceeded) + break; + } + + return retval; +} + hg_object_t * hg_vm_get_dict(hg_vm_t *vm) { diff --git a/hieroglyph/vm.h b/hieroglyph/vm.h index c29b195..904bf9b 100644 --- a/hieroglyph/vm.h +++ b/hieroglyph/vm.h @@ -52,6 +52,8 @@ gboolean hg_vm_finalize (hg_vm_t *vm); hg_emulationtype_t hg_vm_get_emulation_level(hg_vm_t *vm); gboolean hg_vm_set_emulation_level(hg_vm_t *vm, hg_emulationtype_t level); +gboolean hg_vm_stepi (hg_vm_t *vm, + gboolean *is_proceeded); gboolean hg_vm_step (hg_vm_t *vm); hg_object_t *hg_vm_get_dict (hg_vm_t *vm); hg_object_t *hg_vm_dict_lookup (hg_vm_t *vm, |