summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2006-08-02 18:23:41 +0000
committerAkira TAGOH <akira@tagoh.org>2006-08-02 18:23:41 +0000
commitd84324923d1c58509040ac05a638f6a1071976d7 (patch)
treefd44867140daef4c5c0f57113c3d09573fe57f23
parentf72c5c98ee62462f425cadc47c40c354c45b65b8 (diff)
2006-08-03 Akira TAGOH <at@gclab.org>
* hieroglyph/operator.c (_hg_operator_op_exec): check executeonly flag. (_hg_operator_op_executeonly): implemented. (_hg_operator_op_noaccess): use hg_object_inaccessible. * hieroglyph/vm.c (hg_vm_main): set the same flags from string to file. * hieroglyph/hgmem.h (hg_object_inexecutable): renamed from hg_object_unexecutable. (hg_object_executeonly): new macro. (hg_object_is_executeonly): new macro. (hg_object_inaccessible): new macro.
-rw-r--r--ChangeLog14
-rw-r--r--hieroglyph/hgmem.h5
-rw-r--r--hieroglyph/hgtypes.h1
-rw-r--r--hieroglyph/operator.c42
-rw-r--r--hieroglyph/scanner.c2
-rw-r--r--hieroglyph/version.h.in2
-rw-r--r--hieroglyph/vm.c2
7 files changed, 58 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index f4b814a..b16d73f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2006-08-03 Akira TAGOH <at@gclab.org>
+
+ * hieroglyph/operator.c (_hg_operator_op_exec): check executeonly flag.
+ (_hg_operator_op_executeonly): implemented.
+ (_hg_operator_op_noaccess): use hg_object_inaccessible.
+
+ * hieroglyph/vm.c (hg_vm_main): set the same flags from string to file.
+
+ * hieroglyph/hgmem.h (hg_object_inexecutable): renamed from
+ hg_object_unexecutable.
+ (hg_object_executeonly): new macro.
+ (hg_object_is_executeonly): new macro.
+ (hg_object_inaccessible): new macro.
+
2006-08-02 Akira TAGOH <at@gclab.org>
* plugins/debug/Makefile.am (LIBS): removed the unnecessary dependency.
diff --git a/hieroglyph/hgmem.h b/hieroglyph/hgmem.h
index 10f74dd..6c6206b 100644
--- a/hieroglyph/hgmem.h
+++ b/hieroglyph/hgmem.h
@@ -183,8 +183,11 @@ void hg_mem_pool_use_garbage_collection(HgMemPool *pool,
#define hg_object_is_writable(obj) hg_object_is_state(obj, HG_ST_WRITABLE)
#define hg_object_unwritable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_WRITABLE)
#define hg_object_executable(obj) hg_object_add_state(obj, HG_ST_EXECUTABLE)
-#define hg_object_unexecutable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_EXECUTABLE)
+#define hg_object_inexecutable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_EXECUTABLE)
#define hg_object_is_executable(obj) hg_object_is_state(obj, HG_ST_EXECUTABLE)
+#define hg_object_executeonly(obj) hg_object_set_state(obj, (hg_object_get_state(obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE)) | HG_ST_EXECUTEONLY)
+#define hg_object_is_executeonly(obj) hg_object_is_state(obj, HG_ST_EXECUTEONLY)
+#define hg_object_inaccessible(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE | HG_ST_EXECUTABLE | HG_ST_EXECUTEONLY))
guint hg_object_get_state (HgObject *object);
void hg_object_set_state (HgObject *object,
diff --git a/hieroglyph/hgtypes.h b/hieroglyph/hgtypes.h
index 4d47df7..7f9a1c3 100644
--- a/hieroglyph/hgtypes.h
+++ b/hieroglyph/hgtypes.h
@@ -118,6 +118,7 @@ typedef enum {
HG_ST_READABLE = 1 << 0,
HG_ST_WRITABLE = 1 << 1,
HG_ST_EXECUTABLE = 1 << 2,
+ HG_ST_EXECUTEONLY = 1 << 3,
HG_ST_RESERVED1 = 1 << 16, /* reserved for object-specific data */
HG_ST_RESERVED2 = 1 << 17, /* reserved for object-specific data */
HG_ST_RESERVED3 = 1 << 18, /* reserved for object-specific data */
diff --git a/hieroglyph/operator.c b/hieroglyph/operator.c
index 8fb284f..341e26e 100644
--- a/hieroglyph/operator.c
+++ b/hieroglyph/operator.c
@@ -2163,7 +2163,7 @@ G_STMT_START
break;
}
node = hg_stack_index(ostack, 0);
- hg_object_unexecutable((HgObject *)node);
+ hg_object_inexecutable((HgObject *)node);
retval = TRUE;
break;
}
@@ -2738,7 +2738,8 @@ G_STMT_START
}
node = hg_stack_index(ostack, 0);
if (hg_object_is_executable((HgObject *)node)) {
- if (!hg_object_is_readable((HgObject *)node)) {
+ if (!hg_object_is_executeonly((HgObject *)node) &&
+ !hg_object_is_readable((HgObject *)node)) {
_hg_operator_set_error(vm, op, VM_e_invalidaccess);
break;
}
@@ -2819,7 +2820,36 @@ G_STMT_START
} G_STMT_END;
DEFUNC_OP_END
-DEFUNC_UNIMPLEMENTED_OP (executeonly);
+DEFUNC_OP (executeonly)
+G_STMT_START
+{
+ HgStack *ostack = hg_vm_get_ostack(vm);
+ guint depth = hg_stack_depth(ostack);
+ HgValueNode *node;
+
+ while (1) {
+ if (depth < 1) {
+ _hg_operator_set_error(vm, op, VM_e_stackunderflow);
+ break;
+ }
+ node = hg_stack_index(ostack, 0);
+ if (!HG_IS_VALUE_ARRAY (node) &&
+ !HG_IS_VALUE_FILE (node) &&
+ !HG_IS_VALUE_STRING (node)) {
+ _hg_operator_set_error(vm, op, VM_e_typecheck);
+ break;
+ }
+ if (!hg_object_is_executeonly((HgObject *)node) &&
+ !hg_object_is_readable((HgObject *)node)) {
+ _hg_operator_set_error(vm, op, VM_e_invalidaccess);
+ break;
+ }
+ hg_object_executeonly((HgObject *)node);
+ retval = TRUE;
+ break;
+ }
+} G_STMT_END;
+DEFUNC_OP_END
DEFUNC_OP (exit)
G_STMT_START
@@ -4508,11 +4538,9 @@ G_STMT_START
_hg_operator_set_error(vm, op, VM_e_invalidaccess);
break;
}
- hg_object_set_state((HgObject *)dict,
- hg_object_get_state((HgObject *)dict) & ~(HG_ST_READABLE | HG_ST_WRITABLE));
+ hg_object_inaccessible((HgObject *)dict);
}
- hg_object_set_state((HgObject *)node,
- hg_object_get_state((HgObject *)node) & ~(HG_ST_READABLE | HG_ST_WRITABLE));
+ hg_object_inaccessible((HgObject *)node);
retval = TRUE;
break;
}
diff --git a/hieroglyph/scanner.c b/hieroglyph/scanner.c
index 3ebc5ac..fbdffdd 100644
--- a/hieroglyph/scanner.c
+++ b/hieroglyph/scanner.c
@@ -546,7 +546,7 @@ _hg_scanner_get_object(HgVM *vm,
switch (token_type) {
case HG_SCAN_TOKEN_LITERAL:
retval = hg_vm_get_name_node(vm, hg_string_get_string(string));
- hg_object_unexecutable((HgObject *)retval);
+ hg_object_inexecutable((HgObject *)retval);
hg_mem_free(string);
break;
case HG_SCAN_TOKEN_EVAL_NAME:
diff --git a/hieroglyph/version.h.in b/hieroglyph/version.h.in
index b853125..34e766e 100644
--- a/hieroglyph/version.h.in
+++ b/hieroglyph/version.h.in
@@ -29,7 +29,7 @@
G_BEGIN_DECLS
#define HIEROGLYPH_VERSION "@VERSION@"
-#define HIEROGLYPH_UUID "a6eaa222-c395-4009-a7fa-4c99f03e1dba"
+#define HIEROGLYPH_UUID "315eae6c-15f0-4048-a505-02636f2124cd"
const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$";
diff --git a/hieroglyph/vm.c b/hieroglyph/vm.c
index 55cac54..39b7d33 100644
--- a/hieroglyph/vm.c
+++ b/hieroglyph/vm.c
@@ -1159,6 +1159,7 @@ hg_vm_main(HgVM *vm)
case HG_TYPE_VALUE_STRING:
if (hg_object_is_executable((HgObject *)node)) {
HgString *hs = HG_VALUE_GET_STRING (node);
+ guint state = hg_object_get_state((HgObject *)node);
file = hg_file_object_new(hg_vm_get_current_pool(vm),
HG_FILE_TYPE_BUFFER,
@@ -1168,6 +1169,7 @@ hg_vm_main(HgVM *vm)
hg_string_maxlength(hs));
hg_stack_pop(vm->estack);
HG_VALUE_MAKE_FILE (node, file);
+ hg_object_set_state((HgObject *)node, state);
retval = hg_stack_push(vm->estack, node);
} else {
g_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.",