summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2007-09-18 12:44:54 +0000
committerAkira TAGOH <akira@tagoh.org>2007-09-18 12:44:54 +0000
commitbf5354721e0de68731f5aad02afcbb16fbf2e6e8 (patch)
treeb8a1293ee58620e30d1511eb1819468c61fbc349
parent61564e7980f1f8bdfbbf9c749e1ac4775f0ebbbd (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--ChangeLog4
-rw-r--r--hieroglyph/version.h.in8
-rw-r--r--hieroglyph/vm.c21
-rw-r--r--hieroglyph/vm.h2
4 files changed, 30 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f561db9..208a0c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,