mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
7049d9c80d
to solve an issue reported at [ruby-dev:44413] [Ruby 1.9 - Bug #5217]. Before this fix, each instruction has an information including line number (iseq::iseq_insn_info_table). Instead of this data structure, recording only line number changing places (iseq::iseq_line_info_table). The order of entries in iseq_line_info_table is ascending order of iseq_line_info_table_entry::position. You can get a line number by an iseq and a program counter with this data structure. This fix reduces memory consumption of iseq (bytecode). On my measurement, a rails application consumes 21.8MB for iseq with this fix on the 32bit CPU. Without this fix, it consumes 24.7MB for iseq [ruby-dev:44415]. * proc.c: ditto. * vm_insnhelper.c: ditto. * vm_method.c: ditto. * vm.c (rb_vm_get_sourceline): change to use rb_iseq_line_no(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
125 lines
2.9 KiB
C
125 lines
2.9 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);
|
|
|
|
/* 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,
|
|
CATCH_TYPE_ENSURE,
|
|
CATCH_TYPE_RETRY,
|
|
CATCH_TYPE_BREAK,
|
|
CATCH_TYPE_REDO,
|
|
CATCH_TYPE_NEXT
|
|
} 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 flip_cnt;
|
|
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_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
|
|
#endif
|
|
|
|
#endif /* RUBY_COMPILE_H */
|