mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* vm_core.h (rb_iseq_t): move flip_cnt from struct iseq_compile_data, because it has same life span as enclosing iseq. [Bug #7671] [ruby-core:51296] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38739 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			139 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**********************************************************************
 | 
						|
 | 
						|
  iseq.h -
 | 
						|
 | 
						|
  $Author$
 | 
						|
  created at: 04/01/01 23:36:57 JST
 | 
						|
 | 
						|
  Copyright (C) 2004-2008 Koichi Sasada
 | 
						|
 | 
						|
**********************************************************************/
 | 
						|
 | 
						|
#ifndef RUBY_COMPILE_H
 | 
						|
#define RUBY_COMPILE_H
 | 
						|
 | 
						|
#if defined __GNUC__ && __GNUC__ >= 4
 | 
						|
#pragma GCC visibility push(default)
 | 
						|
#endif
 | 
						|
 | 
						|
/* compile.c */
 | 
						|
VALUE rb_iseq_compile_node(VALUE self, NODE *node);
 | 
						|
int rb_iseq_translate_threaded_code(rb_iseq_t *iseq);
 | 
						|
VALUE rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
 | 
						|
			     VALUE exception, VALUE body);
 | 
						|
 | 
						|
/* iseq.c */
 | 
						|
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
 | 
						|
VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);
 | 
						|
struct st_table *ruby_insn_make_insn_table(void);
 | 
						|
unsigned int rb_iseq_line_no(const rb_iseq_t *iseq, size_t pos);
 | 
						|
 | 
						|
int rb_iseq_line_trace_each(VALUE iseqval, int (*func)(int line, rb_event_flag_t *events_ptr, void *d), void *data);
 | 
						|
VALUE rb_iseq_line_trace_all(VALUE iseqval);
 | 
						|
VALUE rb_iseq_line_trace_specify(VALUE iseqval, VALUE pos, VALUE set);
 | 
						|
 | 
						|
/* proc.c */
 | 
						|
rb_iseq_t *rb_method_get_iseq(VALUE body);
 | 
						|
rb_iseq_t *rb_proc_get_iseq(VALUE proc, int *is_proc);
 | 
						|
 | 
						|
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_line_info_entry {
 | 
						|
    unsigned int position;
 | 
						|
    unsigned int line_no;
 | 
						|
};
 | 
						|
 | 
						|
struct iseq_catch_table_entry {
 | 
						|
    enum catch_type {
 | 
						|
	CATCH_TYPE_RESCUE = INT2FIX(1),
 | 
						|
	CATCH_TYPE_ENSURE = INT2FIX(2),
 | 
						|
	CATCH_TYPE_RETRY  = INT2FIX(3),
 | 
						|
	CATCH_TYPE_BREAK  = INT2FIX(4),
 | 
						|
	CATCH_TYPE_REDO   = INT2FIX(5),
 | 
						|
	CATCH_TYPE_NEXT   = INT2FIX(6)
 | 
						|
    } type;
 | 
						|
    VALUE iseq;
 | 
						|
    unsigned long start;
 | 
						|
    unsigned long end;
 | 
						|
    unsigned long cont;
 | 
						|
    unsigned long sp;
 | 
						|
};
 | 
						|
 | 
						|
#define INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE (512)
 | 
						|
 | 
						|
struct iseq_compile_data_storage {
 | 
						|
    struct iseq_compile_data_storage *next;
 | 
						|
    unsigned long pos;
 | 
						|
    unsigned long size;
 | 
						|
    char *buff;
 | 
						|
};
 | 
						|
 | 
						|
struct iseq_compile_data {
 | 
						|
    /* GC is needed */
 | 
						|
    VALUE err_info;
 | 
						|
    VALUE mark_ary;
 | 
						|
    VALUE catch_table_ary;	/* Array */
 | 
						|
 | 
						|
    /* GC is not needed */
 | 
						|
    struct iseq_label_data *start_label;
 | 
						|
    struct iseq_label_data *end_label;
 | 
						|
    struct iseq_label_data *redo_label;
 | 
						|
    VALUE current_block;
 | 
						|
    VALUE ensure_node;
 | 
						|
    VALUE for_iseq;
 | 
						|
    struct iseq_compile_data_ensure_node_stack *ensure_node_stack;
 | 
						|
    int loopval_popped;	/* used by NODE_BREAK */
 | 
						|
    int cached_const;
 | 
						|
    struct iseq_compile_data_storage *storage_head;
 | 
						|
    struct iseq_compile_data_storage *storage_current;
 | 
						|
    int last_line;
 | 
						|
    int last_coverable_line;
 | 
						|
    int label_no;
 | 
						|
    int node_level;
 | 
						|
    const rb_compile_option_t *option;
 | 
						|
#if SUPPORT_JOKE
 | 
						|
    st_table *labels_table;
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
/* defined? */
 | 
						|
 | 
						|
enum defined_type {
 | 
						|
    DEFINED_NIL = 1,
 | 
						|
    DEFINED_IVAR,
 | 
						|
    DEFINED_LVAR,
 | 
						|
    DEFINED_GVAR,
 | 
						|
    DEFINED_CVAR,
 | 
						|
    DEFINED_CONST,
 | 
						|
    DEFINED_METHOD,
 | 
						|
    DEFINED_YIELD,
 | 
						|
    DEFINED_ZSUPER,
 | 
						|
    DEFINED_SELF,
 | 
						|
    DEFINED_TRUE,
 | 
						|
    DEFINED_FALSE,
 | 
						|
    DEFINED_ASGN,
 | 
						|
    DEFINED_EXPR,
 | 
						|
    DEFINED_IVAR2,
 | 
						|
    DEFINED_REF,
 | 
						|
    DEFINED_FUNC
 | 
						|
};
 | 
						|
 | 
						|
VALUE rb_iseq_defined_string(enum defined_type type);
 | 
						|
 | 
						|
#define DEFAULT_SPECIAL_VAR_COUNT 2
 | 
						|
 | 
						|
#if defined __GNUC__ && __GNUC__ >= 4
 | 
						|
#pragma GCC visibility pop
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* RUBY_COMPILE_H */
 |