aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-31 01:42:54 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-31 01:42:54 +0000
commitb76fd8283aa28794c082c61615b57bc0e80acdc7 (patch)
treed84fa4c3e9c691b471cfe8d66cd4b40976eb0dc2
parent2b82e06aaf112d8ebb48c5424940cb08e738d9b4 (diff)
downloadruby-b76fd8283aa28794c082c61615b57bc0e80acdc7.tar.gz
* vm_core.h: some refactoring.
- move decl. of rb_compile_option_struct to iseq.h. - define enum iseq_type. - define enum vm_special_object_type. * compile.c: some refactoring. - apply above changes. - (struct iseq_link_element): change value of type. - remove unused decl. - fix comment. - rename iseq_build_body and iseq_build_exception to iseq_build_from_ary_body and iseq_build_from_ary_exception. * iseq.h: define enum catch_type and enum defined_type. * insns.def: apply above changes. * iseq.c: define ISEQ_MAJOR_VERSION and ISEQ_MINOR_VERSION. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29649 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog21
-rw-r--r--compile.c36
-rw-r--r--insns.def18
-rw-r--r--iseq.c12
-rw-r--r--iseq.h59
-rw-r--r--vm_core.h36
6 files changed, 110 insertions, 72 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d6d807c94..2393964a2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Sun Oct 31 09:30:51 2010 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: some refactoring.
+ - move decl. of rb_compile_option_struct to iseq.h.
+ - define enum iseq_type.
+ - define enum vm_special_object_type.
+
+ * compile.c: some refactoring.
+ - apply above changes.
+ - (struct iseq_link_element): change value of type.
+ - remove unused decl.
+ - fix comment.
+ - rename iseq_build_body and iseq_build_exception to
+ iseq_build_from_ary_body and iseq_build_from_ary_exception.
+
+ * iseq.h: define enum catch_type and enum defined_type.
+
+ * insns.def: apply above changes.
+
+ * iseq.c: define ISEQ_MAJOR_VERSION and ISEQ_MINOR_VERSION.
+
Sat Oct 30 23:38:59 2010 Kouhei Sutou <kou@cozmixng.org>
* lib/rexml/encoding.rb: untabify.
diff --git a/compile.c b/compile.c
index 4ee20d458b..c852b2c234 100644
--- a/compile.c
+++ b/compile.c
@@ -24,10 +24,10 @@
typedef struct iseq_link_element {
enum {
- ISEQ_ELEMENT_NONE = INT2FIX(0x00),
- ISEQ_ELEMENT_LABEL = INT2FIX(0x01),
- ISEQ_ELEMENT_INSN = INT2FIX(0x02),
- ISEQ_ELEMENT_ADJUST = INT2FIX(0x03)
+ ISEQ_ELEMENT_NONE,
+ ISEQ_ELEMENT_LABEL,
+ ISEQ_ELEMENT_INSN,
+ ISEQ_ELEMENT_ADJUST,
} type;
struct iseq_link_element *next;
struct iseq_link_element *prev;
@@ -329,8 +329,6 @@ static int insn_data_length(INSN *iobj);
static int insn_data_line_no(INSN *iobj);
static int calc_sp_depth(int depth, INSN *iobj);
-static void ADD_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *elem);
-
static INSN *new_insn_body(rb_iseq_t *iseq, int line_no, int insn_id, int argc, ...);
static LABEL *new_label_body(rb_iseq_t *iseq, long line);
static ADJUST *new_adjust_body(rb_iseq_t *iseq, LABEL *label, int line);
@@ -1252,7 +1250,7 @@ static const struct st_hash_type cdhash_type = {
};
/**
- ruby insn object array -> raw instruction sequence
+ ruby insn object list -> raw instruction sequence
*/
static int
iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
@@ -2859,7 +2857,7 @@ add_ensure_iseq(LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
}
static VALUE
-setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
+setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, VALUE *flag)
{
VALUE argc = INT2FIX(0);
int nsplat = 0;
@@ -3743,7 +3741,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_OP_ASGN1: {
DECL_ANCHOR(args);
VALUE argc;
- unsigned long flag = 0;
+ VALUE flag = 0;
ID id = node->nd_mid;
int boff = 0;
@@ -4024,7 +4022,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
DECL_ANCHOR(args);
ID mid = node->nd_mid;
VALUE argc;
- unsigned long flag = 0;
+ VALUE flag = 0;
VALUE parent_block = iseq->compile_data->current_block;
iseq->compile_data->current_block = Qfalse;
@@ -4121,7 +4119,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_ZSUPER:{
DECL_ANCHOR(args);
VALUE argc;
- unsigned long flag = 0;
+ VALUE flag = 0;
VALUE parent_block = iseq->compile_data->current_block;
INIT_ANCHOR(args);
@@ -4292,7 +4290,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_YIELD:{
DECL_ANCHOR(args);
VALUE argc;
- unsigned long flag = 0;
+ VALUE flag = 0;
INIT_ANCHOR(args);
if (iseq->type == ISEQ_TYPE_TOP) {
@@ -4907,7 +4905,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_ATTRASGN:{
DECL_ANCHOR(recv);
DECL_ANCHOR(args);
- unsigned long flag = 0;
+ VALUE flag = 0;
VALUE argc;
INIT_ANCHOR(recv);
@@ -5170,7 +5168,7 @@ get_exception_sym2type(VALUE sym)
if (sym == symEnsure) return CATCH_TYPE_ENSURE;
if (sym == symRetry) return CATCH_TYPE_RETRY;
if (sym == symBreak) return CATCH_TYPE_BREAK;
- if (sym == symRedo) return CATCH_TYPE_REDO;
+ if (sym == symRedo) return CATCH_TYPE_REDO;
if (sym == symNext) return CATCH_TYPE_NEXT;
rb_raise(rb_eSyntaxError, "invalid exception symbol: %s",
RSTRING_PTR(rb_inspect(sym)));
@@ -5178,7 +5176,7 @@ get_exception_sym2type(VALUE sym)
}
static int
-iseq_build_exception(rb_iseq_t *iseq, struct st_table *labels_table,
+iseq_build_from_ary_exception(rb_iseq_t *iseq, struct st_table *labels_table,
VALUE exception)
{
int i;
@@ -5227,7 +5225,7 @@ insn_make_insn_table(void)
}
static int
-iseq_build_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
+iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
VALUE body, struct st_table *labels_table)
{
/* TODO: body should be frozen */
@@ -5370,9 +5368,7 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
int i;
ID *tbl;
struct st_table *labels_table = st_init_numtable();
-
DECL_ANCHOR(anchor);
-
INIT_ANCHOR(anchor);
iseq->local_table_size = RARRAY_LENINT(locals);
@@ -5430,10 +5426,10 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
}
/* exception */
- iseq_build_exception(iseq, labels_table, exception);
+ iseq_build_from_ary_exception(iseq, labels_table, exception);
/* body */
- iseq_build_body(iseq, anchor, body, labels_table);
+ iseq_build_from_ary_body(iseq, anchor, body, labels_table);
return iseq->self;
}
diff --git a/insns.def b/insns.def
index b117fd5e35..ea20320e75 100644
--- a/insns.def
+++ b/insns.def
@@ -336,7 +336,9 @@ putspecialobject
()
(VALUE val)
{
- switch (value_type) {
+ enum vm_special_object_type type = value_type;
+
+ switch (type) {
case VM_SPECIAL_OBJECT_VMCORE:
val = rb_mRubyVMFrozenCore;
break;
@@ -746,12 +748,14 @@ adjuststack
*/
DEFINE_INSN
defined
-(rb_num_t type, VALUE obj, VALUE needstr)
+(rb_num_t op_type, VALUE obj, VALUE needstr)
(VALUE v)
(VALUE val)
{
VALUE klass;
const char *expr_type = 0;
+ enum defined_type type = op_type;
+
val = Qnil;
switch (type) {
@@ -994,9 +998,9 @@ send
const rb_method_entry_t *me;
VALUE recv, klass;
rb_block_t *blockptr = 0;
- int num = caller_setup_args(th, GET_CFP(), op_flag, (int)op_argc,
+ VALUE flag = op_flag;
+ int num = caller_setup_args(th, GET_CFP(), flag, (int)op_argc,
(rb_iseq_t *)blockiseq, &blockptr);
- rb_num_t flag = op_flag;
ID id = op_id;
/* get receiver */
@@ -1020,13 +1024,15 @@ invokesuper
(VALUE val) // inc += - (int)(op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
{
rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? GET_BLOCK_PTR() : 0;
- int num = caller_setup_args(th, GET_CFP(), op_flag,
+ VALUE flag = op_flag;
+ int num = caller_setup_args(th, GET_CFP(), flag,
(int)op_argc, blockiseq, &blockptr);
VALUE recv, klass;
ID id;
- VALUE flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
const rb_method_entry_t *me;
+ flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
+
recv = GET_SELF();
vm_search_superclass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass);
diff --git a/iseq.c b/iseq.c
index 327de57361..fedc00e1ab 100644
--- a/iseq.c
+++ b/iseq.c
@@ -19,6 +19,9 @@
#include "insns.inc"
#include "insns_info.inc"
+#define ISEQ_MAJOR_VERSION 1
+#define ISEQ_MINOR_VERSION 2
+
VALUE rb_cISeq;
#define hidden_obj_p(obj) (!SPECIAL_CONST_P(obj) && !RBASIC(obj)->klass)
@@ -1331,8 +1334,8 @@ iseq_data_to_ary(rb_iseq_t *iseq)
* :catch_table, :bytecode]
*/
rb_ary_push(val, rb_str_new2("YARVInstructionSequence/SimpleDataFormat"));
- rb_ary_push(val, INT2FIX(1)); /* major */
- rb_ary_push(val, INT2FIX(2)); /* minor */
+ rb_ary_push(val, INT2FIX(ISEQ_MAJOR_VERSION)); /* major */
+ rb_ary_push(val, INT2FIX(ISEQ_MINOR_VERSION)); /* minor */
rb_ary_push(val, INT2FIX(1));
rb_ary_push(val, misc);
rb_ary_push(val, iseq->name);
@@ -1508,6 +1511,11 @@ Init_ISeq(void)
rb_define_method(rb_cISeq, "to_a", iseq_to_a, 0);
rb_define_method(rb_cISeq, "eval", iseq_eval, 0);
+#if 0 /* TBD */
+ rb_define_method(rb_cISeq, "marshal_dump", iseq_marshal_dump, 0);
+ rb_define_method(rb_cISeq, "marshal_load", iseq_marshal_load, 1);
+#endif
+
/* disable this feature because there is no verifier. */
/* rb_define_singleton_method(rb_cISeq, "load", iseq_s_load, -1); */
(void)iseq_s_load;
diff --git a/iseq.h b/iseq.h
index bc821ec00c..2f3c460e8e 100644
--- a/iseq.h
+++ b/iseq.h
@@ -26,22 +26,17 @@ VALUE rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
struct st_table *ruby_insn_make_insn_table(void);
-#define ISEQ_TYPE_TOP INT2FIX(1)
-#define ISEQ_TYPE_METHOD INT2FIX(2)
-#define ISEQ_TYPE_BLOCK INT2FIX(3)
-#define ISEQ_TYPE_CLASS INT2FIX(4)
-#define ISEQ_TYPE_RESCUE INT2FIX(5)
-#define ISEQ_TYPE_ENSURE INT2FIX(6)
-#define ISEQ_TYPE_EVAL INT2FIX(7)
-#define ISEQ_TYPE_MAIN INT2FIX(8)
-#define ISEQ_TYPE_DEFINED_GUARD INT2FIX(9)
-
-#define CATCH_TYPE_RESCUE ((int)INT2FIX(1))
-#define CATCH_TYPE_ENSURE ((int)INT2FIX(2))
-#define CATCH_TYPE_RETRY ((int)INT2FIX(3))
-#define CATCH_TYPE_BREAK ((int)INT2FIX(4))
-#define CATCH_TYPE_REDO ((int)INT2FIX(5))
-#define CATCH_TYPE_NEXT ((int)INT2FIX(6))
+struct rb_compile_option_struct {
+ int inline_const_cache;
+ int peephole_optimization;
+ int tailcall_optimization;
+ int specialized_instruction;
+ int operands_unification;
+ int instructions_unification;
+ int stack_caching;
+ int trace_instruction;
+ int debug_level;
+};
struct iseq_insn_info_entry {
unsigned short position;
@@ -50,7 +45,14 @@ struct iseq_insn_info_entry {
};
struct iseq_catch_table_entry {
- VALUE type;
+ enum catch_type {
+ CATCH_TYPE_RESCUE,
+ CATCH_TYPE_ENSURE,
+ CATCH_TYPE_RETRY,
+ CATCH_TYPE_BREAK,
+ CATCH_TYPE_REDO,
+ CATCH_TYPE_NEXT,
+ } type;
VALUE iseq;
unsigned long start;
unsigned long end;
@@ -94,16 +96,19 @@ struct iseq_compile_data {
};
/* defined? */
-#define DEFINED_IVAR INT2FIX(1)
-#define DEFINED_IVAR2 INT2FIX(2)
-#define DEFINED_GVAR INT2FIX(3)
-#define DEFINED_CVAR INT2FIX(4)
-#define DEFINED_CONST INT2FIX(5)
-#define DEFINED_METHOD INT2FIX(6)
-#define DEFINED_YIELD INT2FIX(7)
-#define DEFINED_REF INT2FIX(8)
-#define DEFINED_ZSUPER INT2FIX(9)
-#define DEFINED_FUNC INT2FIX(10)
+
+enum defined_type {
+ DEFINED_IVAR = 1,
+ DEFINED_IVAR2,
+ DEFINED_GVAR,
+ DEFINED_CVAR,
+ DEFINED_CONST,
+ DEFINED_METHOD,
+ DEFINED_YIELD,
+ DEFINED_REF,
+ DEFINED_ZSUPER,
+ DEFINED_FUNC,
+};
#if defined __GNUC__ && __GNUC__ >= 4
#pragma GCC visibility pop
diff --git a/vm_core.h b/vm_core.h
index c425ba52e2..651f905404 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -122,17 +122,7 @@ typedef unsigned long rb_num_t;
struct iseq_compile_data_ensure_node_stack;
-typedef struct rb_compile_option_struct {
- int inline_const_cache;
- int peephole_optimization;
- int tailcall_optimization;
- int specialized_instruction;
- int operands_unification;
- int instructions_unification;
- int stack_caching;
- int trace_instruction;
- int debug_level;
-} rb_compile_option_t;
+typedef struct rb_compile_option_struct rb_compile_option_t;
struct iseq_inline_cache_entry {
VALUE ic_vmstat;
@@ -162,7 +152,18 @@ struct rb_iseq_struct {
/* static data */
/***************/
- VALUE type; /* instruction sequence type */
+ enum iseq_type {
+ ISEQ_TYPE_TOP,
+ ISEQ_TYPE_METHOD,
+ ISEQ_TYPE_BLOCK,
+ ISEQ_TYPE_CLASS,
+ ISEQ_TYPE_RESCUE,
+ ISEQ_TYPE_ENSURE,
+ ISEQ_TYPE_EVAL,
+ ISEQ_TYPE_MAIN,
+ ISEQ_TYPE_DEFINED_GUARD,
+ } type; /* instruction sequence type */
+
VALUE name; /* String: iseq name */
VALUE filename; /* file information where this sequence from */
VALUE filepath; /* real file path or nil */
@@ -374,8 +375,7 @@ struct rb_unblock_callback {
struct rb_mutex_struct;
-typedef struct rb_thread_struct
-{
+typedef struct rb_thread_struct {
VALUE self;
rb_vm_t *vm;
@@ -552,9 +552,11 @@ typedef struct {
#define VM_CALL_SUPER_BIT (0x01 << 7)
#define VM_CALL_OPT_SEND_BIT (0x01 << 8)
-#define VM_SPECIAL_OBJECT_VMCORE 0x01
-#define VM_SPECIAL_OBJECT_CBASE 0x02
-#define VM_SPECIAL_OBJECT_CONST_BASE 0x03
+enum vm_special_object_type {
+ VM_SPECIAL_OBJECT_VMCORE = 1,
+ VM_SPECIAL_OBJECT_CBASE,
+ VM_SPECIAL_OBJECT_CONST_BASE,
+};
#define VM_FRAME_MAGIC_METHOD 0x11
#define VM_FRAME_MAGIC_BLOCK 0x21