2006-12-31 18:02:22 +03:00
|
|
|
/**********************************************************************
|
|
|
|
|
|
|
|
vm.c -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
|
2007-02-05 15:21:01 +03:00
|
|
|
Copyright (C) 2004-2007 Koichi Sasada
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
2014-11-15 14:49:06 +03:00
|
|
|
#include "internal.h"
|
2010-10-13 14:28:25 +04:00
|
|
|
#include "ruby/vm.h"
|
2007-06-10 07:06:15 +04:00
|
|
|
#include "ruby/st.h"
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
#include "gc.h"
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
#include "vm_core.h"
|
* include/ruby/node.h, vm_core.h: move definition of
RUBY_VM_METHOD_NODE to node.h.
* class.c, common.mk: remove useless inclusion.
* compile.h, iseq.h, vm_core.h: rename compile.h to iseq.h.
move some definitions from vm_core.h to iseq.h.
* compile.c, iseq.c, vm.c: ditto.
* eval.c, compile.c: move some functions for parser
from eval.c to compile.c.
* eval_intern.h, vm_core.h: move va_init_list() macro to
vm_core.h.
* iseq.c (rb_iseq_new_top, rb_iseq_first_lineno): added.
* load.c, ruby.c: use rb_iseq_new_top() instead of
rb_iseq_new() with ISEQ_TYPE_TOP constant directly.
* proc.c: use rb_iseq_first_lineno() instead of accessing
iseq structure.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19472 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 11:49:45 +04:00
|
|
|
#include "iseq.h"
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
#include "eval_intern.h"
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
#include "probes.h"
|
2012-11-18 20:30:10 +04:00
|
|
|
#include "probes_helper.h"
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
static inline VALUE *
|
|
|
|
VM_EP_LEP(VALUE *ep)
|
|
|
|
{
|
2013-04-29 12:44:16 +04:00
|
|
|
while (!VM_EP_LEP_P(ep)) {
|
2012-06-11 07:14:59 +04:00
|
|
|
ep = VM_EP_PREV_EP(ep);
|
|
|
|
}
|
2013-04-29 12:44:16 +04:00
|
|
|
return ep;
|
2012-06-11 07:14:59 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE *
|
|
|
|
rb_vm_ep_local_ep(VALUE *ep)
|
|
|
|
{
|
|
|
|
return VM_EP_LEP(ep);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline VALUE *
|
|
|
|
VM_CF_LEP(rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
return VM_EP_LEP(cfp->ep);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline VALUE *
|
|
|
|
VM_CF_PREV_EP(rb_control_frame_t * cfp)
|
|
|
|
{
|
|
|
|
return VM_EP_PREV_EP((cfp)->ep);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline rb_block_t *
|
|
|
|
VM_CF_BLOCK_PTR(rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
VALUE *ep = VM_CF_LEP(cfp);
|
|
|
|
return VM_EP_BLOCK_PTR(ep);
|
|
|
|
}
|
|
|
|
|
|
|
|
rb_block_t *
|
|
|
|
rb_vm_control_frame_block_ptr(rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
return VM_CF_BLOCK_PTR(cfp);
|
|
|
|
}
|
|
|
|
|
2012-11-22 11:23:40 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
2012-10-04 16:31:05 +04:00
|
|
|
static void vm_collect_usage_operand(int insn, int n, VALUE op);
|
|
|
|
static void vm_collect_usage_insn(int insn);
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
static void vm_collect_usage_register(int reg, int isset);
|
2012-10-04 16:31:05 +04:00
|
|
|
#endif
|
|
|
|
|
2012-08-20 15:36:34 +04:00
|
|
|
static VALUE
|
|
|
|
vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self, VALUE defined_class,
|
|
|
|
int argc, const VALUE *argv, const rb_block_t *blockptr);
|
|
|
|
|
2013-12-09 14:51:02 +04:00
|
|
|
static rb_serial_t ruby_vm_global_method_state = 1;
|
|
|
|
static rb_serial_t ruby_vm_global_constant_state = 1;
|
2013-11-09 07:34:49 +04:00
|
|
|
static rb_serial_t ruby_vm_class_serial = 1;
|
* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: Implement class hierarchy method cache invalidation.
[ruby-core:55053] [Feature #8426] [GH-387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 09:25:06 +04:00
|
|
|
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
#include "vm_insnhelper.h"
|
2007-12-20 12:29:46 +03:00
|
|
|
#include "vm_insnhelper.c"
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
#include "vm_exec.h"
|
|
|
|
#include "vm_exec.c"
|
|
|
|
|
|
|
|
#include "vm_method.c"
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
#include "vm_eval.c"
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2009-09-18 11:29:17 +04:00
|
|
|
#include <assert.h>
|
|
|
|
|
2007-06-24 21:19:22 +04:00
|
|
|
#define PROCDEBUG 0
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2013-11-09 07:34:49 +04:00
|
|
|
rb_serial_t
|
|
|
|
rb_next_class_serial(void)
|
* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: Implement class hierarchy method cache invalidation.
[ruby-core:55053] [Feature #8426] [GH-387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 09:25:06 +04:00
|
|
|
{
|
2013-11-09 07:34:49 +04:00
|
|
|
return NEXT_CLASS_SERIAL();
|
* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: Implement class hierarchy method cache invalidation.
[ruby-core:55053] [Feature #8426] [GH-387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 09:25:06 +04:00
|
|
|
}
|
|
|
|
|
2008-06-29 21:26:16 +04:00
|
|
|
VALUE rb_cRubyVM;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
VALUE rb_cThread;
|
2007-06-24 21:19:22 +04:00
|
|
|
VALUE rb_cEnv;
|
2008-07-01 07:05:58 +04:00
|
|
|
VALUE rb_mRubyVMFrozenCore;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2014-07-18 05:53:18 +04:00
|
|
|
#define ruby_vm_redefined_flag GET_VM()->redefined_flag
|
2009-01-15 18:31:43 +03:00
|
|
|
VALUE ruby_vm_const_missing_count = 0;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_thread_t *ruby_current_thread = 0;
|
|
|
|
rb_vm_t *ruby_current_vm = 0;
|
2012-08-16 15:41:24 +04:00
|
|
|
rb_event_flag_t ruby_vm_event_flags;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2009-09-18 11:29:17 +04:00
|
|
|
static void thread_free(void *ptr);
|
|
|
|
|
2009-01-15 18:31:43 +03:00
|
|
|
void
|
|
|
|
rb_vm_inc_const_missing_count(void)
|
|
|
|
{
|
|
|
|
ruby_vm_const_missing_count +=1;
|
|
|
|
}
|
|
|
|
|
2013-12-08 08:05:59 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* RubyVM.stat -> Hash
|
|
|
|
* RubyVM.stat(hsh) -> hsh
|
|
|
|
* RubyVM.stat(Symbol) -> Numeric
|
|
|
|
*
|
|
|
|
* Returns a Hash containing implementation-dependent counters inside the VM.
|
|
|
|
*
|
|
|
|
* This hash includes information about method/constant cache serials:
|
|
|
|
*
|
|
|
|
* {
|
2013-12-09 14:51:02 +04:00
|
|
|
* :global_method_state=>251,
|
|
|
|
* :global_constant_state=>481,
|
2013-12-08 08:05:59 +04:00
|
|
|
* :class_serial=>9029
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* The contents of the hash are implementation specific and may be changed in
|
|
|
|
* the future.
|
|
|
|
*
|
|
|
|
* This method is only expected to work on C Ruby.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static VALUE
|
2013-12-09 13:12:23 +04:00
|
|
|
vm_stat(int argc, VALUE *argv, VALUE self)
|
2013-12-08 08:05:59 +04:00
|
|
|
{
|
2013-12-09 14:51:02 +04:00
|
|
|
static VALUE sym_global_method_state, sym_global_constant_state, sym_class_serial;
|
2013-12-08 08:05:59 +04:00
|
|
|
VALUE arg = Qnil;
|
|
|
|
VALUE hash = Qnil, key = Qnil;
|
|
|
|
|
|
|
|
if (rb_scan_args(argc, argv, "01", &arg) == 1) {
|
|
|
|
if (SYMBOL_P(arg))
|
|
|
|
key = arg;
|
|
|
|
else if (RB_TYPE_P(arg, T_HASH))
|
|
|
|
hash = arg;
|
|
|
|
else
|
|
|
|
rb_raise(rb_eTypeError, "non-hash or symbol given");
|
2014-02-27 11:10:14 +04:00
|
|
|
}
|
|
|
|
else if (NIL_P(arg)) {
|
2013-12-08 08:05:59 +04:00
|
|
|
hash = rb_hash_new();
|
|
|
|
}
|
|
|
|
|
2013-12-09 14:51:02 +04:00
|
|
|
if (sym_global_method_state == 0) {
|
2013-12-08 08:05:59 +04:00
|
|
|
#define S(s) sym_##s = ID2SYM(rb_intern_const(#s))
|
2013-12-09 14:51:02 +04:00
|
|
|
S(global_method_state);
|
|
|
|
S(global_constant_state);
|
2013-12-08 08:05:59 +04:00
|
|
|
S(class_serial);
|
|
|
|
#undef S
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SET(name, attr) \
|
|
|
|
if (key == sym_##name) \
|
2013-12-09 03:07:43 +04:00
|
|
|
return SERIALT2NUM(attr); \
|
2013-12-08 08:05:59 +04:00
|
|
|
else if (hash != Qnil) \
|
2013-12-09 03:07:43 +04:00
|
|
|
rb_hash_aset(hash, sym_##name, SERIALT2NUM(attr));
|
2013-12-08 08:05:59 +04:00
|
|
|
|
2013-12-09 14:51:02 +04:00
|
|
|
SET(global_method_state, ruby_vm_global_method_state);
|
|
|
|
SET(global_constant_state, ruby_vm_global_constant_state);
|
2013-12-08 08:05:59 +04:00
|
|
|
SET(class_serial, ruby_vm_class_serial);
|
|
|
|
#undef SET
|
|
|
|
|
2014-03-31 06:34:40 +04:00
|
|
|
if (!NIL_P(key)) { /* matched key should return above */
|
|
|
|
rb_raise(rb_eArgError, "unknown key: %"PRIsVALUE, rb_sym2str(key));
|
|
|
|
}
|
2013-12-08 08:05:59 +04:00
|
|
|
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2007-06-24 21:19:22 +04:00
|
|
|
/* control stack frame */
|
2007-06-25 06:44:20 +04:00
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static void
|
|
|
|
vm_set_top_stack(rb_thread_t * th, VALUE iseqval)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_iseq_t *iseq;
|
2006-12-31 18:02:22 +03:00
|
|
|
GetISeqPtr(iseqval, iseq);
|
|
|
|
|
|
|
|
if (iseq->type != ISEQ_TYPE_TOP) {
|
|
|
|
rb_raise(rb_eTypeError, "Not a toplevel InstructionSequence");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* for return */
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
vm_push_frame(th, iseq, VM_FRAME_MAGIC_TOP | VM_FRAME_FLAG_FINISH,
|
2012-08-02 15:08:44 +04:00
|
|
|
th->top_self, rb_cObject, VM_ENVVAL_BLOCK_PTR(0),
|
2013-08-06 12:33:05 +04:00
|
|
|
iseq->iseq_encoded, th->cfp->sp, iseq->local_size, 0, iseq->stack_max);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static void
|
* iseq.c, vm_eval.c: set th->base_block properly.
th->base_block is information for (a) parsing, (b) compiling
and (c) setting up the frame to execute the program passed by
`eval' method. For example, (1) parser need to know up-level
variables to detect it is variable or method without paren.
Befor (a), (b) and (c), VM set th->base_block by passed bindng
(or previous frame information). After execute (a), (b) and (c),
VM should clear th->base_block. However, if (a), (b) or (c)
raises an exception, then th->base_block is not cleared.
Problem is that the uncleared value th->balo_block is used for
irrelevant iseq compilation. It causes SEGV or critical error.
I tried to solve this problem: to clear them before exception,
but finally I found out that it is difficult to do it (Ruby
program can be run in many places).
Because of this background, I set th->base_block before
compiling iseq and restore it after compiling.
Basically, th->base_block is dirty hack (similar to global
variable) and this patch is also dirty.
* bootstraptest/test_eval.rb: add a test for above.
* internal.h: remove unused decl.
* iseq.c (rb_iseq_compile_with_option): add base_block parameter.
set th->base_block before compation and restore it after
compilation.
* ruby.c (require_libraries): pass 0 as base_block instead of
setting th->base_block
* tool/compile_prelude.rb (prelude_eval): apply above changes.
* vm.c, vm_eval.c: ditto.
* vm_core.h: add comments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36179 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-22 13:32:56 +04:00
|
|
|
vm_set_eval_stack(rb_thread_t * th, VALUE iseqval, const NODE *cref, rb_block_t *base_block)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_iseq_t *iseq;
|
2006-12-31 18:02:22 +03:00
|
|
|
GetISeqPtr(iseqval, iseq);
|
|
|
|
|
2012-08-02 15:08:44 +04:00
|
|
|
vm_push_frame(th, iseq, VM_FRAME_MAGIC_EVAL | VM_FRAME_FLAG_FINISH,
|
|
|
|
base_block->self, base_block->klass,
|
* iseq.c, vm_eval.c: set th->base_block properly.
th->base_block is information for (a) parsing, (b) compiling
and (c) setting up the frame to execute the program passed by
`eval' method. For example, (1) parser need to know up-level
variables to detect it is variable or method without paren.
Befor (a), (b) and (c), VM set th->base_block by passed bindng
(or previous frame information). After execute (a), (b) and (c),
VM should clear th->base_block. However, if (a), (b) or (c)
raises an exception, then th->base_block is not cleared.
Problem is that the uncleared value th->balo_block is used for
irrelevant iseq compilation. It causes SEGV or critical error.
I tried to solve this problem: to clear them before exception,
but finally I found out that it is difficult to do it (Ruby
program can be run in many places).
Because of this background, I set th->base_block before
compiling iseq and restore it after compiling.
Basically, th->base_block is dirty hack (similar to global
variable) and this patch is also dirty.
* bootstraptest/test_eval.rb: add a test for above.
* internal.h: remove unused decl.
* iseq.c (rb_iseq_compile_with_option): add base_block parameter.
set th->base_block before compation and restore it after
compilation.
* ruby.c (require_libraries): pass 0 as base_block instead of
setting th->base_block
* tool/compile_prelude.rb (prelude_eval): apply above changes.
* vm.c, vm_eval.c: ditto.
* vm_core.h: add comments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36179 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-22 13:32:56 +04:00
|
|
|
VM_ENVVAL_PREV_EP_PTR(base_block->ep), iseq->iseq_encoded,
|
2013-08-06 12:33:05 +04:00
|
|
|
th->cfp->sp, iseq->local_size, 0, iseq->stack_max);
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
|
|
|
|
if (cref) {
|
2012-06-11 07:14:59 +04:00
|
|
|
th->cfp->ep[-1] = (VALUE)cref;
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2008-12-27 04:15:56 +03:00
|
|
|
static void
|
|
|
|
vm_set_main_stack(rb_thread_t *th, VALUE iseqval)
|
|
|
|
{
|
|
|
|
VALUE toplevel_binding = rb_const_get(rb_cObject, rb_intern("TOPLEVEL_BINDING"));
|
|
|
|
rb_binding_t *bind;
|
|
|
|
rb_iseq_t *iseq;
|
|
|
|
rb_env_t *env;
|
|
|
|
|
|
|
|
GetBindingPtr(toplevel_binding, bind);
|
|
|
|
GetEnvPtr(bind->env, env);
|
* iseq.c, vm_eval.c: set th->base_block properly.
th->base_block is information for (a) parsing, (b) compiling
and (c) setting up the frame to execute the program passed by
`eval' method. For example, (1) parser need to know up-level
variables to detect it is variable or method without paren.
Befor (a), (b) and (c), VM set th->base_block by passed bindng
(or previous frame information). After execute (a), (b) and (c),
VM should clear th->base_block. However, if (a), (b) or (c)
raises an exception, then th->base_block is not cleared.
Problem is that the uncleared value th->balo_block is used for
irrelevant iseq compilation. It causes SEGV or critical error.
I tried to solve this problem: to clear them before exception,
but finally I found out that it is difficult to do it (Ruby
program can be run in many places).
Because of this background, I set th->base_block before
compiling iseq and restore it after compiling.
Basically, th->base_block is dirty hack (similar to global
variable) and this patch is also dirty.
* bootstraptest/test_eval.rb: add a test for above.
* internal.h: remove unused decl.
* iseq.c (rb_iseq_compile_with_option): add base_block parameter.
set th->base_block before compation and restore it after
compilation.
* ruby.c (require_libraries): pass 0 as base_block instead of
setting th->base_block
* tool/compile_prelude.rb (prelude_eval): apply above changes.
* vm.c, vm_eval.c: ditto.
* vm_core.h: add comments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36179 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-22 13:32:56 +04:00
|
|
|
vm_set_eval_stack(th, iseqval, 0, &env->block);
|
2008-12-27 04:15:56 +03:00
|
|
|
|
|
|
|
/* save binding */
|
|
|
|
GetISeqPtr(iseqval, iseq);
|
|
|
|
if (bind && iseq->local_size > 0) {
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
bind->env = rb_vm_make_env_object(th, th->cfp);
|
2008-12-27 04:15:56 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-05 10:04:59 +04:00
|
|
|
rb_control_frame_t *
|
|
|
|
rb_vm_get_binding_creatable_next_cfp(rb_thread_t *th, const rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
|
|
|
|
if (cfp->iseq) {
|
|
|
|
return (rb_control_frame_t *)cfp;
|
|
|
|
}
|
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-01 21:11:35 +04:00
|
|
|
rb_control_frame_t *
|
2012-11-29 11:05:27 +04:00
|
|
|
rb_vm_get_ruby_level_next_cfp(rb_thread_t *th, const rb_control_frame_t *cfp)
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
{
|
|
|
|
while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
|
|
|
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
2012-11-29 11:05:27 +04:00
|
|
|
return (rb_control_frame_t *)cfp;
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
}
|
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-01-19 06:03:09 +03:00
|
|
|
static rb_control_frame_t *
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
vm_get_ruby_level_caller_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
|
2008-05-22 13:55:36 +04:00
|
|
|
{
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
|
|
|
return cfp;
|
|
|
|
}
|
|
|
|
|
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
|
2008-05-22 13:55:36 +04:00
|
|
|
while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
|
|
|
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
|
|
|
return cfp;
|
|
|
|
}
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
|
|
|
|
if ((cfp->flag & VM_FRAME_FLAG_PASSED) == 0) {
|
|
|
|
break;
|
|
|
|
}
|
2008-05-22 13:55:36 +04:00
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-01-09 14:12:59 +04:00
|
|
|
void
|
|
|
|
rb_vm_pop_cfunc_frame(void)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
const rb_method_entry_t *me = th->cfp->me;
|
|
|
|
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, th->cfp->self, me->called_id, me->klass, Qnil);
|
|
|
|
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->klass, me->called_id);
|
|
|
|
vm_pop_frame(th);
|
|
|
|
}
|
|
|
|
|
2014-06-19 16:43:48 +04:00
|
|
|
void
|
|
|
|
rb_vm_rewind_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
/* check skipped frame */
|
|
|
|
while (th->cfp != cfp) {
|
|
|
|
#if VMDEBUG
|
|
|
|
printf("skipped frame: %s\n", vm_frametype_name(th->cfp));
|
|
|
|
#endif
|
|
|
|
if (VM_FRAME_TYPE(th->cfp) != VM_FRAME_MAGIC_CFUNC) {
|
|
|
|
vm_pop_frame(th);
|
|
|
|
}
|
|
|
|
else { /* unlikely path */
|
|
|
|
rb_vm_pop_cfunc_frame();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-09 14:12:59 +04:00
|
|
|
/* obsolete */
|
|
|
|
void
|
|
|
|
rb_frame_pop(void)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
vm_pop_frame(th);
|
|
|
|
}
|
|
|
|
|
2010-12-02 14:06:32 +03:00
|
|
|
/* at exit */
|
|
|
|
|
|
|
|
void
|
|
|
|
ruby_vm_at_exit(void (*func)(rb_vm_t *))
|
|
|
|
{
|
|
|
|
rb_ary_push((VALUE)&GET_VM()->at_exit, (VALUE)func);
|
|
|
|
}
|
|
|
|
|
2011-02-24 16:51:59 +03:00
|
|
|
static void
|
|
|
|
ruby_vm_run_at_exit_hooks(rb_vm_t *vm)
|
|
|
|
{
|
|
|
|
VALUE hook = (VALUE)&vm->at_exit;
|
|
|
|
|
|
|
|
while (RARRAY_LEN(hook) > 0) {
|
|
|
|
typedef void rb_vm_at_exit_func(rb_vm_t*);
|
|
|
|
rb_vm_at_exit_func *func = (rb_vm_at_exit_func*)rb_ary_pop(hook);
|
|
|
|
(*func)(vm);
|
|
|
|
}
|
|
|
|
rb_ary_free(hook);
|
|
|
|
}
|
|
|
|
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
/* Env */
|
|
|
|
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
/*
|
|
|
|
env{
|
|
|
|
env[0] // special (block or prev env)
|
|
|
|
env[1] // env object
|
|
|
|
};
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define ENV_IN_HEAP_P(th, env) \
|
2013-02-16 15:58:33 +04:00
|
|
|
(!((th)->stack <= (env) && (env) < ((th)->stack + (th)->stack_size)))
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
#define ENV_VAL(env) ((env)[1])
|
|
|
|
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
static void
|
2008-05-22 08:28:13 +04:00
|
|
|
env_mark(void * const ptr)
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
{
|
2014-09-13 01:34:12 +04:00
|
|
|
const rb_env_t * const env = ptr;
|
|
|
|
|
|
|
|
/* TODO: should mark more restricted range */
|
|
|
|
RUBY_GC_INFO("env->env\n");
|
|
|
|
rb_gc_mark_values((long)env->env_size, env->env);
|
|
|
|
|
|
|
|
RUBY_GC_INFO("env->prev_envval\n");
|
|
|
|
RUBY_MARK_UNLESS_NULL(env->prev_envval);
|
|
|
|
RUBY_MARK_UNLESS_NULL(env->block.self);
|
|
|
|
RUBY_MARK_UNLESS_NULL(env->block.proc);
|
|
|
|
|
|
|
|
if (env->block.iseq) {
|
|
|
|
if (BUILTIN_TYPE(env->block.iseq) == T_NODE) {
|
|
|
|
RUBY_MARK_UNLESS_NULL((VALUE)env->block.iseq);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
RUBY_MARK_UNLESS_NULL(env->block.iseq->self);
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
}
|
|
|
|
}
|
2007-06-25 06:44:20 +04:00
|
|
|
RUBY_MARK_LEAVE("env");
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
}
|
|
|
|
|
2009-06-17 02:23:53 +04:00
|
|
|
static size_t
|
2009-09-09 06:11:35 +04:00
|
|
|
env_memsize(const void *ptr)
|
2009-06-17 02:23:53 +04:00
|
|
|
{
|
2014-09-13 01:34:12 +04:00
|
|
|
const rb_env_t * const env = ptr;
|
|
|
|
size_t size = sizeof(rb_env_t);
|
2014-09-08 23:38:22 +04:00
|
|
|
|
2014-09-13 01:34:12 +04:00
|
|
|
size += (env->env_size - 1) * sizeof(VALUE);
|
|
|
|
return size;
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
|
2009-07-07 10:23:39 +04:00
|
|
|
static const rb_data_type_t env_data_type = {
|
2009-06-17 02:23:53 +04:00
|
|
|
"VM/env",
|
2014-09-13 01:34:12 +04:00
|
|
|
{env_mark, RUBY_TYPED_DEFAULT_FREE, env_memsize,},
|
2014-12-01 09:38:04 +03:00
|
|
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
2009-06-17 02:23:53 +04:00
|
|
|
};
|
|
|
|
|
2008-05-22 20:19:14 +04:00
|
|
|
static VALUE check_env_value(VALUE envval);
|
2007-06-25 06:44:20 +04:00
|
|
|
|
|
|
|
static int
|
2008-05-22 08:28:13 +04:00
|
|
|
check_env(rb_env_t * const env)
|
2007-06-25 06:44:20 +04:00
|
|
|
{
|
2011-07-31 18:11:37 +04:00
|
|
|
fprintf(stderr, "---\n");
|
2012-06-11 07:14:59 +04:00
|
|
|
fprintf(stderr, "envptr: %p\n", (void *)&env->block.ep[0]);
|
|
|
|
fprintf(stderr, "envval: %10p ", (void *)env->block.ep[1]);
|
|
|
|
dp(env->block.ep[1]);
|
|
|
|
fprintf(stderr, "ep: %10p\n", (void *)env->block.ep);
|
2011-07-31 18:00:57 +04:00
|
|
|
if (env->prev_envval) {
|
2011-07-31 18:11:37 +04:00
|
|
|
fprintf(stderr, ">>\n");
|
2011-07-31 18:00:57 +04:00
|
|
|
check_env_value(env->prev_envval);
|
2011-07-31 18:11:37 +04:00
|
|
|
fprintf(stderr, "<<\n");
|
2007-06-25 06:44:20 +04:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
check_env_value(VALUE envval)
|
2007-06-25 06:44:20 +04:00
|
|
|
{
|
|
|
|
rb_env_t *env;
|
|
|
|
GetEnvPtr(envval, env);
|
|
|
|
|
|
|
|
if (check_env(env)) {
|
|
|
|
return envval;
|
|
|
|
}
|
2007-08-20 18:17:16 +04:00
|
|
|
rb_bug("invalid env");
|
2007-06-25 06:44:20 +04:00
|
|
|
return Qnil; /* unreachable */
|
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
static VALUE
|
2014-07-01 21:55:44 +04:00
|
|
|
vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
|
|
|
|
VALUE *envptr, const VALUE *const endptr)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
VALUE envval, penvval = 0;
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_env_t *env;
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE *nenvptr;
|
|
|
|
int i, local_size;
|
|
|
|
|
2007-06-26 10:14:44 +04:00
|
|
|
if (ENV_IN_HEAP_P(th, envptr)) {
|
2006-12-31 18:02:22 +03:00
|
|
|
return ENV_VAL(envptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (envptr != endptr) {
|
|
|
|
VALUE *penvptr = GC_GUARDED_PTR_REF(*envptr);
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_control_frame_t *pcfp = cfp;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2007-06-26 10:14:44 +04:00
|
|
|
if (ENV_IN_HEAP_P(th, penvptr)) {
|
2006-12-31 18:02:22 +03:00
|
|
|
penvval = ENV_VAL(penvptr);
|
|
|
|
}
|
|
|
|
else {
|
2012-06-11 07:14:59 +04:00
|
|
|
while (pcfp->ep != penvptr) {
|
2006-12-31 18:02:22 +03:00
|
|
|
pcfp++;
|
2012-06-11 07:14:59 +04:00
|
|
|
if (pcfp->ep == 0) {
|
2006-12-31 18:02:22 +03:00
|
|
|
SDR();
|
2012-06-11 07:14:59 +04:00
|
|
|
rb_bug("invalid ep");
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
* vm.c: some refactoring.
* rename th_* to vm_*.
* remove unused variables functions.
* add prototypes.
* blockinlining.c, compile.c, cont.c, eval.c, eval_intern.h,
eval_jump.h, eval_load.c, inits.c, insns.def, iseq.c, parse.y,
proc.c, process.c, signal.c, thread.c, vm.c, vm_dump.c,
vm_evalbody.ci, yarvcore.c, yarvcore.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-24 19:42:41 +04:00
|
|
|
penvval = vm_make_env_each(th, pcfp, penvptr, endptr);
|
2012-06-11 07:14:59 +04:00
|
|
|
*envptr = VM_ENVVAL_PREV_EP_PTR(pcfp->ep);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
2007-01-17 11:48:52 +03:00
|
|
|
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
if (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
2006-12-31 18:02:22 +03:00
|
|
|
local_size = 2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
local_size = cfp->iseq->local_size;
|
|
|
|
}
|
|
|
|
|
2014-09-08 23:38:22 +04:00
|
|
|
/* allocate env */
|
2014-09-12 13:22:18 +04:00
|
|
|
env = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
|
|
|
|
env->env_size = local_size + 1 + 1;
|
|
|
|
env->local_size = local_size;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
for (i = 0; i <= local_size; i++) {
|
|
|
|
env->env[i] = envptr[-local_size + i];
|
2007-08-16 11:46:11 +04:00
|
|
|
#if 0
|
2007-12-25 05:14:36 +03:00
|
|
|
fprintf(stderr, "%2d ", &envptr[-local_size + i] - th->stack); dp(env->env[i]);
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
2006-12-31 18:02:22 +03:00
|
|
|
/* clear value stack for GC */
|
2007-08-16 11:46:11 +04:00
|
|
|
envptr[-local_size + i] = 0;
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
2007-08-16 11:46:11 +04:00
|
|
|
#endif
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2014-09-12 13:22:18 +04:00
|
|
|
/* be careful not to trigger GC after this */
|
|
|
|
envval = TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* must happen after TypedData_Wrap_Struct to ensure penvval is markable
|
|
|
|
* in case object allocation triggers GC and clobbers penvval.
|
|
|
|
*/
|
|
|
|
env->prev_envval = penvval;
|
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
*envptr = envval; /* GC mark */
|
|
|
|
nenvptr = &env->env[i - 1];
|
2007-06-26 10:14:44 +04:00
|
|
|
nenvptr[1] = envval; /* frame self */
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
/* reset ep in cfp */
|
|
|
|
cfp->ep = nenvptr;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/* as Binding */
|
|
|
|
env->block.self = cfp->self;
|
2014-09-12 13:22:18 +04:00
|
|
|
env->block.klass = 0;
|
2012-06-11 07:14:59 +04:00
|
|
|
env->block.ep = cfp->ep;
|
2006-12-31 18:02:22 +03:00
|
|
|
env->block.iseq = cfp->iseq;
|
2014-09-12 13:22:18 +04:00
|
|
|
env->block.proc = 0;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
if (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
2006-12-31 18:02:22 +03:00
|
|
|
/* TODO */
|
|
|
|
env->block.iseq = 0;
|
2012-11-02 23:14:24 +04:00
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
return envval;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2014-07-01 21:55:44 +04:00
|
|
|
collect_local_variables_in_iseq(const rb_iseq_t *iseq, const struct local_var_list *vars)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
int i;
|
2009-09-21 12:12:12 +04:00
|
|
|
if (!iseq) return 0;
|
|
|
|
for (i = 0; i < iseq->local_table_size; i++) {
|
2014-05-07 08:26:49 +04:00
|
|
|
local_var_list_add(vars, iseq->local_table[i]);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
2009-09-21 12:12:12 +04:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2014-07-01 21:55:44 +04:00
|
|
|
static void
|
|
|
|
collect_local_variables_in_env(const rb_env_t *env, const struct local_var_list *vars)
|
2009-09-21 12:12:12 +04:00
|
|
|
{
|
2010-05-29 22:51:39 +04:00
|
|
|
|
2014-05-07 06:00:28 +04:00
|
|
|
while (collect_local_variables_in_iseq(env->block.iseq, vars),
|
2009-09-21 12:12:12 +04:00
|
|
|
env->prev_envval) {
|
|
|
|
GetEnvPtr(env->prev_envval, env);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-19 03:13:44 +03:00
|
|
|
static int
|
2014-07-01 21:55:44 +04:00
|
|
|
vm_collect_local_variables_in_heap(rb_thread_t *th, const VALUE *ep, const struct local_var_list *vars)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2012-06-11 07:14:59 +04:00
|
|
|
if (ENV_IN_HEAP_P(th, ep)) {
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_env_t *env;
|
2012-06-11 07:14:59 +04:00
|
|
|
GetEnvPtr(ENV_VAL(ep), env);
|
2014-05-07 06:00:28 +04:00
|
|
|
collect_local_variables_in_env(env, vars);
|
2006-12-31 18:02:22 +03:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-01 21:57:37 +04:00
|
|
|
VALUE
|
|
|
|
rb_vm_env_local_variables(VALUE envval)
|
|
|
|
{
|
|
|
|
struct local_var_list vars;
|
|
|
|
const rb_env_t *env;
|
|
|
|
|
|
|
|
GetEnvPtr(envval, env);
|
|
|
|
local_var_list_init(&vars);
|
|
|
|
collect_local_variables_in_env(env, &vars);
|
|
|
|
return local_var_list_finish(&vars);
|
|
|
|
}
|
|
|
|
|
2012-11-03 13:41:38 +04:00
|
|
|
static void vm_rewrite_ep_in_errinfo(rb_thread_t *th);
|
2012-11-27 15:58:10 +04:00
|
|
|
static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
|
2012-12-05 17:46:11 +04:00
|
|
|
static VALUE vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp, VALUE *blockprocptr);
|
2012-11-03 13:41:38 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
|
2012-12-05 17:46:11 +04:00
|
|
|
{
|
|
|
|
VALUE blockprocval;
|
|
|
|
return vm_make_env_object(th, cfp, &blockprocval);
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *blockprocptr)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
VALUE envval;
|
2012-11-27 15:58:10 +04:00
|
|
|
VALUE *lep = VM_CF_LEP(cfp);
|
|
|
|
rb_block_t *blockptr = VM_EP_BLOCK_PTR(lep);
|
2007-06-25 06:44:20 +04:00
|
|
|
|
2012-11-27 15:58:10 +04:00
|
|
|
if (blockptr) {
|
|
|
|
VALUE blockprocval = vm_make_proc_from_block(th, blockptr);
|
|
|
|
rb_proc_t *p;
|
|
|
|
GetProcPtr(blockprocval, p);
|
|
|
|
lep[0] = VM_ENVVAL_BLOCK_PTR(&p->block);
|
2012-12-05 17:46:11 +04:00
|
|
|
*blockprocptr = blockprocval;
|
2012-11-27 15:58:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
envval = vm_make_env_each(th, cfp, cfp->ep, lep);
|
2012-11-03 13:41:38 +04:00
|
|
|
vm_rewrite_ep_in_errinfo(th);
|
2007-06-26 10:14:44 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
if (PROCDEBUG) {
|
|
|
|
check_env_value(envval);
|
|
|
|
}
|
2007-06-25 06:44:20 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
return envval;
|
|
|
|
}
|
|
|
|
|
2012-11-03 13:41:38 +04:00
|
|
|
static void
|
|
|
|
vm_rewrite_ep_in_errinfo(rb_thread_t *th)
|
2012-11-02 23:14:24 +04:00
|
|
|
{
|
2012-11-03 13:41:38 +04:00
|
|
|
rb_control_frame_t *cfp = th->cfp;
|
2012-11-02 23:14:24 +04:00
|
|
|
while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
|
2012-11-03 13:41:38 +04:00
|
|
|
/* rewrite ep in errinfo to point to heap */
|
|
|
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq) &&
|
|
|
|
(cfp->iseq->type == ISEQ_TYPE_RESCUE ||
|
|
|
|
cfp->iseq->type == ISEQ_TYPE_ENSURE)) {
|
|
|
|
VALUE errinfo = cfp->ep[-2]; /* #$! */
|
|
|
|
if (RB_TYPE_P(errinfo, T_NODE)) {
|
|
|
|
VALUE *escape_ep = GET_THROWOBJ_CATCH_POINT(errinfo);
|
|
|
|
if (! ENV_IN_HEAP_P(th, escape_ep)) {
|
|
|
|
VALUE epval = *escape_ep;
|
|
|
|
if (!SPECIAL_CONST_P(epval) && RBASIC(epval)->klass == rb_cEnv) {
|
|
|
|
rb_env_t *epenv;
|
|
|
|
GetEnvPtr(epval, epenv);
|
|
|
|
SET_THROWOBJ_CATCH_POINT(errinfo, (VALUE)(epenv->env + epenv->local_size));
|
|
|
|
}
|
2011-08-27 13:59:48 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-11-03 13:41:38 +04:00
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
2011-08-27 13:59:48 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-30 09:56:13 +04:00
|
|
|
void
|
2011-06-18 16:32:57 +04:00
|
|
|
rb_vm_stack_to_heap(rb_thread_t *th)
|
2007-05-30 09:56:13 +04:00
|
|
|
{
|
|
|
|
rb_control_frame_t *cfp = th->cfp;
|
2013-02-05 19:55:41 +04:00
|
|
|
while ((cfp = rb_vm_get_binding_creatable_next_cfp(th, cfp)) != 0) {
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_make_env_object(th, cfp);
|
2007-05-30 09:56:13 +04:00
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* Proc */
|
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
static VALUE
|
2008-12-25 06:51:35 +03:00
|
|
|
vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2010-10-04 02:57:23 +04:00
|
|
|
if (!block->proc) {
|
|
|
|
block->proc = rb_vm_make_proc(th, block, rb_cProc);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
2010-10-04 02:57:23 +04:00
|
|
|
return block->proc;
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2014-09-13 00:57:45 +04:00
|
|
|
static inline VALUE
|
|
|
|
rb_proc_alloc(VALUE klass, const rb_block_t *block,
|
|
|
|
VALUE envval, VALUE blockprocval,
|
|
|
|
int8_t safe_level, int8_t is_from_method, int8_t is_lambda)
|
|
|
|
{
|
|
|
|
VALUE procval;
|
|
|
|
rb_proc_t *proc = ALLOC(rb_proc_t);
|
|
|
|
|
|
|
|
proc->block = *block;
|
|
|
|
proc->safe_level = safe_level;
|
|
|
|
proc->is_from_method = is_from_method;
|
|
|
|
proc->is_lambda = is_lambda;
|
|
|
|
|
|
|
|
procval = rb_proc_wrap(klass, proc);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ensure VALUEs are markable here as rb_proc_wrap may trigger allocation
|
|
|
|
* and clobber envval + blockprocval
|
|
|
|
*/
|
|
|
|
proc->envval = envval;
|
|
|
|
proc->blockprocval = blockprocval;
|
|
|
|
|
|
|
|
return procval;
|
|
|
|
}
|
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_make_proc(rb_thread_t *th, const rb_block_t *block, VALUE klass)
|
2014-11-13 12:10:40 +03:00
|
|
|
{
|
|
|
|
return rb_vm_make_proc_lambda(th, block, klass, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_vm_make_proc_lambda(rb_thread_t *th, const rb_block_t *block, VALUE klass, int8_t is_lambda)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
VALUE procval, envval, blockprocval = 0;
|
2008-12-24 15:56:58 +03:00
|
|
|
rb_control_frame_t *cfp = RUBY_VM_GET_CFP_FROM_BLOCK_PTR(block);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2008-12-25 06:51:35 +03:00
|
|
|
if (block->proc) {
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_bug("rb_vm_make_proc: Proc value is already created.");
|
2008-12-25 06:51:35 +03:00
|
|
|
}
|
|
|
|
|
2012-12-05 17:46:11 +04:00
|
|
|
envval = vm_make_env_object(th, cfp, &blockprocval);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
if (PROCDEBUG) {
|
|
|
|
check_env_value(envval);
|
|
|
|
}
|
2014-09-13 00:57:45 +04:00
|
|
|
|
|
|
|
procval = rb_proc_alloc(klass, block, envval, blockprocval,
|
2014-11-13 12:10:40 +03:00
|
|
|
(int8_t)th->safe_level, 0, is_lambda);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2007-06-24 21:19:22 +04:00
|
|
|
if (VMDEBUG) {
|
2012-06-11 07:14:59 +04:00
|
|
|
if (th->stack < block->ep && block->ep < th->stack + th->stack_size) {
|
|
|
|
rb_bug("invalid ptr: block->ep");
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
2007-06-17 21:50:56 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
return procval;
|
|
|
|
}
|
|
|
|
|
2014-10-18 15:46:31 +04:00
|
|
|
/* Binding */
|
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_vm_make_binding(rb_thread_t *th, const rb_control_frame_t *src_cfp)
|
|
|
|
{
|
|
|
|
rb_control_frame_t *cfp = rb_vm_get_binding_creatable_next_cfp(th, src_cfp);
|
|
|
|
rb_control_frame_t *ruby_level_cfp = rb_vm_get_ruby_level_next_cfp(th, src_cfp);
|
|
|
|
VALUE bindval, envval;
|
|
|
|
rb_binding_t *bind;
|
|
|
|
VALUE blockprocval = 0;
|
|
|
|
|
|
|
|
if (cfp == 0 || ruby_level_cfp == 0) {
|
|
|
|
rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber.");
|
|
|
|
}
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
envval = vm_make_env_object(th, cfp, &blockprocval);
|
|
|
|
if (cfp == ruby_level_cfp) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
cfp = rb_vm_get_binding_creatable_next_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp));
|
|
|
|
}
|
|
|
|
|
|
|
|
bindval = rb_binding_alloc(rb_cBinding);
|
|
|
|
GetBindingPtr(bindval, bind);
|
|
|
|
bind->env = envval;
|
|
|
|
bind->path = ruby_level_cfp->iseq->location.path;
|
|
|
|
bind->blockprocval = blockprocval;
|
|
|
|
bind->first_lineno = rb_vm_get_sourceline(ruby_level_cfp);
|
|
|
|
|
|
|
|
return bindval;
|
|
|
|
}
|
|
|
|
|
2013-08-09 13:51:00 +04:00
|
|
|
VALUE *
|
|
|
|
rb_binding_add_dynavars(rb_binding_t *bind, int dyncount, const ID *dynvars)
|
|
|
|
{
|
|
|
|
VALUE envval = bind->env, path = bind->path, iseqval;
|
|
|
|
rb_env_t *env;
|
|
|
|
rb_block_t *base_block;
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
rb_iseq_t *base_iseq;
|
|
|
|
NODE *node = 0;
|
|
|
|
ID minibuf[4], *dyns = minibuf;
|
|
|
|
VALUE idtmp = 0;
|
2014-10-18 15:46:31 +04:00
|
|
|
VALUE blockprocval = 0;
|
2013-08-09 13:51:00 +04:00
|
|
|
|
|
|
|
if (dyncount < 0) return 0;
|
|
|
|
|
|
|
|
GetEnvPtr(envval, env);
|
|
|
|
|
|
|
|
base_block = &env->block;
|
|
|
|
base_iseq = base_block->iseq;
|
|
|
|
|
|
|
|
if (dyncount >= numberof(minibuf)) dyns = ALLOCV_N(ID, idtmp, dyncount + 1);
|
|
|
|
|
|
|
|
dyns[0] = dyncount;
|
|
|
|
MEMCPY(dyns + 1, dynvars, ID, dyncount);
|
|
|
|
node = NEW_NODE(NODE_SCOPE, dyns, 0, 0);
|
|
|
|
|
|
|
|
iseqval = rb_iseq_new(node, base_iseq->location.label, path, path,
|
|
|
|
base_iseq->self, ISEQ_TYPE_EVAL);
|
|
|
|
node->u1.tbl = 0; /* reset table */
|
|
|
|
ALLOCV_END(idtmp);
|
|
|
|
|
|
|
|
vm_set_eval_stack(th, iseqval, 0, base_block);
|
2014-10-18 15:46:31 +04:00
|
|
|
bind->env = vm_make_env_object(th, th->cfp, &blockprocval);
|
|
|
|
bind->blockprocval = blockprocval;
|
2013-08-09 13:51:00 +04:00
|
|
|
vm_pop_frame(th);
|
|
|
|
GetEnvPtr(bind->env, env);
|
|
|
|
|
|
|
|
return env->env;
|
|
|
|
}
|
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* C -> Ruby: block */
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2008-05-19 18:36:13 +04:00
|
|
|
static inline VALUE
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
invoke_block_from_c(rb_thread_t *th, const rb_block_t *block,
|
2008-05-22 20:19:14 +04:00
|
|
|
VALUE self, int argc, const VALUE *argv,
|
2012-08-20 15:36:34 +04:00
|
|
|
const rb_block_t *blockptr, const NODE *cref,
|
2014-03-13 20:18:45 +04:00
|
|
|
VALUE defined_class, int splattable)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2014-06-19 14:49:46 +04:00
|
|
|
if (SPECIAL_CONST_P(block->iseq)) {
|
2009-10-26 23:58:25 +03:00
|
|
|
return Qnil;
|
2014-06-19 14:49:46 +04:00
|
|
|
}
|
2009-10-26 23:58:25 +03:00
|
|
|
else if (BUILTIN_TYPE(block->iseq) != T_NODE) {
|
2014-06-19 14:49:46 +04:00
|
|
|
VALUE ret;
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const rb_iseq_t *iseq = block->iseq;
|
2008-12-24 15:56:58 +03:00
|
|
|
const rb_control_frame_t *cfp;
|
2014-11-03 02:14:21 +03:00
|
|
|
int i, opt_pc, arg_size = iseq->param.size;
|
2014-06-19 14:49:46 +04:00
|
|
|
int type = block_proc_is_lambda(block->proc) ? VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK;
|
|
|
|
const rb_method_entry_t *me = th->passed_bmethod_me;
|
|
|
|
th->passed_bmethod_me = 0;
|
2008-12-24 15:56:58 +03:00
|
|
|
cfp = th->cfp;
|
2007-06-05 21:26:00 +04:00
|
|
|
|
2007-01-16 06:06:01 +03:00
|
|
|
for (i=0; i<argc; i++) {
|
2007-12-18 16:14:32 +03:00
|
|
|
cfp->sp[i] = argv[i];
|
2007-01-16 06:06:01 +03:00
|
|
|
}
|
2007-06-05 21:26:00 +04:00
|
|
|
|
2007-12-20 10:07:35 +03:00
|
|
|
opt_pc = vm_yield_setup_args(th, iseq, argc, cfp->sp, blockptr,
|
* rewrite method/block parameter fitting logic to optimize
keyword arguments/parameters and a splat argument.
[Feature #10440] (Details are described in this ticket)
Most of complex part is moved to vm_args.c.
Now, ISeq#to_a does not catch up new instruction format.
* vm_core.h: change iseq data structures.
* introduce rb_call_info_kw_arg_t to represent keyword arguments.
* add rb_call_info_t::kw_arg.
* rename rb_iseq_t::arg_post_len to rb_iseq_t::arg_post_num.
* rename rb_iseq_t::arg_keywords to arg_keyword_num.
* rename rb_iseq_t::arg_keyword to rb_iseq_t::arg_keyword_bits.
to represent keyword bitmap parameter index.
This bitmap parameter shows that which keyword parameters are given
or not given (0 for given).
It is refered by `checkkeyword' instruction described bellow.
* rename rb_iseq_t::arg_keyword_check to rb_iseq_t::arg_keyword_rest
to represent keyword rest parameter index.
* add rb_iseq_t::arg_keyword_default_values to represent default
keyword values.
* rename VM_CALL_ARGS_SKIP_SETUP to VM_CALL_ARGS_SIMPLE
to represent
(ci->flag & (SPLAT|BLOCKARG)) &&
ci->blockiseq == NULL &&
ci->kw_arg == NULL.
* vm_insnhelper.c, vm_args.c: rewrite with refactoring.
* rewrite splat argument code.
* rewrite keyword arguments/parameters code.
* merge method and block parameter fitting code into one code base.
* vm.c, vm_eval.c: catch up these changes.
* compile.c (new_callinfo): callinfo requires kw_arg parameter.
* compile.c (compile_array_): check the last argument Hash object or
not. If Hash object and all keys are Symbol literals, they are
compiled to keyword arguments.
* insns.def (checkkeyword): add new instruction.
This instruction check the availability of corresponding keyword.
For example, a method "def foo k1: 'v1'; end" is cimpiled to the
following instructions.
0000 checkkeyword 2, 0 # check k1 is given.
0003 branchif 9 # if given, jump to address #9
0005 putstring "v1"
0007 setlocal_OP__WC__0 3 # k1 = 'v1'
0009 trace 8
0011 putnil
0012 trace 16
0014 leave
* insns.def (opt_send_simple): removed and add new instruction
"opt_send_without_block".
* parse.y (new_args_tail_gen): reorder variables.
Before this patch, a method "def foo(k1: 1, kr1:, k2: 2, **krest, &b)"
has parameter variables "k1, kr1, k2, &b, internal_id, krest",
but this patch reorders to "kr1, k1, k2, internal_id, krest, &b".
(locate a block variable at last)
* parse.y (vtable_pop): added.
This function remove latest `n' variables from vtable.
* iseq.c: catch up iseq data changes.
* proc.c: ditto.
* class.c (keyword_error): export as rb_keyword_error().
* common.mk: depend vm_args.c for vm.o.
* hash.c (rb_hash_has_key): export.
* internal.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48239 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-11-02 21:02:55 +03:00
|
|
|
(type == VM_FRAME_MAGIC_LAMBDA ? (splattable ? arg_setup_lambda : arg_setup_method) : arg_setup_block));
|
2007-01-16 06:06:01 +03:00
|
|
|
|
2014-06-19 14:49:46 +04:00
|
|
|
if (me != 0) {
|
2014-04-30 13:08:10 +04:00
|
|
|
/* bmethod */
|
|
|
|
vm_push_frame(th, iseq, type | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_BMETHOD,
|
|
|
|
self, defined_class,
|
|
|
|
VM_ENVVAL_PREV_EP_PTR(block->ep),
|
|
|
|
iseq->iseq_encoded + opt_pc,
|
|
|
|
cfp->sp + arg_size, iseq->local_size - arg_size,
|
2014-06-19 14:49:46 +04:00
|
|
|
me, iseq->stack_max);
|
|
|
|
|
|
|
|
RUBY_DTRACE_METHOD_ENTRY_HOOK(th, me->klass, me->called_id);
|
|
|
|
EXEC_EVENT_HOOK(th, RUBY_EVENT_CALL, self, me->called_id, me->klass, Qnil);
|
2014-04-30 13:08:10 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
vm_push_frame(th, iseq, type | VM_FRAME_FLAG_FINISH,
|
|
|
|
self, defined_class,
|
|
|
|
VM_ENVVAL_PREV_EP_PTR(block->ep),
|
|
|
|
iseq->iseq_encoded + opt_pc,
|
|
|
|
cfp->sp + arg_size, iseq->local_size - arg_size,
|
|
|
|
0, iseq->stack_max);
|
|
|
|
}
|
2008-05-19 18:36:13 +04:00
|
|
|
|
|
|
|
if (cref) {
|
2012-06-11 07:14:59 +04:00
|
|
|
th->cfp->ep[-1] = (VALUE)cref;
|
2008-05-19 18:36:13 +04:00
|
|
|
}
|
2007-12-18 16:14:32 +03:00
|
|
|
|
2014-06-19 14:49:46 +04:00
|
|
|
ret = vm_exec(th);
|
|
|
|
|
|
|
|
if (me) {
|
|
|
|
/* bmethod */
|
|
|
|
EXEC_EVENT_HOOK(th, RUBY_EVENT_RETURN, self, me->called_id, me->klass, ret);
|
|
|
|
RUBY_DTRACE_METHOD_RETURN_HOOK(th, me->klass, me->called_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
else {
|
2014-11-09 17:25:52 +03:00
|
|
|
return vm_yield_with_cfunc(th, block, self, defined_class,
|
|
|
|
argc, argv, blockptr);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static inline const rb_block_t *
|
2008-05-22 20:19:14 +04:00
|
|
|
check_block(rb_thread_t *th)
|
2007-01-16 06:06:01 +03:00
|
|
|
{
|
2012-06-11 07:14:59 +04:00
|
|
|
const rb_block_t *blockptr = VM_CF_BLOCK_PTR(th->cfp);
|
2007-01-16 06:06:01 +03:00
|
|
|
|
2008-05-19 18:36:13 +04:00
|
|
|
if (blockptr == 0) {
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_localjump_error("no block given", Qnil, 0);
|
2007-01-16 06:06:01 +03:00
|
|
|
}
|
|
|
|
|
2008-05-19 18:36:13 +04:00
|
|
|
return blockptr;
|
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static inline VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_yield_with_cref(rb_thread_t *th, int argc, const VALUE *argv, const NODE *cref)
|
2008-05-19 18:36:13 +04:00
|
|
|
{
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const rb_block_t *blockptr = check_block(th);
|
2012-08-20 15:36:34 +04:00
|
|
|
return invoke_block_from_c(th, blockptr, blockptr->self, argc, argv, 0, cref,
|
2014-03-13 20:18:45 +04:00
|
|
|
blockptr->klass, 1);
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static inline VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_yield(rb_thread_t *th, int argc, const VALUE *argv)
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
{
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const rb_block_t *blockptr = check_block(th);
|
2012-08-20 15:36:34 +04:00
|
|
|
return invoke_block_from_c(th, blockptr, blockptr->self, argc, argv, 0, 0,
|
2014-03-13 20:18:45 +04:00
|
|
|
blockptr->klass, 1);
|
2007-01-16 06:06:01 +03:00
|
|
|
}
|
|
|
|
|
2013-11-29 12:06:19 +04:00
|
|
|
static inline VALUE
|
|
|
|
vm_yield_with_block(rb_thread_t *th, int argc, const VALUE *argv, const rb_block_t *blockargptr)
|
|
|
|
{
|
|
|
|
const rb_block_t *blockptr = check_block(th);
|
|
|
|
return invoke_block_from_c(th, blockptr, blockptr->self, argc, argv, blockargptr, 0,
|
2014-03-13 20:18:45 +04:00
|
|
|
blockptr->klass, 1);
|
2013-11-29 12:06:19 +04:00
|
|
|
}
|
|
|
|
|
2012-08-20 15:36:34 +04:00
|
|
|
static VALUE
|
|
|
|
vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self, VALUE defined_class,
|
|
|
|
int argc, const VALUE *argv, const rb_block_t *blockptr)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2013-05-15 20:08:48 +04:00
|
|
|
VALUE val = Qundef;
|
2006-12-31 18:02:22 +03:00
|
|
|
int state;
|
|
|
|
volatile int stored_safe = th->safe_level;
|
2007-01-05 16:52:16 +03:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
TH_PUSH_TAG(th);
|
|
|
|
if ((state = EXEC_TAG()) == 0) {
|
2008-07-25 10:56:23 +04:00
|
|
|
if (!proc->is_from_method) {
|
|
|
|
th->safe_level = proc->safe_level;
|
|
|
|
}
|
2012-08-20 15:36:34 +04:00
|
|
|
val = invoke_block_from_c(th, &proc->block, self, argc, argv, blockptr, 0,
|
2014-03-13 20:18:45 +04:00
|
|
|
defined_class, 0);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
2007-07-05 14:04:56 +04:00
|
|
|
TH_POP_TAG();
|
|
|
|
|
2007-08-19 08:02:21 +04:00
|
|
|
if (!proc->is_from_method) {
|
2007-08-18 11:48:28 +04:00
|
|
|
th->safe_level = stored_safe;
|
|
|
|
}
|
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
if (state) {
|
|
|
|
JUMP_TAG(state);
|
|
|
|
}
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2012-08-20 15:36:34 +04:00
|
|
|
VALUE
|
|
|
|
rb_vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc,
|
|
|
|
int argc, const VALUE *argv, const rb_block_t *blockptr)
|
|
|
|
{
|
|
|
|
return vm_invoke_proc(th, proc, proc->block.self, proc->block.klass,
|
|
|
|
argc, argv, blockptr);
|
|
|
|
}
|
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* special variable */
|
|
|
|
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
static rb_control_frame_t *
|
|
|
|
vm_normal_frame(rb_thread_t *th, rb_control_frame_t *cfp)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
while (cfp->pc == 0) {
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
|
|
|
|
return 0;
|
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
return cfp;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
vm_cfp_svar_get(rb_thread_t *th, rb_control_frame_t *cfp, VALUE key)
|
|
|
|
{
|
|
|
|
cfp = vm_normal_frame(th, cfp);
|
2012-06-11 07:14:59 +04:00
|
|
|
return lep_svar_get(th, cfp ? VM_CF_LEP(cfp) : 0, key);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static void
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_cfp_svar_set(rb_thread_t *th, rb_control_frame_t *cfp, VALUE key, const VALUE val)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
cfp = vm_normal_frame(th, cfp);
|
2012-06-11 07:14:59 +04:00
|
|
|
lep_svar_set(th, cfp ? VM_CF_LEP(cfp) : 0, key, val);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2007-07-10 12:04:52 +04:00
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_svar_get(VALUE key)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_t *th = GET_THREAD();
|
2007-07-10 12:04:52 +04:00
|
|
|
return vm_cfp_svar_get(th, th->cfp, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_svar_set(VALUE key, VALUE val)
|
2007-07-10 12:04:52 +04:00
|
|
|
{
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_t *th = GET_THREAD();
|
2007-07-10 12:04:52 +04:00
|
|
|
vm_cfp_svar_set(th, th->cfp, key, val);
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_backref_get(void)
|
|
|
|
{
|
2007-07-10 12:04:52 +04:00
|
|
|
return vm_svar_get(1);
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_backref_set(VALUE val)
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
{
|
2007-07-10 12:04:52 +04:00
|
|
|
vm_svar_set(1, val);
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_lastline_get(void)
|
|
|
|
{
|
2007-07-10 12:04:52 +04:00
|
|
|
return vm_svar_get(0);
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_lastline_set(VALUE val)
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
{
|
2007-07-10 12:04:52 +04:00
|
|
|
vm_svar_set(0, val);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2012-05-25 08:50:10 +04:00
|
|
|
/* misc */
|
|
|
|
|
2011-09-03 19:11:53 +04:00
|
|
|
VALUE
|
|
|
|
rb_sourcefilename(void)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
|
|
|
|
|
|
|
if (cfp) {
|
2012-06-04 06:49:37 +04:00
|
|
|
return cfp->iseq->location.path;
|
2011-09-03 19:11:53 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const char *
|
|
|
|
rb_sourcefile(void)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2007-06-25 06:44:20 +04:00
|
|
|
rb_thread_t *th = GET_THREAD();
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
|
|
|
|
if (cfp) {
|
2012-06-04 06:49:37 +04:00
|
|
|
return RSTRING_PTR(cfp->iseq->location.path);
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
rb_sourceline(void)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
|
|
|
|
if (cfp) {
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
return rb_vm_get_sourceline(cfp);
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
2007-06-25 06:44:20 +04:00
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NODE *
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_cref(void)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
rb_thread_t *th = GET_THREAD();
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
2011-07-31 06:32:48 +04:00
|
|
|
|
|
|
|
if (cfp == 0) {
|
2012-08-02 15:34:19 +04:00
|
|
|
return NULL;
|
2011-07-31 06:32:48 +04:00
|
|
|
}
|
2012-08-02 15:34:19 +04:00
|
|
|
return rb_vm_get_cref(cfp->iseq, cfp->ep);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2013-12-24 18:04:31 +04:00
|
|
|
const NODE *
|
|
|
|
rb_vm_cref_in_context(VALUE self, VALUE cbase)
|
2013-12-24 11:28:11 +04:00
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
const rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
2013-12-24 18:04:31 +04:00
|
|
|
const NODE *cref;
|
2013-12-24 11:28:11 +04:00
|
|
|
if (cfp->self != self) return NULL;
|
2013-12-24 18:04:31 +04:00
|
|
|
cref = rb_vm_get_cref(cfp->iseq, cfp->ep);
|
|
|
|
if (cref->nd_clss != cbase) return NULL;
|
|
|
|
return cref;
|
2013-12-24 11:28:11 +04:00
|
|
|
}
|
|
|
|
|
2007-06-24 21:19:22 +04:00
|
|
|
#if 0
|
2006-12-31 18:02:22 +03:00
|
|
|
void
|
|
|
|
debug_cref(NODE *cref)
|
|
|
|
{
|
|
|
|
while (cref) {
|
|
|
|
dp(cref->nd_clss);
|
|
|
|
printf("%ld\n", cref->nd_visi);
|
|
|
|
cref = cref->nd_next;
|
|
|
|
}
|
|
|
|
}
|
2007-06-24 21:19:22 +04:00
|
|
|
#endif
|
2006-12-31 18:02:22 +03:00
|
|
|
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE
|
|
|
|
rb_vm_cbase(void)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
|
* vm.c, eval_intern.h (PASS_PASSED_BLOCK):
set a VM_FRAME_FLAG_PASSED flag to skip this frame when
searching ruby-level-cfp.
* eval.c, eval_intern.h, proc.c: fix to check cfp. if there is
no valid ruby-level-cfp, cause RuntimeError exception.
[ruby-dev:34128]
* vm_core.h, vm_evalbody.c, vm.c, vm_dump.c, vm_insnhelper.c,
insns.def: rename FRAME_MAGIC_* to VM_FRAME_MAGIC_*.
* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-11 01:46:43 +04:00
|
|
|
|
2011-07-31 06:32:48 +04:00
|
|
|
if (cfp == 0) {
|
|
|
|
rb_raise(rb_eRuntimeError, "Can't call on top of Fiber or Thread");
|
|
|
|
}
|
2012-06-11 07:14:59 +04:00
|
|
|
return vm_get_cbase(cfp->iseq, cfp->ep);
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
}
|
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* jump */
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
make_localjump_error(const char *mesg, VALUE value, int reason)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2007-07-05 14:04:56 +04:00
|
|
|
extern VALUE rb_eLocalJumpError;
|
|
|
|
VALUE exc = rb_exc_new2(rb_eLocalJumpError, mesg);
|
2006-12-31 18:02:22 +03:00
|
|
|
ID id;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
switch (reason) {
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_BREAK:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "break");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_REDO:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "redo");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_RETRY:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "retry");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_NEXT:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "next");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_RETURN:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "return");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
default:
|
2008-06-09 13:25:32 +04:00
|
|
|
CONST_ID(id, "noreason");
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
rb_iv_set(exc, "@exit_value", value);
|
|
|
|
rb_iv_set(exc, "@reason", ID2SYM(id));
|
|
|
|
return exc;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_localjump_error(const char *mesg, VALUE value, int reason)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
VALUE exc = make_localjump_error(mesg, value, reason);
|
|
|
|
rb_exc_raise(exc);
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
rb_vm_make_jump_tag_but_local_jump(int state, VALUE val)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
VALUE result = Qnil;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
|
2008-05-07 12:41:16 +04:00
|
|
|
if (val == Qundef) {
|
2006-12-31 18:02:22 +03:00
|
|
|
val = GET_THREAD()->tag->retval;
|
2008-05-07 12:41:16 +04:00
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
switch (state) {
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case 0:
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_RETURN:
|
2006-12-31 18:02:22 +03:00
|
|
|
result = make_localjump_error("unexpected return", val, state);
|
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_BREAK:
|
2006-12-31 18:02:22 +03:00
|
|
|
result = make_localjump_error("unexpected break", val, state);
|
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_NEXT:
|
2006-12-31 18:02:22 +03:00
|
|
|
result = make_localjump_error("unexpected next", val, state);
|
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_REDO:
|
2006-12-31 18:02:22 +03:00
|
|
|
result = make_localjump_error("unexpected redo", Qnil, state);
|
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
case TAG_RETRY:
|
2006-12-31 18:02:22 +03:00
|
|
|
result = make_localjump_error("retry outside of rescue clause", Qnil, state);
|
|
|
|
break;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
default:
|
2006-12-31 18:02:22 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-18 21:04:05 +04:00
|
|
|
rb_vm_jump_tag_but_local_jump(int state)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2012-12-18 21:04:05 +04:00
|
|
|
VALUE exc = rb_vm_make_jump_tag_but_local_jump(state, Qundef);
|
|
|
|
if (!NIL_P(exc)) rb_exc_raise(exc);
|
2006-12-31 18:02:22 +03:00
|
|
|
JUMP_TAG(state);
|
|
|
|
}
|
|
|
|
|
2012-01-24 09:20:48 +04:00
|
|
|
NORETURN(static void vm_iter_break(rb_thread_t *th, VALUE val));
|
2007-06-25 06:44:20 +04:00
|
|
|
|
|
|
|
static void
|
2012-01-24 09:20:48 +04:00
|
|
|
vm_iter_break(rb_thread_t *th, VALUE val)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_control_frame_t *cfp = th->cfp;
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *ep = VM_CF_PREV_EP(cfp);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
th->state = TAG_BREAK;
|
2012-06-11 07:14:59 +04:00
|
|
|
th->errinfo = (VALUE)NEW_THROW_OBJECT(val, (VALUE)ep, TAG_BREAK);
|
2006-12-31 18:02:22 +03:00
|
|
|
TH_JUMP_TAG(th, TAG_BREAK);
|
|
|
|
}
|
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
void
|
2008-05-22 08:28:13 +04:00
|
|
|
rb_iter_break(void)
|
2007-06-25 06:44:20 +04:00
|
|
|
{
|
2012-01-24 09:20:48 +04:00
|
|
|
vm_iter_break(GET_THREAD(), Qnil);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
rb_iter_break_value(VALUE val)
|
|
|
|
{
|
|
|
|
vm_iter_break(GET_THREAD(), val);
|
2007-06-25 06:44:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* optimization: redefine management */
|
|
|
|
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
static st_table *vm_opt_method_table = 0;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2013-03-05 16:36:45 +04:00
|
|
|
static int
|
|
|
|
vm_redefinition_check_flag(VALUE klass)
|
|
|
|
{
|
|
|
|
if (klass == rb_cFixnum) return FIXNUM_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cFloat) return FLOAT_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cString) return STRING_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cArray) return ARRAY_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cHash) return HASH_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cBignum) return BIGNUM_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cSymbol) return SYMBOL_REDEFINED_OP_FLAG;
|
|
|
|
if (klass == rb_cTime) return TIME_REDEFINED_OP_FLAG;
|
2013-09-26 11:39:48 +04:00
|
|
|
if (klass == rb_cRegexp) return REGEXP_REDEFINED_OP_FLAG;
|
2013-03-05 16:36:45 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static void
|
2011-08-25 02:02:03 +04:00
|
|
|
rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me, VALUE klass)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
* compile.c (iseq_build_body), error.c (set_syserr, get_syserr),
(syserr_initialize), gc.c (define_final, rb_gc_copy_finalizer),
(run_final), hash.c (rb_hash_aref, rb_hash_lookup2),
(rb_hash_fetch_m, rb_hash_clear, rb_hash_aset, eql_i),
iseq.c (iseq_load, iseq_data_to_ary), marshal.c (r_symlink),
thread.c (rb_thread_local_aref),
variable.c (generic_ivar_remove, ivar_get, rb_const_get_0),
(rb_cvar_get), vm.c (rb_vm_check_redefinition_opt_method),
vm_insnhelper.c (vm_get_ev_const), vm_method.c (remove_method),
ext/iconv/iconv.c (map_charset): use st_data_t.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29462 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-10-12 18:47:23 +04:00
|
|
|
st_data_t bop;
|
2009-08-28 06:45:41 +04:00
|
|
|
if (!me->def || me->def->type == VM_METHOD_TYPE_CFUNC) {
|
2009-07-15 18:59:41 +04:00
|
|
|
if (st_lookup(vm_opt_method_table, (st_data_t)me, &bop)) {
|
2013-03-05 16:36:45 +04:00
|
|
|
int flag = vm_redefinition_check_flag(klass);
|
2011-08-25 02:02:03 +04:00
|
|
|
|
|
|
|
ruby_vm_redefined_flag[bop] |= flag;
|
2009-07-15 18:59:41 +04:00
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-05 16:36:45 +04:00
|
|
|
static int
|
|
|
|
check_redefined_method(st_data_t key, st_data_t value, st_data_t data)
|
|
|
|
{
|
|
|
|
ID mid = (ID)key;
|
|
|
|
rb_method_entry_t *me = (rb_method_entry_t *)value;
|
|
|
|
VALUE klass = (VALUE)data;
|
|
|
|
rb_method_entry_t *newme = rb_method_entry(klass, mid, NULL);
|
|
|
|
|
|
|
|
if (newme != me)
|
|
|
|
rb_vm_check_redefinition_opt_method(me, me->klass);
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
rb_vm_check_redefinition_by_prepend(VALUE klass)
|
|
|
|
{
|
|
|
|
if (!vm_redefinition_check_flag(klass)) return;
|
|
|
|
st_foreach(RCLASS_M_TBL(RCLASS_ORIGIN(klass)), check_redefined_method,
|
|
|
|
(st_data_t)klass);
|
|
|
|
}
|
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
static void
|
2008-05-22 20:19:14 +04:00
|
|
|
add_opt_method(VALUE klass, ID mid, VALUE bop)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2014-03-08 12:56:50 +04:00
|
|
|
rb_method_entry_t *me = rb_method_entry_at(klass, mid);
|
|
|
|
|
|
|
|
if (me && me->def &&
|
2009-08-28 06:45:41 +04:00
|
|
|
me->def->type == VM_METHOD_TYPE_CFUNC) {
|
2009-07-15 18:59:41 +04:00
|
|
|
st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
else {
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
rb_bug("undefined optimized method: %s", rb_id2name(mid));
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
static void
|
|
|
|
vm_init_redefined_flag(void)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
2007-07-20 11:11:35 +04:00
|
|
|
ID mid;
|
|
|
|
VALUE bop;
|
|
|
|
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
vm_opt_method_table = st_init_numtable();
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2008-10-12 07:28:49 +04:00
|
|
|
#define OP(mid_, bop_) (mid = id##mid_, bop = BOP_##bop_, ruby_vm_redefined_flag[bop] = 0)
|
2007-07-20 11:11:35 +04:00
|
|
|
#define C(k) add_opt_method(rb_c##k, mid, bop)
|
|
|
|
OP(PLUS, PLUS), (C(Fixnum), C(Float), C(String), C(Array));
|
2012-08-23 11:22:40 +04:00
|
|
|
OP(MINUS, MINUS), (C(Fixnum), C(Float));
|
2007-07-20 11:11:35 +04:00
|
|
|
OP(MULT, MULT), (C(Fixnum), C(Float));
|
|
|
|
OP(DIV, DIV), (C(Fixnum), C(Float));
|
|
|
|
OP(MOD, MOD), (C(Fixnum), C(Float));
|
|
|
|
OP(Eq, EQ), (C(Fixnum), C(Float), C(String));
|
2009-08-12 09:55:06 +04:00
|
|
|
OP(Eqq, EQQ), (C(Fixnum), C(Bignum), C(Float), C(Symbol), C(String));
|
2012-08-23 11:22:40 +04:00
|
|
|
OP(LT, LT), (C(Fixnum), C(Float));
|
|
|
|
OP(LE, LE), (C(Fixnum), C(Float));
|
|
|
|
OP(GT, GT), (C(Fixnum), C(Float));
|
|
|
|
OP(GE, GE), (C(Fixnum), C(Float));
|
2007-07-20 11:11:35 +04:00
|
|
|
OP(LTLT, LTLT), (C(String), C(Array));
|
|
|
|
OP(AREF, AREF), (C(Array), C(Hash));
|
|
|
|
OP(ASET, ASET), (C(Array), C(Hash));
|
|
|
|
OP(Length, LENGTH), (C(Array), C(String), C(Hash));
|
2009-09-06 12:39:57 +04:00
|
|
|
OP(Size, SIZE), (C(Array), C(String), C(Hash));
|
2012-09-26 13:34:46 +04:00
|
|
|
OP(EmptyP, EMPTY_P), (C(Array), C(String), C(Hash));
|
2007-07-20 11:11:35 +04:00
|
|
|
OP(Succ, SUCC), (C(Fixnum), C(String), C(Time));
|
2013-09-26 11:58:28 +04:00
|
|
|
OP(EqTilde, MATCH), (C(Regexp), C(String));
|
2013-11-10 01:17:06 +04:00
|
|
|
OP(Freeze, FREEZE), (C(String));
|
2007-07-20 11:11:35 +04:00
|
|
|
#undef C
|
|
|
|
#undef OP
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
2010-01-24 16:52:32 +03:00
|
|
|
/* for vm development */
|
|
|
|
|
2010-02-17 11:05:42 +03:00
|
|
|
#if VMDEBUG
|
2010-01-24 16:52:32 +03:00
|
|
|
static const char *
|
|
|
|
vm_frametype_name(const rb_control_frame_t *cfp)
|
|
|
|
{
|
|
|
|
switch (VM_FRAME_TYPE(cfp)) {
|
|
|
|
case VM_FRAME_MAGIC_METHOD: return "method";
|
|
|
|
case VM_FRAME_MAGIC_BLOCK: return "block";
|
|
|
|
case VM_FRAME_MAGIC_CLASS: return "class";
|
|
|
|
case VM_FRAME_MAGIC_TOP: return "top";
|
|
|
|
case VM_FRAME_MAGIC_CFUNC: return "cfunc";
|
|
|
|
case VM_FRAME_MAGIC_PROC: return "proc";
|
|
|
|
case VM_FRAME_MAGIC_IFUNC: return "ifunc";
|
|
|
|
case VM_FRAME_MAGIC_EVAL: return "eval";
|
|
|
|
case VM_FRAME_MAGIC_LAMBDA: return "lambda";
|
2014-06-19 13:17:21 +04:00
|
|
|
case VM_FRAME_MAGIC_RESCUE: return "rescue";
|
2010-01-24 16:52:32 +03:00
|
|
|
default:
|
|
|
|
rb_bug("unknown frame");
|
|
|
|
}
|
|
|
|
}
|
2010-02-17 11:05:42 +03:00
|
|
|
#endif
|
2010-01-24 16:52:32 +03:00
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* evaluator body */
|
2007-04-19 14:37:08 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
/* finish
|
|
|
|
VMe (h1) finish
|
|
|
|
VM finish F1 F2
|
2007-11-23 11:34:34 +03:00
|
|
|
cfunc finish F1 F2 C1
|
2006-12-31 18:02:22 +03:00
|
|
|
rb_funcall finish F1 F2 C1
|
|
|
|
VMe finish F1 F2 C1
|
|
|
|
VM finish F1 F2 C1 F3
|
|
|
|
|
|
|
|
F1 - F3 : pushed by VM
|
|
|
|
C1 : pushed by send insn (CFUNC)
|
|
|
|
|
|
|
|
struct CONTROL_FRAME {
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE *pc; // cfp[0], program counter
|
|
|
|
VALUE *sp; // cfp[1], stack pointer
|
|
|
|
VALUE *bp; // cfp[2], base pointer
|
|
|
|
rb_iseq_t *iseq; // cfp[3], iseq
|
|
|
|
VALUE flag; // cfp[4], magic
|
|
|
|
VALUE self; // cfp[5], self
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *ep; // cfp[6], env pointer
|
|
|
|
rb_iseq_t * block_iseq; // cfp[7], block iseq
|
|
|
|
VALUE proc; // cfp[8], always 0
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct BLOCK {
|
|
|
|
VALUE self;
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *ep;
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_iseq_t *block_iseq;
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE proc;
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct METHOD_CONTROL_FRAME {
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
rb_control_frame_t frame;
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct METHOD_FRAME {
|
|
|
|
VALUE arg0;
|
|
|
|
...
|
|
|
|
VALUE argM;
|
|
|
|
VALUE param0;
|
|
|
|
...
|
|
|
|
VALUE paramN;
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE cref;
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE special; // lep [1]
|
|
|
|
struct block_object *block_ptr | 0x01; // lep [0]
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct BLOCK_CONTROL_FRAME {
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
rb_control_frame_t frame;
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct BLOCK_FRAME {
|
|
|
|
VALUE arg0;
|
|
|
|
...
|
|
|
|
VALUE argM;
|
|
|
|
VALUE param0;
|
|
|
|
...
|
|
|
|
VALUE paramN;
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE cref;
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *(prev_ptr | 0x01); // ep[0]
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CLASS_CONTROL_FRAME {
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
rb_control_frame_t frame;
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CLASS_FRAME {
|
|
|
|
VALUE param0;
|
|
|
|
...
|
|
|
|
VALUE paramN;
|
* vm.c, insns.def, eval.c, vm_insnhelper.c: fix CREF handling.
VM value stack frame of block contains cref information.
(dfp[-1] points CREF)
* compile.c, eval_intern.h, eval_method.c, load.c, proc.c,
vm_dump.h, vm_core.h: ditto.
* include/ruby/ruby.h, gc.c: remove T_VALUES because of above
changes.
* bootstraptest/test_eval.rb, test_knownbug.rb: move solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-19 07:08:50 +04:00
|
|
|
VALUE cref;
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE prev_ep; // for frame jump
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct C_METHOD_CONTROL_FRAME {
|
|
|
|
VALUE *pc; // 0
|
|
|
|
VALUE *sp; // stack pointer
|
|
|
|
VALUE *bp; // base pointer (used in exception)
|
2012-06-11 07:14:59 +04:00
|
|
|
rb_iseq_t *iseq; // cmi
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE magic; // C_METHOD_FRAME
|
|
|
|
VALUE self; // ?
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *ep; // ep == lep
|
|
|
|
rb_iseq_t * block_iseq; //
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE proc; // always 0
|
|
|
|
};
|
|
|
|
|
|
|
|
struct C_BLOCK_CONTROL_FRAME {
|
|
|
|
VALUE *pc; // point only "finish" insn
|
|
|
|
VALUE *sp; // sp
|
2012-06-11 07:14:59 +04:00
|
|
|
rb_iseq_t *iseq; // ?
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE magic; // C_METHOD_FRAME
|
|
|
|
VALUE self; // needed?
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *ep; // ep
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_iseq_t * block_iseq; // 0
|
2006-12-31 18:02:22 +03:00
|
|
|
};
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
static VALUE
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
vm_exec(rb_thread_t *th)
|
2006-12-31 18:02:22 +03:00
|
|
|
{
|
|
|
|
int state;
|
|
|
|
VALUE result, err;
|
|
|
|
VALUE initial = 0;
|
|
|
|
|
|
|
|
TH_PUSH_TAG(th);
|
2008-05-07 12:41:16 +04:00
|
|
|
_tag.retval = Qnil;
|
2006-12-31 18:02:22 +03:00
|
|
|
if ((state = EXEC_TAG()) == 0) {
|
|
|
|
vm_loop_start:
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
result = vm_exec_core(th, initial);
|
2006-12-31 18:02:22 +03:00
|
|
|
if ((state = th->state) != 0) {
|
|
|
|
err = result;
|
|
|
|
th->state = 0;
|
|
|
|
goto exception_handler;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
int i;
|
2007-07-01 22:16:02 +04:00
|
|
|
struct iseq_catch_table_entry *entry;
|
2014-07-14 11:06:26 +04:00
|
|
|
struct iseq_catch_table *ct;
|
2006-12-31 18:02:22 +03:00
|
|
|
unsigned long epc, cont_pc, cont_sp;
|
|
|
|
VALUE catch_iseqval;
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_control_frame_t *cfp;
|
2006-12-31 18:02:22 +03:00
|
|
|
VALUE type;
|
2013-05-17 07:39:40 +04:00
|
|
|
VALUE *escape_ep;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
err = th->errinfo;
|
|
|
|
|
|
|
|
exception_handler:
|
|
|
|
cont_pc = cont_sp = catch_iseqval = 0;
|
|
|
|
|
|
|
|
while (th->cfp->pc == 0 || th->cfp->iseq == 0) {
|
2010-01-24 16:52:32 +03:00
|
|
|
if (UNLIKELY(VM_FRAME_TYPE(th->cfp) == VM_FRAME_MAGIC_CFUNC)) {
|
|
|
|
const rb_method_entry_t *me = th->cfp->me;
|
2012-11-20 13:48:24 +04:00
|
|
|
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, th->cfp->self, me->called_id, me->klass, Qnil);
|
2012-11-29 21:55:54 +04:00
|
|
|
RUBY_DTRACE_METHOD_RETURN_HOOK(th, me->klass, me->called_id);
|
2010-01-24 16:52:32 +03:00
|
|
|
}
|
|
|
|
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
cfp = th->cfp;
|
|
|
|
epc = cfp->pc - cfp->iseq->iseq_encoded;
|
|
|
|
|
2013-05-17 07:39:40 +04:00
|
|
|
escape_ep = NULL;
|
2006-12-31 18:02:22 +03:00
|
|
|
if (state == TAG_BREAK || state == TAG_RETURN) {
|
2012-06-11 07:14:59 +04:00
|
|
|
escape_ep = GET_THROWOBJ_CATCH_POINT(err);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
if (cfp->ep == escape_ep) {
|
2006-12-31 18:02:22 +03:00
|
|
|
if (state == TAG_RETURN) {
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
if (!VM_FRAME_TYPE_FINISH_P(cfp)) {
|
2012-06-11 07:14:59 +04:00
|
|
|
SET_THROWOBJ_CATCH_POINT(err, (VALUE)(cfp + 1)->ep);
|
2006-12-31 18:02:22 +03:00
|
|
|
SET_THROWOBJ_STATE(err, state = TAG_BREAK);
|
|
|
|
}
|
|
|
|
else {
|
2014-07-14 11:06:26 +04:00
|
|
|
ct = cfp->iseq->catch_table;
|
|
|
|
if (ct) for (i = 0; i < ct->size; i++) {
|
|
|
|
entry = &ct->entries[i];
|
2009-08-13 16:06:14 +04:00
|
|
|
if (entry->start < epc && entry->end >= epc) {
|
|
|
|
if (entry->type == CATCH_TYPE_ENSURE) {
|
|
|
|
catch_iseqval = entry->iseq;
|
|
|
|
cont_pc = entry->cont;
|
|
|
|
cont_sp = entry->sp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!catch_iseqval) {
|
|
|
|
result = GET_THROWOBJ_VAL(err);
|
|
|
|
th->errinfo = Qnil;
|
2013-10-10 12:31:48 +04:00
|
|
|
|
|
|
|
switch (VM_FRAME_TYPE(cfp)) {
|
|
|
|
case VM_FRAME_MAGIC_LAMBDA:
|
|
|
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
vm_pop_frame(th);
|
2009-08-13 16:06:14 +04:00
|
|
|
goto finish_vme;
|
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
/* through */
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* TAG_BREAK */
|
|
|
|
#if OPT_STACK_CACHING
|
|
|
|
initial = (GET_THROWOBJ_VAL(err));
|
|
|
|
#else
|
|
|
|
*th->cfp->sp++ = (GET_THROWOBJ_VAL(err));
|
|
|
|
#endif
|
2010-02-10 19:46:39 +03:00
|
|
|
th->errinfo = Qnil;
|
2006-12-31 18:02:22 +03:00
|
|
|
goto vm_loop_start;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state == TAG_RAISE) {
|
2014-07-14 11:06:26 +04:00
|
|
|
ct = cfp->iseq->catch_table;
|
|
|
|
if (ct) for (i = 0; i < ct->size; i++) {
|
|
|
|
entry = &ct->entries[i];
|
2006-12-31 18:02:22 +03:00
|
|
|
if (entry->start < epc && entry->end >= epc) {
|
|
|
|
|
|
|
|
if (entry->type == CATCH_TYPE_RESCUE ||
|
|
|
|
entry->type == CATCH_TYPE_ENSURE) {
|
|
|
|
catch_iseqval = entry->iseq;
|
|
|
|
cont_pc = entry->cont;
|
|
|
|
cont_sp = entry->sp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (state == TAG_RETRY) {
|
2014-07-14 11:06:26 +04:00
|
|
|
ct = cfp->iseq->catch_table;
|
|
|
|
if (ct) for (i = 0; i < ct->size; i++) {
|
|
|
|
entry = &ct->entries[i];
|
2006-12-31 18:02:22 +03:00
|
|
|
if (entry->start < epc && entry->end >= epc) {
|
|
|
|
|
|
|
|
if (entry->type == CATCH_TYPE_ENSURE) {
|
|
|
|
catch_iseqval = entry->iseq;
|
|
|
|
cont_pc = entry->cont;
|
|
|
|
cont_sp = entry->sp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (entry->type == CATCH_TYPE_RETRY) {
|
2012-06-11 07:14:59 +04:00
|
|
|
VALUE *escape_ep;
|
|
|
|
escape_ep = GET_THROWOBJ_CATCH_POINT(err);
|
|
|
|
if (cfp->ep == escape_ep) {
|
2006-12-31 18:02:22 +03:00
|
|
|
cfp->pc = cfp->iseq->iseq_encoded + entry->cont;
|
2010-02-10 19:46:39 +03:00
|
|
|
th->errinfo = Qnil;
|
2006-12-31 18:02:22 +03:00
|
|
|
goto vm_loop_start;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-06-11 07:14:59 +04:00
|
|
|
else if (state == TAG_BREAK && ((VALUE)escape_ep & ~0x03) == 0) {
|
2006-12-31 18:02:22 +03:00
|
|
|
type = CATCH_TYPE_BREAK;
|
|
|
|
|
|
|
|
search_restart_point:
|
2014-07-14 11:06:26 +04:00
|
|
|
ct = cfp->iseq->catch_table;
|
|
|
|
if (ct) for (i = 0; i < ct->size; i++) {
|
|
|
|
entry = &ct->entries[i];
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
if (entry->start < epc && entry->end >= epc) {
|
|
|
|
if (entry->type == CATCH_TYPE_ENSURE) {
|
|
|
|
catch_iseqval = entry->iseq;
|
|
|
|
cont_pc = entry->cont;
|
|
|
|
cont_sp = entry->sp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (entry->type == type) {
|
|
|
|
cfp->pc = cfp->iseq->iseq_encoded + entry->cont;
|
2012-09-28 08:05:36 +04:00
|
|
|
cfp->sp = vm_base_ptr(cfp) + entry->sp;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2008-05-24 10:29:48 +04:00
|
|
|
if (state != TAG_REDO) {
|
2006-12-31 18:02:22 +03:00
|
|
|
#if OPT_STACK_CACHING
|
|
|
|
initial = (GET_THROWOBJ_VAL(err));
|
|
|
|
#else
|
|
|
|
*th->cfp->sp++ = (GET_THROWOBJ_VAL(err));
|
|
|
|
#endif
|
|
|
|
}
|
2010-02-10 19:46:39 +03:00
|
|
|
th->errinfo = Qnil;
|
2012-01-24 09:20:48 +04:00
|
|
|
th->state = 0;
|
2006-12-31 18:02:22 +03:00
|
|
|
goto vm_loop_start;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (state == TAG_REDO) {
|
|
|
|
type = CATCH_TYPE_REDO;
|
|
|
|
goto search_restart_point;
|
|
|
|
}
|
|
|
|
else if (state == TAG_NEXT) {
|
|
|
|
type = CATCH_TYPE_NEXT;
|
|
|
|
goto search_restart_point;
|
|
|
|
}
|
|
|
|
else {
|
2014-07-14 11:06:26 +04:00
|
|
|
ct = cfp->iseq->catch_table;
|
|
|
|
if (ct) for (i = 0; i < ct->size; i++) {
|
|
|
|
entry = &ct->entries[i];
|
2006-12-31 18:02:22 +03:00
|
|
|
if (entry->start < epc && entry->end >= epc) {
|
|
|
|
|
|
|
|
if (entry->type == CATCH_TYPE_ENSURE) {
|
|
|
|
catch_iseqval = entry->iseq;
|
|
|
|
cont_pc = entry->cont;
|
|
|
|
cont_sp = entry->sp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (catch_iseqval != 0) {
|
|
|
|
/* found catch table */
|
* blockinlining.c, compile.c, compile.h, error.c, eval.c,
eval_intern.h, eval_jump.h, eval_load.c, eval_method.h,
eval_safe.h, gc.c, insnhelper.h, insns.def, iseq.c, proc.c,
process.c, signal.c, thread.c, thread_pthread.ci, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, vm_macro.def,
yarv.h, yarvcore.h, yarvcore.c: change type and macro names:
* yarv_*_t -> rb_*_t
* yarv_*_struct -> rb_*_struct
* yarv_tag -> rb_vm_tag
* YARV_* -> RUBY_VM_*
* proc.c, vm.c: move functions about env object creation
from proc.c to vm.c.
* proc.c, yarvcore.c: fix rb_cVM initialization place.
* inits.c: change Init_ISeq() order (after Init_VM).
* ruby.h, proc.c: change declaration place of rb_cEnv
from proc.c to ruby.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-06 22:00:03 +03:00
|
|
|
rb_iseq_t *catch_iseq;
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/* enter catch scope */
|
|
|
|
GetISeqPtr(catch_iseqval, catch_iseq);
|
2012-09-28 08:05:36 +04:00
|
|
|
cfp->sp = vm_base_ptr(cfp) + cont_sp;
|
2006-12-31 18:02:22 +03:00
|
|
|
cfp->pc = cfp->iseq->iseq_encoded + cont_pc;
|
|
|
|
|
|
|
|
/* push block frame */
|
|
|
|
cfp->sp[0] = err;
|
2014-06-19 13:17:21 +04:00
|
|
|
vm_push_frame(th, catch_iseq, VM_FRAME_MAGIC_RESCUE,
|
2012-08-02 15:08:44 +04:00
|
|
|
cfp->self, cfp->klass,
|
|
|
|
VM_ENVVAL_PREV_EP_PTR(cfp->ep),
|
|
|
|
catch_iseq->iseq_encoded,
|
|
|
|
cfp->sp + 1 /* push value */,
|
|
|
|
catch_iseq->local_size - 1,
|
2013-08-06 12:33:05 +04:00
|
|
|
cfp->me, catch_iseq->stack_max);
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2010-02-10 19:46:39 +03:00
|
|
|
state = 0;
|
2010-02-11 11:52:16 +03:00
|
|
|
th->state = 0;
|
2010-02-10 19:46:39 +03:00
|
|
|
th->errinfo = Qnil;
|
2006-12-31 18:02:22 +03:00
|
|
|
goto vm_loop_start;
|
|
|
|
}
|
|
|
|
else {
|
2010-01-24 16:52:32 +03:00
|
|
|
/* skip frame */
|
|
|
|
|
|
|
|
switch (VM_FRAME_TYPE(th->cfp)) {
|
|
|
|
case VM_FRAME_MAGIC_METHOD:
|
2012-12-11 07:37:19 +04:00
|
|
|
RUBY_DTRACE_METHOD_RETURN_HOOK(th, 0, 0);
|
2012-12-25 17:24:17 +04:00
|
|
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, Qnil);
|
2010-01-24 16:52:32 +03:00
|
|
|
break;
|
2012-11-30 02:28:16 +04:00
|
|
|
case VM_FRAME_MAGIC_BLOCK:
|
2013-10-10 12:31:48 +04:00
|
|
|
case VM_FRAME_MAGIC_LAMBDA:
|
2014-04-30 13:08:10 +04:00
|
|
|
if (VM_FRAME_TYPE_BMETHOD_P(th->cfp)) {
|
|
|
|
EXEC_EVENT_HOOK(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
|
|
|
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, th->cfp->me->called_id, th->cfp->me->klass, Qnil);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
|
|
|
|
}
|
2012-11-30 02:28:16 +04:00
|
|
|
break;
|
2010-01-24 16:52:32 +03:00
|
|
|
case VM_FRAME_MAGIC_CLASS:
|
2012-12-25 17:24:17 +04:00
|
|
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_END, th->cfp->self, 0, 0, Qnil);
|
2010-01-24 16:52:32 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
if (VM_FRAME_TYPE_FINISH_P(th->cfp)) {
|
* vm.c: some refactoring.
* rename th_* to vm_*.
* remove unused variables functions.
* add prototypes.
* blockinlining.c, compile.c, cont.c, eval.c, eval_intern.h,
eval_jump.h, eval_load.c, inits.c, insns.def, iseq.c, parse.y,
proc.c, process.c, signal.c, thread.c, vm.c, vm_dump.c,
vm_evalbody.ci, yarvcore.c, yarvcore.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-24 19:42:41 +04:00
|
|
|
vm_pop_frame(th);
|
2006-12-31 18:02:22 +03:00
|
|
|
th->errinfo = err;
|
2014-02-05 19:32:35 +04:00
|
|
|
TH_TMPPOP_TAG();
|
2006-12-31 18:02:22 +03:00
|
|
|
JUMP_TAG(state);
|
|
|
|
}
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
else {
|
|
|
|
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
|
|
|
|
goto exception_handler;
|
|
|
|
}
|
2006-12-31 18:02:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
finish_vme:
|
|
|
|
TH_POP_TAG();
|
|
|
|
return result;
|
|
|
|
}
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
|
2007-06-25 06:44:20 +04:00
|
|
|
/* misc */
|
|
|
|
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_iseq_eval(VALUE iseqval)
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
{
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_t *th = GET_THREAD();
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
VALUE val;
|
* compile.c, dir.c, eval.c, eval_jump.h, eval_method.h, numeric.c,
pack.c, parse.y, re.c, thread.c, vm.c, vm_dump.c, call_cfunc.ci,
thread_pthread.ci, thread_win32.ci: fixed indentation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-05 08:25:10 +04:00
|
|
|
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
vm_set_top_stack(th, iseqval);
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
|
2008-12-27 04:15:56 +03:00
|
|
|
val = vm_exec(th);
|
* bignum.c (big_rshift), compile.c (validate_label,
iseq_build_from_ary_exception), cont.c (cont_capture), dir.c
(dir_open_dir), gc.c (objspace_each_objects), io.c (pipe_open)
(rb_io_advise), parse.y (parser_compile_string)
(rb_parser_compile_file), proc.c (binding_free), process.c
(rb_proc_exec_n, rb_seteuid_core, proc_setegid, rb_setegid_core)
(p_uid_exchange, p_gid_exchange), regparse.c (strdup_with_null),
signal.c (sig_dfl), vm.c (rb_iseq_eval, rb_iseq_eval_main),
vm_insnhelper.c (vm_expandarray): suppress
unused-but-set-variable warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33951 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-12-05 13:57:00 +04:00
|
|
|
RB_GC_GUARD(iseqval); /* prohibit tail call optimization */
|
2008-12-27 04:15:56 +03:00
|
|
|
return val;
|
2009-01-05 12:54:47 +03:00
|
|
|
}
|
2008-12-27 04:15:56 +03:00
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_iseq_eval_main(VALUE iseqval)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
|
|
|
VALUE val;
|
|
|
|
|
|
|
|
vm_set_main_stack(th, iseqval);
|
|
|
|
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
val = vm_exec(th);
|
* bignum.c (big_rshift), compile.c (validate_label,
iseq_build_from_ary_exception), cont.c (cont_capture), dir.c
(dir_open_dir), gc.c (objspace_each_objects), io.c (pipe_open)
(rb_io_advise), parse.y (parser_compile_string)
(rb_parser_compile_file), proc.c (binding_free), process.c
(rb_proc_exec_n, rb_seteuid_core, proc_setegid, rb_setegid_core)
(p_uid_exchange, p_gid_exchange), regparse.c (strdup_with_null),
signal.c (sig_dfl), vm.c (rb_iseq_eval, rb_iseq_eval_main),
vm_insnhelper.c (vm_expandarray): suppress
unused-but-set-variable warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33951 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-12-05 13:57:00 +04:00
|
|
|
RB_GC_GUARD(iseqval); /* prohibit tail call optimization */
|
* this commit is a result of refactoring. only renaming functions,
moving definitions place, add/remove prototypes, deleting
unused variables and removing yarv.h.
This commit doesn't change any behavior of ruby/vm.
* yarv.h, common.mk: remove yarv.h (contents are moved to yarvcore.h).
* error.c, eval_intern.h: include yarvcore.h instead yarv.h
* rename some functions:
* debug.[ch]: debug_*() -> ruby_debug_*()
* iseq.c: iseq_*() -> rb_iseq_*(), ruby_iseq_disasm()
* iseq.c: node_name() -> ruby_node_name()
* vm.c: yarv_check_redefinition_opt_method() ->
rb_vm_check_redefinition_opt_method()
* some refactoring with checking -Wall.
* array.c: remove rb_ary_ptr() (unused) and remove unused
local variables.
* object.c: add a prototype of rb_mod_module_exec().
* eval_intern.h (ruby_cref): set it inline.
* eval_load.c (rb_load), yarvcore.c: yarv_load() -> rb_load_internal().
* parse.y: add a prototype of rb_parse_in_eval() (in eval.c).
* process.c: add a prototype of rb_thread_stop_timer_thread() (in thread.c).
* thread.c: remove raw_gets() function (unused) and fix some format
mismatch (format mismatchs have remained yet. this is todo).
* thread.c (rb_thread_wait_fd_rw): fix typo on label name.
* thread_pthread.ci: comment out codes with USE_THREAD_CACHE.
* vm.c (rb_svar, rb_backref_get, rb_backref_get,
rb_lastline_get, rb_lastline_set) : moved from yarvcore.c.
* vm.c (yarv_init_redefined_flag): add a prototype and rename
yarv_opt_method_table to vm_opt_method_table.
* vm.c (rb_thread_eval): moved from yarvcore.c.
* yarvcore.c: remove unused global variables and fix to use nsdr().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-07 04:25:05 +03:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2007-04-25 07:50:00 +04:00
|
|
|
int
|
2013-01-29 12:25:32 +04:00
|
|
|
rb_vm_control_frame_id_and_class(const rb_control_frame_t *cfp, ID *idp, VALUE *klassp)
|
2007-04-25 07:50:00 +04:00
|
|
|
{
|
2007-11-11 11:42:13 +03:00
|
|
|
rb_iseq_t *iseq = cfp->iseq;
|
2010-08-29 08:22:55 +04:00
|
|
|
if (!iseq && cfp->me) {
|
2009-08-28 06:45:41 +04:00
|
|
|
if (idp) *idp = cfp->me->def->original_id;
|
2009-07-15 18:59:41 +04:00
|
|
|
if (klassp) *klassp = cfp->me->klass;
|
2007-04-25 07:50:00 +04:00
|
|
|
return 1;
|
|
|
|
}
|
2007-11-11 11:42:13 +03:00
|
|
|
while (iseq) {
|
|
|
|
if (RUBY_VM_IFUNC_P(iseq)) {
|
2013-05-01 06:40:41 +04:00
|
|
|
if (idp) *idp = idIFUNC;
|
2007-11-11 11:42:13 +03:00
|
|
|
if (klassp) *klassp = 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (iseq->defined_method_id) {
|
|
|
|
if (idp) *idp = iseq->defined_method_id;
|
|
|
|
if (klassp) *klassp = iseq->klass;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (iseq->local_iseq == iseq) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
iseq = iseq->parent_iseq;
|
|
|
|
}
|
2007-04-25 07:50:00 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-08-22 09:12:31 +04:00
|
|
|
int
|
|
|
|
rb_thread_method_id_and_class(rb_thread_t *th, ID *idp, VALUE *klassp)
|
|
|
|
{
|
|
|
|
return rb_vm_control_frame_id_and_class(th->cfp, idp, klassp);
|
|
|
|
}
|
|
|
|
|
2007-12-25 11:49:09 +03:00
|
|
|
int
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_frame_method_id_and_class(ID *idp, VALUE *klassp)
|
2007-12-25 11:49:09 +03:00
|
|
|
{
|
|
|
|
return rb_thread_method_id_and_class(GET_THREAD(), idp, klassp);
|
|
|
|
}
|
|
|
|
|
2007-04-25 07:50:00 +04:00
|
|
|
VALUE
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
rb_thread_current_status(const rb_thread_t *th)
|
2007-04-25 07:50:00 +04:00
|
|
|
{
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const rb_control_frame_t *cfp = th->cfp;
|
2007-04-25 07:50:00 +04:00
|
|
|
VALUE str = Qnil;
|
|
|
|
|
|
|
|
if (cfp->iseq != 0) {
|
|
|
|
if (cfp->pc != 0) {
|
|
|
|
rb_iseq_t *iseq = cfp->iseq;
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
int line_no = rb_vm_get_sourceline(cfp);
|
2014-11-25 21:44:22 +03:00
|
|
|
str = rb_sprintf("%"PRIsVALUE":%d:in `%"PRIsVALUE"'",
|
|
|
|
iseq->location.path, line_no, iseq->location.label);
|
2007-04-25 07:50:00 +04:00
|
|
|
}
|
|
|
|
}
|
2009-08-28 06:45:41 +04:00
|
|
|
else if (cfp->me->def->original_id) {
|
2014-11-25 21:44:22 +03:00
|
|
|
str = rb_sprintf("`%"PRIsVALUE"#%"PRIsVALUE"' (cfunc)",
|
|
|
|
rb_class_path(cfp->me->klass),
|
|
|
|
rb_id2str(cfp->me->def->original_id));
|
2007-04-25 07:50:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
2007-06-18 12:02:30 +04:00
|
|
|
|
|
|
|
VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg,
|
2010-06-17 18:32:20 +04:00
|
|
|
const rb_block_t *blockptr, VALUE filename)
|
2007-06-18 12:02:30 +04:00
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
const rb_control_frame_t *reg_cfp = th->cfp;
|
2010-06-17 18:32:20 +04:00
|
|
|
volatile VALUE iseqval = rb_iseq_new(0, filename, filename, Qnil, 0, ISEQ_TYPE_TOP);
|
2007-06-18 12:02:30 +04:00
|
|
|
VALUE val;
|
|
|
|
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
vm_push_frame(th, DATA_PTR(iseqval), VM_FRAME_MAGIC_TOP | VM_FRAME_FLAG_FINISH,
|
2013-08-06 12:33:05 +04:00
|
|
|
recv, CLASS_OF(recv), VM_ENVVAL_BLOCK_PTR(blockptr), 0, reg_cfp->sp, 1, 0, 0);
|
* eval_method.c: renamed from vm_method.c. "vm_method.c" is included
by "vm.c".
* vm_eval.c: added. Some codes are moved from "eval.c"
* common.mk: fix for above changes.
* compile.c: make a vm_eval(0)
* eval.c, eval_error.c, eval_intern.h, eval_jump.c, proc.c, vm.c,
id.c, id.h, vm_core.h, vm_dump.c, vm_evalbody.c, vm_insnhelper.c,
blockinlining.c: fix for above changes. and do some refactoring.
this changes improve rb_yield() performance.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-05-24 21:50:17 +04:00
|
|
|
|
2007-06-18 12:02:30 +04:00
|
|
|
val = (*func)(arg);
|
2007-06-25 00:33:04 +04:00
|
|
|
|
* vm.c: some refactoring.
* rename th_* to vm_*.
* remove unused variables functions.
* add prototypes.
* blockinlining.c, compile.c, cont.c, eval.c, eval_intern.h,
eval_jump.h, eval_load.c, inits.c, insns.def, iseq.c, parse.y,
proc.c, process.c, signal.c, thread.c, vm.c, vm_dump.c,
vm_evalbody.ci, yarvcore.c, yarvcore.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-24 19:42:41 +04:00
|
|
|
vm_pop_frame(th);
|
2007-06-18 12:02:30 +04:00
|
|
|
return val;
|
|
|
|
}
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
/* vm */
|
|
|
|
|
2013-03-06 10:30:03 +04:00
|
|
|
void rb_vm_trace_mark_event_hooks(rb_hook_list_t *hooks);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
void
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_vm_mark(void *ptr)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
2014-07-16 14:16:34 +04:00
|
|
|
int i;
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
RUBY_MARK_ENTER("vm");
|
|
|
|
RUBY_GC_INFO("-------------------------------------------------\n");
|
|
|
|
if (ptr) {
|
|
|
|
rb_vm_t *vm = ptr;
|
2014-05-29 19:45:25 +04:00
|
|
|
rb_thread_t *th = 0;
|
2014-05-28 05:48:11 +04:00
|
|
|
|
|
|
|
list_for_each(&vm->living_threads, th, vmlt_node) {
|
|
|
|
rb_gc_mark(th->self);
|
|
|
|
}
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
|
|
|
|
RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
|
2008-04-30 13:03:03 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->load_path);
|
2012-11-05 19:27:05 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->load_path_snapshot);
|
2012-11-05 19:27:08 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->load_path_check_cache);
|
2012-11-05 19:27:05 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->loaded_features);
|
2012-11-05 19:27:01 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->top_self);
|
2008-07-03 16:55:12 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->coverages);
|
2013-10-11 22:27:18 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(vm->defined_module_hash);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
if (vm->loading_table) {
|
|
|
|
rb_mark_tbl(vm->loading_table);
|
|
|
|
}
|
|
|
|
|
2013-03-06 10:30:03 +04:00
|
|
|
rb_vm_trace_mark_event_hooks(&vm->event_hooks);
|
2014-07-16 14:16:34 +04:00
|
|
|
|
|
|
|
for (i = 0; i < RUBY_NSIG; i++) {
|
|
|
|
if (vm->trap_list[i].cmd)
|
|
|
|
rb_gc_mark(vm->trap_list[i].cmd);
|
|
|
|
}
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
RUBY_MARK_LEAVE("vm");
|
|
|
|
}
|
|
|
|
|
2014-09-11 14:53:48 +04:00
|
|
|
void
|
|
|
|
rb_vm_register_special_exception(enum ruby_special_exceptions sp, VALUE cls, const char *mesg)
|
|
|
|
{
|
|
|
|
rb_vm_t *vm = GET_VM();
|
|
|
|
VALUE exc = rb_exc_new3(cls, rb_obj_freeze(rb_str_new2(mesg)));
|
|
|
|
OBJ_TAINT(exc);
|
|
|
|
OBJ_FREEZE(exc);
|
|
|
|
((VALUE *)vm->special_exceptions)[sp] = exc;
|
|
|
|
rb_gc_register_mark_object(exc);
|
|
|
|
}
|
2013-10-11 22:27:18 +04:00
|
|
|
|
|
|
|
int
|
|
|
|
rb_vm_add_root_module(ID id, VALUE module)
|
|
|
|
{
|
|
|
|
rb_vm_t *vm = GET_VM();
|
|
|
|
if (vm->defined_module_hash) {
|
|
|
|
rb_hash_aset(vm->defined_module_hash, ID2SYM(id), module);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2009-09-18 11:29:17 +04:00
|
|
|
int
|
2010-10-13 14:28:25 +04:00
|
|
|
ruby_vm_destruct(rb_vm_t *vm)
|
2009-06-17 02:23:53 +04:00
|
|
|
{
|
|
|
|
RUBY_FREE_ENTER("vm");
|
2014-06-02 12:17:55 +04:00
|
|
|
|
2010-10-13 14:28:25 +04:00
|
|
|
if (vm) {
|
2009-09-18 11:29:17 +04:00
|
|
|
rb_thread_t *th = vm->main_thread;
|
|
|
|
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
|
|
|
struct rb_objspace *objspace = vm->objspace;
|
|
|
|
#endif
|
|
|
|
vm->main_thread = 0;
|
|
|
|
if (th) {
|
2012-02-15 18:00:11 +04:00
|
|
|
rb_fiber_reset_root_local_storage(th->self);
|
2009-09-18 11:29:17 +04:00
|
|
|
thread_free(th);
|
|
|
|
}
|
vm*: doubly-linked list from ccan to manage vm->living_threads
A doubly-linked list for tracking living threads guarantees
constant-time insert/delete performance with no corner cases of a
hash table. I chose this ccan implementation of doubly-linked
lists over the BSD sys/queue.h implementation since:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
(0002 patch in Feature 9632 will introduce a secondary list
for waiting FDs)
This also increases cache locality during iteration: improving
performance in a new IO#close benchmark with many sleeping threads
while still scanning the same number of threads.
vm_thread_close 1.762
* vm_core.h (rb_vm_t): list_head and counter for living_threads
(rb_thread_t): vmlt_node for living_threads linkage
(rb_vm_living_threads_init): new function wrapper
(rb_vm_living_threads_insert): ditto
(rb_vm_living_threads_remove): ditto
* vm.c (rb_vm_living_threads_foreach): new function wrapper
* thread.c (terminate_i, thread_start_func_2, thread_create_core,
thread_fd_close_i, thread_fd_close): update to use new APIs
* vm.c (vm_mark_each_thread_func, rb_vm_mark, ruby_vm_destruct,
vm_memsize, vm_init2, Init_VM): ditto
* vm_trace.c (clear_trace_func_i, rb_clear_trace_func): ditto
* benchmark/bm_vm_thread_close.rb: added to show improvement
* ccan/build_assert/build_assert.h: added as a dependency of list.h
* ccan/check_type/check_type.h: ditto
* ccan/container_of/container_of.h: ditto
* ccan/licenses/BSD-MIT: ditto
* ccan/licenses/CC0: ditto
* ccan/str/str.h: ditto (stripped of unused macros)
* ccan/list/list.h: ditto
* common.mk: add CCAN_LIST_INCLUDES
[ruby-core:61871][Feature 9632 (part 1)]
Apologies for the size of this commit, but I think a good
doubly-linked list will be useful for future features, too.
This may be used to add ordering to a container_of-based hash
table to preserve compatibility if required (e.g. feature 9614).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-11 03:48:51 +04:00
|
|
|
rb_vm_living_threads_init(vm);
|
2013-11-22 05:38:08 +04:00
|
|
|
ruby_vm_run_at_exit_hooks(vm);
|
|
|
|
rb_vm_gvl_destroy(vm);
|
2009-09-18 11:29:17 +04:00
|
|
|
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
|
|
|
if (objspace) {
|
|
|
|
rb_objspace_free(objspace);
|
|
|
|
}
|
|
|
|
#endif
|
2013-11-22 05:38:08 +04:00
|
|
|
/* after freeing objspace, you *can't* use ruby_xfree() */
|
|
|
|
ruby_mimfree(vm);
|
2010-12-03 06:53:21 +03:00
|
|
|
ruby_current_vm = 0;
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
RUBY_FREE_LEAVE("vm");
|
2009-09-18 11:29:17 +04:00
|
|
|
return 0;
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static size_t
|
2009-09-09 06:11:35 +04:00
|
|
|
vm_memsize(const void *ptr)
|
2009-06-17 02:23:53 +04:00
|
|
|
{
|
|
|
|
if (ptr) {
|
2009-09-09 06:11:35 +04:00
|
|
|
const rb_vm_t *vmobj = ptr;
|
2012-09-24 12:36:53 +04:00
|
|
|
size_t size = sizeof(rb_vm_t);
|
vm*: doubly-linked list from ccan to manage vm->living_threads
A doubly-linked list for tracking living threads guarantees
constant-time insert/delete performance with no corner cases of a
hash table. I chose this ccan implementation of doubly-linked
lists over the BSD sys/queue.h implementation since:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
(0002 patch in Feature 9632 will introduce a secondary list
for waiting FDs)
This also increases cache locality during iteration: improving
performance in a new IO#close benchmark with many sleeping threads
while still scanning the same number of threads.
vm_thread_close 1.762
* vm_core.h (rb_vm_t): list_head and counter for living_threads
(rb_thread_t): vmlt_node for living_threads linkage
(rb_vm_living_threads_init): new function wrapper
(rb_vm_living_threads_insert): ditto
(rb_vm_living_threads_remove): ditto
* vm.c (rb_vm_living_threads_foreach): new function wrapper
* thread.c (terminate_i, thread_start_func_2, thread_create_core,
thread_fd_close_i, thread_fd_close): update to use new APIs
* vm.c (vm_mark_each_thread_func, rb_vm_mark, ruby_vm_destruct,
vm_memsize, vm_init2, Init_VM): ditto
* vm_trace.c (clear_trace_func_i, rb_clear_trace_func): ditto
* benchmark/bm_vm_thread_close.rb: added to show improvement
* ccan/build_assert/build_assert.h: added as a dependency of list.h
* ccan/check_type/check_type.h: ditto
* ccan/container_of/container_of.h: ditto
* ccan/licenses/BSD-MIT: ditto
* ccan/licenses/CC0: ditto
* ccan/str/str.h: ditto (stripped of unused macros)
* ccan/list/list.h: ditto
* common.mk: add CCAN_LIST_INCLUDES
[ruby-core:61871][Feature 9632 (part 1)]
Apologies for the size of this commit, but I think a good
doubly-linked list will be useful for future features, too.
This may be used to add ordering to a container_of-based hash
table to preserve compatibility if required (e.g. feature 9614).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-11 03:48:51 +04:00
|
|
|
|
|
|
|
size += vmobj->living_thread_num * sizeof(rb_thread_t);
|
|
|
|
|
2012-09-24 12:36:53 +04:00
|
|
|
if (vmobj->defined_strings) {
|
|
|
|
size += DEFINED_EXPR * sizeof(VALUE);
|
|
|
|
}
|
|
|
|
return size;
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-07 10:23:39 +04:00
|
|
|
static const rb_data_type_t vm_data_type = {
|
2009-06-17 02:23:53 +04:00
|
|
|
"VM",
|
2014-07-16 13:06:52 +04:00
|
|
|
{NULL, NULL, vm_memsize,},
|
2014-12-01 09:38:04 +03:00
|
|
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
2009-06-17 02:23:53 +04:00
|
|
|
};
|
|
|
|
|
2012-12-20 02:29:18 +04:00
|
|
|
|
|
|
|
static VALUE
|
|
|
|
vm_default_params(void)
|
|
|
|
{
|
|
|
|
rb_vm_t *vm = GET_VM();
|
|
|
|
VALUE result = rb_hash_new();
|
|
|
|
#define SET(name) rb_hash_aset(result, ID2SYM(rb_intern(#name)), SIZET2NUM(vm->default_params.name));
|
|
|
|
SET(thread_vm_stack_size);
|
|
|
|
SET(thread_machine_stack_size);
|
|
|
|
SET(fiber_vm_stack_size);
|
|
|
|
SET(fiber_machine_stack_size);
|
|
|
|
#undef SET
|
|
|
|
rb_obj_freeze(result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t
|
|
|
|
get_param(const char *name, size_t default_value, size_t min_value)
|
|
|
|
{
|
|
|
|
const char *envval;
|
|
|
|
size_t result = default_value;
|
|
|
|
if ((envval = getenv(name)) != 0) {
|
|
|
|
long val = atol(envval);
|
|
|
|
if (val < (long)min_value) {
|
|
|
|
val = (long)min_value;
|
|
|
|
}
|
|
|
|
result = (size_t)(((val -1 + RUBY_VM_SIZE_ALIGN) / RUBY_VM_SIZE_ALIGN) * RUBY_VM_SIZE_ALIGN);
|
|
|
|
}
|
2012-12-20 05:52:50 +04:00
|
|
|
if (0) fprintf(stderr, "%s: %"PRIdSIZE"\n", name, result); /* debug print */
|
2012-12-20 02:29:18 +04:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
check_machine_stack_size(size_t *sizep)
|
|
|
|
{
|
2012-12-28 07:03:19 +04:00
|
|
|
#ifdef PTHREAD_STACK_MIN
|
2012-12-20 02:29:18 +04:00
|
|
|
size_t size = *sizep;
|
2012-12-28 07:03:19 +04:00
|
|
|
#endif
|
|
|
|
|
2012-12-20 02:29:18 +04:00
|
|
|
#ifdef PTHREAD_STACK_MIN
|
|
|
|
if (size < PTHREAD_STACK_MIN) {
|
|
|
|
*sizep = PTHREAD_STACK_MIN * 2;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
vm_default_params_setup(rb_vm_t *vm)
|
|
|
|
{
|
|
|
|
vm->default_params.thread_vm_stack_size =
|
|
|
|
get_param("RUBY_THREAD_VM_STACK_SIZE",
|
|
|
|
RUBY_VM_THREAD_VM_STACK_SIZE,
|
|
|
|
RUBY_VM_THREAD_VM_STACK_SIZE_MIN);
|
|
|
|
|
|
|
|
vm->default_params.thread_machine_stack_size =
|
|
|
|
get_param("RUBY_THREAD_MACHINE_STACK_SIZE",
|
|
|
|
RUBY_VM_THREAD_MACHINE_STACK_SIZE,
|
|
|
|
RUBY_VM_THREAD_MACHINE_STACK_SIZE_MIN);
|
|
|
|
|
|
|
|
vm->default_params.fiber_vm_stack_size =
|
|
|
|
get_param("RUBY_FIBER_VM_STACK_SIZE",
|
|
|
|
RUBY_VM_FIBER_VM_STACK_SIZE,
|
|
|
|
RUBY_VM_FIBER_VM_STACK_SIZE_MIN);
|
|
|
|
|
|
|
|
vm->default_params.fiber_machine_stack_size =
|
|
|
|
get_param("RUBY_FIBER_MACHINE_STACK_SIZE",
|
|
|
|
RUBY_VM_FIBER_MACHINE_STACK_SIZE,
|
|
|
|
RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN);
|
|
|
|
|
|
|
|
/* environment dependent check */
|
|
|
|
check_machine_stack_size(&vm->default_params.thread_machine_stack_size);
|
|
|
|
check_machine_stack_size(&vm->default_params.fiber_machine_stack_size);
|
|
|
|
}
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
static void
|
2008-05-22 20:19:14 +04:00
|
|
|
vm_init2(rb_vm_t *vm)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
MEMZERO(vm, rb_vm_t, 1);
|
vm*: doubly-linked list from ccan to manage vm->living_threads
A doubly-linked list for tracking living threads guarantees
constant-time insert/delete performance with no corner cases of a
hash table. I chose this ccan implementation of doubly-linked
lists over the BSD sys/queue.h implementation since:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
(0002 patch in Feature 9632 will introduce a secondary list
for waiting FDs)
This also increases cache locality during iteration: improving
performance in a new IO#close benchmark with many sleeping threads
while still scanning the same number of threads.
vm_thread_close 1.762
* vm_core.h (rb_vm_t): list_head and counter for living_threads
(rb_thread_t): vmlt_node for living_threads linkage
(rb_vm_living_threads_init): new function wrapper
(rb_vm_living_threads_insert): ditto
(rb_vm_living_threads_remove): ditto
* vm.c (rb_vm_living_threads_foreach): new function wrapper
* thread.c (terminate_i, thread_start_func_2, thread_create_core,
thread_fd_close_i, thread_fd_close): update to use new APIs
* vm.c (vm_mark_each_thread_func, rb_vm_mark, ruby_vm_destruct,
vm_memsize, vm_init2, Init_VM): ditto
* vm_trace.c (clear_trace_func_i, rb_clear_trace_func): ditto
* benchmark/bm_vm_thread_close.rb: added to show improvement
* ccan/build_assert/build_assert.h: added as a dependency of list.h
* ccan/check_type/check_type.h: ditto
* ccan/container_of/container_of.h: ditto
* ccan/licenses/BSD-MIT: ditto
* ccan/licenses/CC0: ditto
* ccan/str/str.h: ditto (stripped of unused macros)
* ccan/list/list.h: ditto
* common.mk: add CCAN_LIST_INCLUDES
[ruby-core:61871][Feature 9632 (part 1)]
Apologies for the size of this commit, but I think a good
doubly-linked list will be useful for future features, too.
This may be used to add ordering to a container_of-based hash
table to preserve compatibility if required (e.g. feature 9614).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-11 03:48:51 +04:00
|
|
|
rb_vm_living_threads_init(vm);
|
2008-06-09 08:20:07 +04:00
|
|
|
vm->src_encoding_index = -1;
|
2010-12-02 14:06:32 +03:00
|
|
|
vm->at_exit.basic.flags = (T_ARRAY | RARRAY_EMBED_FLAG) & ~RARRAY_EMBED_LEN_MASK; /* len set 0 */
|
* include/ruby/ruby.h: constify RBasic::klass and add
RBASIC_CLASS(obj) macro which returns a class of `obj'.
This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
* object.c: add new function rb_obj_reveal().
This function reveal interal (hidden) object by rb_obj_hide().
Note that do not change class before and after hiding.
Only permitted example is:
klass = RBASIC_CLASS(obj);
rb_obj_hide(obj);
....
rb_obj_reveal(obj, klass);
TODO: API design. rb_obj_reveal() should be replaced with others.
TODO: modify constified variables using cast may be harmful for
compiler's analysis and optimizaton.
Any idea to prohibt inserting RBasic::klass directly?
If rename RBasic::klass and force to use RBASIC_CLASS(obj),
then all codes such as `RBASIC(obj)->klass' will be
compilation error. Is it acceptable? (We have similar
experience at Ruby 1.9,
for example "RARRAY(ary)->ptr" to "RARRAY_PTR(ary)".
* internal.h: add some macros.
* RBASIC_CLEAR_CLASS(obj) clear RBasic::klass to make it internal
object.
* RBASIC_SET_CLASS(obj, cls) set RBasic::klass.
* RBASIC_SET_CLASS_RAW(obj, cls) same as RBASIC_SET_CLASS
without write barrier (planned).
* RCLASS_SET_SUPER(a, b) set super class of a.
* array.c, class.c, compile.c, encoding.c, enum.c, error.c, eval.c,
file.c, gc.c, hash.c, io.c, iseq.c, marshal.c, object.c,
parse.y, proc.c, process.c, random.c, ruby.c, sprintf.c,
string.c, thread.c, transcode.c, vm.c, vm_eval.c, win32/file.c:
Use above macros and functions to access RBasic::klass.
* ext/coverage/coverage.c, ext/readline/readline.c,
ext/socket/ancdata.c, ext/socket/init.c,
* ext/zlib/zlib.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-13 14:49:11 +04:00
|
|
|
rb_obj_hide((VALUE)&vm->at_exit);
|
2012-12-20 02:29:18 +04:00
|
|
|
|
|
|
|
vm_default_params_setup(vm);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Thread */
|
|
|
|
|
2007-11-21 12:06:06 +03:00
|
|
|
#define USE_THREAD_DATA_RECYCLE 1
|
|
|
|
|
|
|
|
#if USE_THREAD_DATA_RECYCLE
|
|
|
|
#define RECYCLE_MAX 64
|
2008-09-04 21:58:53 +04:00
|
|
|
static VALUE *thread_recycle_stack_slot[RECYCLE_MAX];
|
|
|
|
static int thread_recycle_stack_count = 0;
|
2007-11-21 12:06:06 +03:00
|
|
|
|
|
|
|
static VALUE *
|
2009-05-17 08:15:33 +04:00
|
|
|
thread_recycle_stack(size_t size)
|
2007-11-21 12:06:06 +03:00
|
|
|
{
|
|
|
|
if (thread_recycle_stack_count) {
|
2012-12-20 02:29:18 +04:00
|
|
|
/* TODO: check stack size if stack sizes are variable */
|
2007-11-21 12:06:06 +03:00
|
|
|
return thread_recycle_stack_slot[--thread_recycle_stack_count];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return ALLOC_N(VALUE, size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
#define thread_recycle_stack(size) ALLOC_N(VALUE, (size))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_recycle_stack_release(VALUE *stack)
|
2007-11-21 12:06:06 +03:00
|
|
|
{
|
|
|
|
#if USE_THREAD_DATA_RECYCLE
|
|
|
|
if (thread_recycle_stack_count < RECYCLE_MAX) {
|
|
|
|
thread_recycle_stack_slot[thread_recycle_stack_count++] = stack;
|
2008-06-09 06:58:23 +04:00
|
|
|
return;
|
2007-11-21 12:06:06 +03:00
|
|
|
}
|
|
|
|
#endif
|
2008-06-09 06:58:23 +04:00
|
|
|
ruby_xfree(stack);
|
2007-11-21 12:06:06 +03:00
|
|
|
}
|
|
|
|
|
2014-10-16 02:35:08 +04:00
|
|
|
void rb_fiber_mark_self(rb_fiber_t *fib);
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
void
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_mark(void *ptr)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
rb_thread_t *th = NULL;
|
|
|
|
RUBY_MARK_ENTER("thread");
|
|
|
|
if (ptr) {
|
|
|
|
th = ptr;
|
|
|
|
if (th->stack) {
|
|
|
|
VALUE *p = th->stack;
|
2007-12-09 08:56:00 +03:00
|
|
|
VALUE *sp = th->cfp->sp;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_control_frame_t *cfp = th->cfp;
|
2007-12-09 08:56:00 +03:00
|
|
|
rb_control_frame_t *limit_cfp = (void *)(th->stack + th->stack_size);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2014-09-11 15:23:16 +04:00
|
|
|
rb_gc_mark_values((long)(sp - p), p);
|
|
|
|
rb_gc_mark_locations(sp, sp + th->mark_stack_len);
|
2007-12-09 08:56:00 +03:00
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
while (cfp != limit_cfp) {
|
2010-07-26 08:01:38 +04:00
|
|
|
rb_iseq_t *iseq = cfp->iseq;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_gc_mark(cfp->proc);
|
2010-11-23 12:54:07 +03:00
|
|
|
rb_gc_mark(cfp->self);
|
* revised r37993 to avoid SEGV/ILL in tests. In r37993, a method
entry with VM_METHOD_TYPE_REFINED holds only the original method
definition, so ci->me is set to a method entry allocated in the
stack, and it causes SEGV/ILL. In this commit, a method entry
with VM_METHOD_TYPE_REFINED holds the whole original method entry.
Furthermore, rb_thread_mark() is changed to mark cfp->klass to
avoid GC for iclasses created by copy_refinement_iclass().
* vm_method.c (rb_method_entry_make): add a method entry with
VM_METHOD_TYPE_REFINED to the class refined by the refinement if
the target module is a refinement. When a method entry with
VM_METHOD_TYPE_UNDEF is invoked by vm_call_method(), a method with
the same name is searched in refinements. If such a method is
found, the method is invoked. Otherwise, the original method in
the refined class (rb_method_definition_t::body.orig_me) is
invoked. This change is made to simplify the normal method lookup
and to improve the performance of normal method calls.
* vm_method.c (EXPR1, search_method, rb_method_entry),
vm_eval.c (rb_call0, rb_search_method_entry): do not use
refinements for method lookup.
* vm_insnhelper.c (vm_call_method): search methods in refinements if
ci->me is VM_METHOD_TYPE_REFINED. If the method is called by
super (i.e., ci->call == vm_call_super_method), skip the same
method entry as the current method to avoid infinite call of the
same method.
* class.c (include_modules_at): add a refined method entry for each
method defined in a module included in a refinement.
* class.c (rb_prepend_module): set an empty table to
RCLASS_M_TBL(klass) to add refined method entries, because
refinements should have priority over prepended modules.
* proc.c (mnew): use rb_method_entry_with_refinements() to get
a refined method.
* vm.c (rb_thread_mark): mark cfp->klass for iclasses created by
copy_refinement_iclass().
* vm.c (Init_VM), cont.c (fiber_init): initialize th->cfp->klass.
* test/ruby/test_refinement.rb (test_inline_method_cache): do not skip
the test because it should pass successfully.
* test/ruby/test_refinement.rb (test_redefine_refined_method): new
test for the case a refined method is redefined.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-06 17:08:41 +04:00
|
|
|
rb_gc_mark(cfp->klass);
|
2010-07-26 08:01:38 +04:00
|
|
|
if (iseq) {
|
|
|
|
rb_gc_mark(RUBY_VM_NORMAL_ISEQ_P(iseq) ? iseq->self : (VALUE)iseq);
|
|
|
|
}
|
2013-02-16 11:41:55 +04:00
|
|
|
if (cfp->me) {
|
2014-08-15 01:10:06 +04:00
|
|
|
/* bitmap marking `me' does not seem worth the trouble:
|
|
|
|
* [ruby-core:64340] [ruby-core:64341] */
|
2013-02-16 11:41:55 +04:00
|
|
|
((rb_method_entry_t *)cfp->me)->mark = 1;
|
|
|
|
rb_mark_method_entry(cfp->me);
|
|
|
|
}
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* mark ruby objects */
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->first_proc);
|
2007-08-20 18:17:16 +04:00
|
|
|
if (th->first_proc) RUBY_MARK_UNLESS_NULL(th->first_args);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->thgroup);
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->value);
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->errinfo);
|
2012-12-23 14:18:58 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->pending_interrupt_queue);
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->pending_interrupt_mask_stack);
|
2012-06-11 07:14:59 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->root_svar);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->top_self);
|
|
|
|
RUBY_MARK_UNLESS_NULL(th->top_wrapper);
|
2014-10-16 02:35:08 +04:00
|
|
|
rb_fiber_mark_self(th->fiber);
|
|
|
|
rb_fiber_mark_self(th->root_fiber);
|
2008-05-08 08:19:20 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->stat_insn_usage);
|
2008-07-10 07:10:00 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->last_status);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2008-06-12 17:01:38 +04:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->locking_mutex);
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_mark_tbl(th->local_storage);
|
2014-11-27 04:56:38 +03:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->local_storage_recursive_hash);
|
2014-12-10 22:35:07 +03:00
|
|
|
RUBY_MARK_UNLESS_NULL(th->local_storage_recursive_hash_for_trace);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2014-01-28 10:09:58 +04:00
|
|
|
if (GET_THREAD() != th && th->machine.stack_start && th->machine.stack_end) {
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_gc_mark_machine_stack(th);
|
2014-01-28 10:09:58 +04:00
|
|
|
rb_gc_mark_locations((VALUE *)&th->machine.regs,
|
|
|
|
(VALUE *)(&th->machine.regs) +
|
|
|
|
sizeof(th->machine.regs) / sizeof(VALUE));
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
2013-03-06 10:30:03 +04:00
|
|
|
rb_vm_trace_mark_event_hooks(&th->event_hooks);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
RUBY_MARK_LEAVE("thread");
|
|
|
|
}
|
|
|
|
|
2009-06-17 02:23:53 +04:00
|
|
|
static void
|
|
|
|
thread_free(void *ptr)
|
|
|
|
{
|
|
|
|
rb_thread_t *th;
|
|
|
|
RUBY_FREE_ENTER("thread");
|
|
|
|
|
|
|
|
if (ptr) {
|
|
|
|
th = ptr;
|
|
|
|
|
|
|
|
if (!th->root_fiber) {
|
|
|
|
RUBY_FREE_UNLESS_NULL(th->stack);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (th->locking_mutex != Qfalse) {
|
2010-10-13 18:07:22 +04:00
|
|
|
rb_bug("thread_free: locking_mutex must be NULL (%p:%p)", (void *)th, (void *)th->locking_mutex);
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
if (th->keeping_mutexes != NULL) {
|
2010-06-18 05:44:52 +04:00
|
|
|
rb_bug("thread_free: keeping_mutexes must be NULL (%p:%p)", (void *)th, (void *)th->keeping_mutexes);
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if (th->local_storage) {
|
|
|
|
st_free_table(th->local_storage);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (th->vm && th->vm->main_thread == th) {
|
|
|
|
RUBY_GC_INFO("main thread\n");
|
|
|
|
}
|
|
|
|
else {
|
2010-07-05 19:57:20 +04:00
|
|
|
#ifdef USE_SIGALTSTACK
|
|
|
|
if (th->altstack) {
|
2011-08-02 17:08:45 +04:00
|
|
|
free(th->altstack);
|
2010-07-05 19:57:20 +04:00
|
|
|
}
|
|
|
|
#endif
|
2012-01-10 07:49:10 +04:00
|
|
|
ruby_xfree(ptr);
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
2011-01-12 13:35:36 +03:00
|
|
|
if (ruby_current_thread == th)
|
|
|
|
ruby_current_thread = NULL;
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
RUBY_FREE_LEAVE("thread");
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t
|
2009-09-09 06:11:35 +04:00
|
|
|
thread_memsize(const void *ptr)
|
2009-06-17 02:23:53 +04:00
|
|
|
{
|
|
|
|
if (ptr) {
|
2009-09-09 06:11:35 +04:00
|
|
|
const rb_thread_t *th = ptr;
|
2009-06-17 02:23:53 +04:00
|
|
|
size_t size = sizeof(rb_thread_t);
|
|
|
|
|
|
|
|
if (!th->root_fiber) {
|
|
|
|
size += th->stack_size * sizeof(VALUE);
|
|
|
|
}
|
|
|
|
if (th->local_storage) {
|
2011-06-11 09:21:30 +04:00
|
|
|
size += st_memsize(th->local_storage);
|
2009-06-17 02:23:53 +04:00
|
|
|
}
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-16 13:56:56 +04:00
|
|
|
#define thread_data_type ruby_threadptr_data_type
|
|
|
|
const rb_data_type_t ruby_threadptr_data_type = {
|
2009-06-17 02:23:53 +04:00
|
|
|
"VM/thread",
|
2010-07-18 11:31:54 +04:00
|
|
|
{
|
|
|
|
rb_thread_mark,
|
|
|
|
thread_free,
|
|
|
|
thread_memsize,
|
|
|
|
},
|
2014-12-01 09:38:04 +03:00
|
|
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
2009-06-17 02:23:53 +04:00
|
|
|
};
|
|
|
|
|
2011-06-09 18:45:56 +04:00
|
|
|
VALUE
|
|
|
|
rb_obj_is_thread(VALUE obj)
|
|
|
|
{
|
|
|
|
if (rb_typeddata_is_kind_of(obj, &thread_data_type)) {
|
|
|
|
return Qtrue;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return Qfalse;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
thread_alloc(VALUE klass)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
2014-09-13 01:34:25 +04:00
|
|
|
VALUE obj;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_thread_t *th;
|
2009-07-08 00:28:27 +04:00
|
|
|
obj = TypedData_Make_Struct(klass, rb_thread_t, &thread_data_type, th);
|
2014-09-05 01:05:31 +04:00
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-02-12 08:42:17 +03:00
|
|
|
th_init(rb_thread_t *th, VALUE self)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
2008-06-14 06:59:19 +04:00
|
|
|
th->self = self;
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
/* allocate thread stack */
|
2011-07-30 05:57:06 +04:00
|
|
|
#ifdef USE_SIGALTSTACK
|
2011-08-02 17:08:45 +04:00
|
|
|
/* altstack of main thread is reallocated in another place */
|
2012-12-15 18:20:12 +04:00
|
|
|
th->altstack = malloc(rb_sigaltstack_size());
|
2011-07-30 05:57:06 +04:00
|
|
|
#endif
|
2012-12-20 02:29:18 +04:00
|
|
|
/* th->stack_size is word number.
|
|
|
|
* th->vm->default_params.thread_vm_stack_size is byte size.
|
|
|
|
*/
|
|
|
|
th->stack_size = th->vm->default_params.thread_vm_stack_size / sizeof(VALUE);
|
2007-11-21 12:06:06 +03:00
|
|
|
th->stack = thread_recycle_stack(th->stack_size);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
th->cfp = (void *)(th->stack + th->stack_size);
|
|
|
|
|
* vm_core.h: remove VM_FRAME_MAGIC_FINISH (finish frame type).
Before this commit:
`finish frame' was place holder which indicates that VM loop
needs to return function.
If a C method calls a Ruby methods (a method written by Ruby),
then VM loop will be (re-)invoked. When the Ruby method returns,
then also VM loop should be escaped. `finish frame' has only
one instruction `finish', which returns VM loop function.
VM loop function executes `finish' instruction, then VM loop
function returns itself.
With such mechanism, `leave' instruction (which returns one
frame from current scope) doesn't need to check that this `leave'
should also return from VM loop function.
Strictly, one branch can be removed from `leave' instructon.
Consideration:
However, pushing the `finish frame' needs costs because
it needs several memory accesses. The number of pushing
`finish frame' is greater than I had assumed. Of course,
pushing `finish frame' consumes additional control frame.
Moreover, recent processors has good branch prediction,
with which we can ignore such trivial checking.
After this commit:
Finally, I decide to remove `finish frame' and `finish'
instruction. Some parts of VM depend on `finish frame',
so the new frame flag VM_FRAME_FLAG_FINISH is introduced.
If this frame should escape from VM function loop, then
the result of VM_FRAME_TYPE_FINISH_P(cfp) is true.
`leave' instruction checks this flag every time.
I measured performance on it. However on my environments,
it improves some benchmarks and slows some benchmarks down.
Maybe it is because of C compiler optimization parameters.
I'll re-visit here if this cause problems.
* insns.def (leave, finish): remove finish instruction.
* vm.c, vm_eval.c, vm_exec.c, vm_backtrace.c, vm_dump.c:
apply above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-15 14:22:34 +04:00
|
|
|
vm_push_frame(th, 0 /* dummy iseq */, VM_FRAME_MAGIC_TOP | VM_FRAME_FLAG_FINISH,
|
2013-08-06 12:33:05 +04:00
|
|
|
Qnil /* dummy self */, Qnil /* dummy klass */, VM_ENVVAL_BLOCK_PTR(0), 0 /* dummy pc */, th->stack, 1, 0, 0);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
th->status = THREAD_RUNNABLE;
|
|
|
|
th->errinfo = Qnil;
|
2008-07-10 07:10:00 +04:00
|
|
|
th->last_status = Qnil;
|
2011-02-12 08:42:17 +03:00
|
|
|
th->waiting_fd = -1;
|
2013-01-09 10:40:30 +04:00
|
|
|
th->root_svar = Qnil;
|
2014-11-27 04:56:38 +03:00
|
|
|
th->local_storage_recursive_hash = Qnil;
|
2014-12-10 22:35:07 +03:00
|
|
|
th->local_storage_recursive_hash_for_trace = Qnil;
|
2014-06-11 12:38:09 +04:00
|
|
|
#ifdef NON_SCALAR_THREAD_ID
|
|
|
|
th->thread_id_string[0] = '\0';
|
|
|
|
#endif
|
2012-08-07 15:13:57 +04:00
|
|
|
|
|
|
|
#if OPT_CALL_THREADED_CODE
|
|
|
|
th->retval = Qundef;
|
|
|
|
#endif
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
ruby_thread_init(VALUE self)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
rb_thread_t *th;
|
|
|
|
rb_vm_t *vm = GET_THREAD()->vm;
|
|
|
|
GetThreadPtr(self, th);
|
|
|
|
|
2012-12-20 02:29:18 +04:00
|
|
|
th->vm = vm;
|
2008-06-14 06:59:19 +04:00
|
|
|
th_init(th, self);
|
2013-05-02 11:55:50 +04:00
|
|
|
rb_ivar_set(self, rb_intern("locals"), rb_hash_new());
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
th->top_wrapper = 0;
|
|
|
|
th->top_self = rb_vm_top_self();
|
2013-01-09 10:40:30 +04:00
|
|
|
th->root_svar = Qnil;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
rb_thread_alloc(VALUE klass)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
VALUE self = thread_alloc(klass);
|
|
|
|
ruby_thread_init(self);
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2008-08-12 13:59:06 +04:00
|
|
|
static void
|
2008-08-13 08:49:37 +04:00
|
|
|
vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval,
|
2008-08-12 13:59:06 +04:00
|
|
|
rb_num_t is_singleton, NODE *cref)
|
|
|
|
{
|
|
|
|
VALUE klass = cref->nd_clss;
|
2009-05-17 08:15:33 +04:00
|
|
|
int noex = (int)cref->nd_visi;
|
2008-08-13 08:49:37 +04:00
|
|
|
rb_iseq_t *miseq;
|
|
|
|
GetISeqPtr(iseqval, miseq);
|
2008-08-12 13:59:06 +04:00
|
|
|
|
2010-08-21 14:00:55 +04:00
|
|
|
if (miseq->klass) {
|
2011-12-18 13:58:31 +04:00
|
|
|
RB_GC_GUARD(iseqval) = rb_iseq_clone(iseqval, 0);
|
2010-12-30 17:17:32 +03:00
|
|
|
GetISeqPtr(iseqval, miseq);
|
2010-08-21 14:00:55 +04:00
|
|
|
}
|
|
|
|
|
2008-08-12 13:59:06 +04:00
|
|
|
if (NIL_P(klass)) {
|
|
|
|
rb_raise(rb_eTypeError, "no class/module to add method");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_singleton) {
|
2012-10-27 23:47:58 +04:00
|
|
|
klass = rb_singleton_class(obj); /* class and frozen checked in this API */
|
2008-08-12 13:59:06 +04:00
|
|
|
noex = NOEX_PUBLIC;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* dup */
|
|
|
|
COPY_CREF(miseq->cref_stack, cref);
|
2010-10-24 09:11:26 +04:00
|
|
|
miseq->cref_stack->nd_visi = NOEX_PUBLIC;
|
* include/ruby/ruby.h: rename OBJ_WRITE and OBJ_WRITTEN into
RB_OBJ_WRITE and RB_OBJ_WRITTEN.
* array.c, class.c, compile.c, hash.c, internal.h, iseq.c,
proc.c, process.c, re.c, string.c, variable.c, vm.c,
vm_eval.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: catch up this change.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-12-20 12:07:47 +04:00
|
|
|
RB_OBJ_WRITE(miseq->self, &miseq->klass, klass);
|
2008-08-12 13:59:06 +04:00
|
|
|
miseq->defined_method_id = id;
|
2009-07-15 18:59:41 +04:00
|
|
|
rb_add_method(klass, id, VM_METHOD_TYPE_ISEQ, miseq, noex);
|
2008-08-12 13:59:06 +04:00
|
|
|
|
|
|
|
if (!is_singleton && noex == NOEX_MODFUNC) {
|
* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: Implement class hierarchy method cache invalidation.
[ruby-core:55053] [Feature #8426] [GH-387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 09:25:06 +04:00
|
|
|
klass = rb_singleton_class(klass);
|
|
|
|
rb_add_method(klass, id, VM_METHOD_TYPE_ISEQ, miseq, NOEX_PUBLIC);
|
2008-08-12 13:59:06 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-13 08:49:37 +04:00
|
|
|
#define REWIND_CFP(expr) do { \
|
|
|
|
rb_thread_t *th__ = GET_THREAD(); \
|
2008-08-14 09:55:04 +04:00
|
|
|
th__->cfp++; expr; th__->cfp--; \
|
2008-08-13 08:49:37 +04:00
|
|
|
} while (0)
|
|
|
|
|
2008-07-01 07:05:58 +04:00
|
|
|
static VALUE
|
|
|
|
m_core_define_method(VALUE self, VALUE cbase, VALUE sym, VALUE iseqval)
|
|
|
|
{
|
2008-08-13 08:49:37 +04:00
|
|
|
REWIND_CFP({
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
vm_define_method(GET_THREAD(), cbase, SYM2ID(sym), iseqval, 0, rb_vm_cref());
|
2008-08-13 08:49:37 +04:00
|
|
|
});
|
2013-08-02 18:58:11 +04:00
|
|
|
return sym;
|
2008-07-01 07:05:58 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
m_core_define_singleton_method(VALUE self, VALUE cbase, VALUE sym, VALUE iseqval)
|
|
|
|
{
|
2008-08-13 08:49:37 +04:00
|
|
|
REWIND_CFP({
|
* vm.c: add a prefix "rb_" to exposed functions
vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(),
vm_stack_to_heap(), vm_make_proc(), vm_invoke_proc(),
vm_get_sourceline(), vm_cref(), vm_localjump_error(),
vm_make_jump_tag_but_local_jump(), vm_jump_tag_but_local_jump().
This changes may affect only core because most of renamed functions
require a pointer of not-exposed struct such as rb_thread_t or NODE.
In short, they are core functions.
* cont.c, eval.c, eval_intern.h, load.c, proc.c, thread.c,
vm_core.h, vm_dump.c, vm_eval.c, vm_exec.c, vm_insnhelper.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21659 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-01-19 05:38:11 +03:00
|
|
|
vm_define_method(GET_THREAD(), cbase, SYM2ID(sym), iseqval, 1, rb_vm_cref());
|
2008-08-13 08:49:37 +04:00
|
|
|
});
|
2013-08-02 18:58:11 +04:00
|
|
|
return sym;
|
2008-07-01 07:05:58 +04:00
|
|
|
}
|
|
|
|
|
2008-07-01 16:19:00 +04:00
|
|
|
static VALUE
|
2008-08-13 08:49:37 +04:00
|
|
|
m_core_set_method_alias(VALUE self, VALUE cbase, VALUE sym1, VALUE sym2)
|
2008-07-01 16:19:00 +04:00
|
|
|
{
|
2008-08-13 08:49:37 +04:00
|
|
|
REWIND_CFP({
|
|
|
|
rb_alias(cbase, SYM2ID(sym1), SYM2ID(sym2));
|
|
|
|
});
|
|
|
|
return Qnil;
|
|
|
|
}
|
2008-07-01 16:19:00 +04:00
|
|
|
|
2008-08-13 08:49:37 +04:00
|
|
|
static VALUE
|
|
|
|
m_core_set_variable_alias(VALUE self, VALUE sym1, VALUE sym2)
|
|
|
|
{
|
|
|
|
REWIND_CFP({
|
|
|
|
rb_alias_variable(SYM2ID(sym1), SYM2ID(sym2));
|
|
|
|
});
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
m_core_undef_method(VALUE self, VALUE cbase, VALUE sym)
|
|
|
|
{
|
|
|
|
REWIND_CFP({
|
|
|
|
rb_undef(cbase, SYM2ID(sym));
|
* insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
ruby_vm_global_state_version into two separate counters - one for the
global method state and one for the global constant state. This means
changes to constants do not affect method caches, and changes to
methods do not affect constant caches. In particular, this means
inclusions of modules containing constants no longer globally
invalidate the method cache.
* class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
rename rb_clear_cache_by_class to rb_clear_method_cache_by_class
* class.c, include/ruby/intern.h, variable.c, vm_method.c: add
rb_clear_constant_cache
* compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
rb_call_info_struct to method_state
* vm_method.c: rename vmstat field in struct cache_entry to method_state
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-29 04:52:38 +04:00
|
|
|
rb_clear_method_cache_by_class(self);
|
2008-08-13 08:49:37 +04:00
|
|
|
});
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
2013-08-22 10:50:42 +04:00
|
|
|
m_core_set_postexe(VALUE self)
|
2008-08-13 08:49:37 +04:00
|
|
|
{
|
2013-08-22 10:50:42 +04:00
|
|
|
rb_set_end_proc(rb_call_end_proc, rb_block_proc());
|
2008-07-01 16:19:00 +04:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
2014-05-21 10:11:25 +04:00
|
|
|
static VALUE core_hash_merge_ary(VALUE hash, VALUE ary);
|
|
|
|
static VALUE core_hash_from_ary(VALUE ary);
|
|
|
|
static VALUE core_hash_merge_kwd(int argc, VALUE *argv);
|
2014-03-24 19:28:30 +04:00
|
|
|
|
2014-03-24 19:28:31 +04:00
|
|
|
static VALUE
|
|
|
|
core_hash_merge(VALUE hash, long argc, const VALUE *argv)
|
|
|
|
{
|
|
|
|
long i;
|
|
|
|
|
|
|
|
assert(argc % 2 == 0);
|
|
|
|
for (i=0; i<argc; i+=2) {
|
|
|
|
rb_hash_aset(hash, argv[i], argv[i+1]);
|
|
|
|
}
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2012-04-12 05:33:34 +04:00
|
|
|
static VALUE
|
|
|
|
m_core_hash_from_ary(VALUE self, VALUE ary)
|
2014-05-21 10:11:25 +04:00
|
|
|
{
|
|
|
|
VALUE hash;
|
|
|
|
REWIND_CFP(hash = core_hash_from_ary(ary));
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
core_hash_from_ary(VALUE ary)
|
2012-04-12 05:33:34 +04:00
|
|
|
{
|
|
|
|
VALUE hash = rb_hash_new();
|
|
|
|
|
2012-12-01 19:25:28 +04:00
|
|
|
if (RUBY_DTRACE_HASH_CREATE_ENABLED()) {
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
RUBY_DTRACE_HASH_CREATE(RARRAY_LEN(ary), rb_sourcefile(), rb_sourceline());
|
|
|
|
}
|
|
|
|
|
2014-05-21 10:11:25 +04:00
|
|
|
return core_hash_merge_ary(hash, ary);
|
2012-04-12 05:33:34 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
m_core_hash_merge_ary(VALUE self, VALUE hash, VALUE ary)
|
2014-05-21 10:11:25 +04:00
|
|
|
{
|
|
|
|
REWIND_CFP(core_hash_merge_ary(hash, ary));
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
core_hash_merge_ary(VALUE hash, VALUE ary)
|
2012-04-12 05:33:34 +04:00
|
|
|
{
|
2014-03-24 19:28:31 +04:00
|
|
|
core_hash_merge(hash, RARRAY_LEN(ary), RARRAY_CONST_PTR(ary));
|
2012-04-12 05:33:34 +04:00
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
m_core_hash_merge_ptr(int argc, VALUE *argv, VALUE recv)
|
|
|
|
{
|
|
|
|
VALUE hash = argv[0];
|
|
|
|
|
2014-05-21 10:11:25 +04:00
|
|
|
REWIND_CFP(core_hash_merge(hash, argc-1, argv+1));
|
2012-04-12 05:33:34 +04:00
|
|
|
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2012-04-29 01:12:05 +04:00
|
|
|
static int
|
|
|
|
kwmerge_i(VALUE key, VALUE value, VALUE hash)
|
|
|
|
{
|
|
|
|
if (!SYMBOL_P(key)) Check_Type(key, T_SYMBOL);
|
2014-10-11 08:46:56 +04:00
|
|
|
rb_hash_aset(hash, key, value);
|
2012-04-29 01:12:05 +04:00
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2013-10-13 07:16:54 +04:00
|
|
|
static int
|
|
|
|
kwcheck_i(VALUE key, VALUE value, VALUE hash)
|
|
|
|
{
|
|
|
|
if (!SYMBOL_P(key)) Check_Type(key, T_SYMBOL);
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2012-04-29 01:12:05 +04:00
|
|
|
static VALUE
|
2013-10-13 07:16:54 +04:00
|
|
|
m_core_hash_merge_kwd(int argc, VALUE *argv, VALUE recv)
|
2014-05-21 10:11:25 +04:00
|
|
|
{
|
|
|
|
VALUE hash;
|
|
|
|
REWIND_CFP(hash = core_hash_merge_kwd(argc, argv));
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
core_hash_merge_kwd(int argc, VALUE *argv)
|
2012-04-29 01:12:05 +04:00
|
|
|
{
|
2013-10-13 07:16:54 +04:00
|
|
|
VALUE hash, kw;
|
|
|
|
rb_check_arity(argc, 1, 2);
|
|
|
|
hash = argv[0];
|
|
|
|
kw = argv[argc-1];
|
2012-04-29 01:12:05 +04:00
|
|
|
kw = rb_convert_type(kw, T_HASH, "Hash", "to_hash");
|
2014-06-03 23:08:40 +04:00
|
|
|
if (argc < 2) hash = kw;
|
2013-10-13 07:16:54 +04:00
|
|
|
rb_hash_foreach(kw, argc < 2 ? kwcheck_i : kwmerge_i, hash);
|
2012-04-29 01:12:05 +04:00
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
extern VALUE *rb_gc_stack_start;
|
2007-12-15 07:09:24 +03:00
|
|
|
extern size_t rb_gc_stack_maxsize;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
#ifdef __ia64
|
|
|
|
extern VALUE *rb_gc_register_stack_start;
|
|
|
|
#endif
|
|
|
|
|
2008-05-22 08:28:13 +04:00
|
|
|
/* debug functions */
|
|
|
|
|
2009-09-08 02:32:31 +04:00
|
|
|
/* :nodoc: */
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
static VALUE
|
|
|
|
sdr(void)
|
|
|
|
{
|
2014-05-25 07:46:55 +04:00
|
|
|
rb_vm_bugreport(NULL);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
2009-09-08 02:32:31 +04:00
|
|
|
/* :nodoc: */
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
static VALUE
|
|
|
|
nsdr(void)
|
|
|
|
{
|
|
|
|
VALUE ary = rb_ary_new();
|
|
|
|
#if HAVE_BACKTRACE
|
|
|
|
#include <execinfo.h>
|
|
|
|
#define MAX_NATIVE_TRACE 1024
|
|
|
|
static void *trace[MAX_NATIVE_TRACE];
|
2014-01-15 01:49:45 +04:00
|
|
|
int n = (int)backtrace(trace, MAX_NATIVE_TRACE);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
char **syms = backtrace_symbols(trace, n);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (syms == 0) {
|
|
|
|
rb_memerror();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i=0; i<n; i++) {
|
|
|
|
rb_ary_push(ary, rb_str_new2(syms[i]));
|
|
|
|
}
|
* array.c, bignum.c, cont.c, dir.c, dln.c, encoding.c, enumerator.c,
enumerator.c (enumerator_allocate), eval_jump.c, file.c, hash.c,
io.c, load.c, pack.c, proc.c, random.c, re.c, ruby.c, st.c,
string.c, thread.c, thread_pthread.c, time.c, util.c, variable.c,
vm.c, gc.c:
allocated memory objects by xmalloc (ruby_xmalloc) should be
freed by xfree (ruby_xfree).
* ext/curses/curses.c, ext/dbm/dbm.c, ext/digest/digest.c,
ext/gdbm/gdbm.c, ext/json/ext/parser/parser.c,
ext/json/ext/parser/unicode.c, ext/openssl/ossl_cipher.c,
ext/openssl/ossl_hmac.c, ext/openssl/ossl_pkey_ec.c,
ext/sdbm/init.c, ext/strscan/strscan.c, ext/zlib/zlib.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-08 14:01:40 +04:00
|
|
|
free(syms); /* OK */
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
#endif
|
|
|
|
return ary;
|
|
|
|
}
|
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
|
|
|
static VALUE usage_analysis_insn_stop(VALUE self);
|
|
|
|
static VALUE usage_analysis_operand_stop(VALUE self);
|
|
|
|
static VALUE usage_analysis_register_stop(VALUE self);
|
|
|
|
#endif
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
void
|
|
|
|
Init_VM(void)
|
|
|
|
{
|
|
|
|
VALUE opts;
|
2008-08-14 09:14:01 +04:00
|
|
|
VALUE klass;
|
|
|
|
VALUE fcore;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2012-01-02 12:28:05 +04:00
|
|
|
/* ::RubyVM */
|
2008-06-29 21:26:16 +04:00
|
|
|
rb_cRubyVM = rb_define_class("RubyVM", rb_cObject);
|
|
|
|
rb_undef_alloc_func(rb_cRubyVM);
|
2009-12-21 13:12:21 +03:00
|
|
|
rb_undef_method(CLASS_OF(rb_cRubyVM), "new");
|
2013-12-09 13:12:23 +04:00
|
|
|
rb_define_singleton_method(rb_cRubyVM, "stat", vm_stat, -1);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2012-01-02 12:28:05 +04:00
|
|
|
/* FrozenCore (hidden) */
|
2008-08-15 10:30:43 +04:00
|
|
|
fcore = rb_class_new(rb_cBasicObject);
|
2008-08-14 09:14:01 +04:00
|
|
|
RBASIC(fcore)->flags = T_ICLASS;
|
|
|
|
klass = rb_singleton_class(fcore);
|
|
|
|
rb_define_method_id(klass, id_core_set_method_alias, m_core_set_method_alias, 3);
|
|
|
|
rb_define_method_id(klass, id_core_set_variable_alias, m_core_set_variable_alias, 2);
|
|
|
|
rb_define_method_id(klass, id_core_undef_method, m_core_undef_method, 2);
|
|
|
|
rb_define_method_id(klass, id_core_define_method, m_core_define_method, 3);
|
|
|
|
rb_define_method_id(klass, id_core_define_singleton_method, m_core_define_singleton_method, 3);
|
2013-08-22 10:50:42 +04:00
|
|
|
rb_define_method_id(klass, id_core_set_postexe, m_core_set_postexe, 0);
|
2012-04-12 05:33:34 +04:00
|
|
|
rb_define_method_id(klass, id_core_hash_from_ary, m_core_hash_from_ary, 1);
|
|
|
|
rb_define_method_id(klass, id_core_hash_merge_ary, m_core_hash_merge_ary, 2);
|
|
|
|
rb_define_method_id(klass, id_core_hash_merge_ptr, m_core_hash_merge_ptr, -1);
|
2013-10-13 07:16:54 +04:00
|
|
|
rb_define_method_id(klass, id_core_hash_merge_kwd, m_core_hash_merge_kwd, -1);
|
2013-05-01 06:38:44 +04:00
|
|
|
rb_define_method_id(klass, idProc, rb_block_proc, 0);
|
|
|
|
rb_define_method_id(klass, idLambda, rb_block_lambda, 0);
|
2008-08-14 09:14:01 +04:00
|
|
|
rb_obj_freeze(fcore);
|
2013-10-10 06:11:37 +04:00
|
|
|
RBASIC_CLEAR_CLASS(klass);
|
|
|
|
RCLASS_SET_SUPER(klass, 0);
|
|
|
|
rb_obj_freeze(klass);
|
* gc.c, include/ruby/ruby.h: rename rb_register_mark_object()
to rb_gc_register_mark_object().
* eval.c, vm.c: initialize vm->mark_object_ary at
Init_top_self().
* bignum.c, complex.c, encoding.c, ext/win32ole/win32ole.c,
io.c, load.c, marshal.c, rational.c, ruby.c, vm.c:
use rb_gc_register_mark_object() instead of
rb_global_variable() or rb_gc_register_address().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-15 18:59:14 +04:00
|
|
|
rb_gc_register_mark_object(fcore);
|
2008-08-14 09:14:01 +04:00
|
|
|
rb_mRubyVMFrozenCore = fcore;
|
2008-07-01 07:05:58 +04:00
|
|
|
|
2012-01-02 12:28:05 +04:00
|
|
|
/* ::RubyVM::Env */
|
2008-06-29 21:26:16 +04:00
|
|
|
rb_cEnv = rb_define_class_under(rb_cRubyVM, "Env", rb_cObject);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_undef_alloc_func(rb_cEnv);
|
2009-12-21 13:12:21 +03:00
|
|
|
rb_undef_method(CLASS_OF(rb_cEnv), "new");
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2013-02-27 08:02:06 +04:00
|
|
|
/*
|
|
|
|
* Document-class: Thread
|
|
|
|
*
|
|
|
|
* Threads are the Ruby implementation for a concurrent programming model.
|
|
|
|
*
|
|
|
|
* Programs that require multiple threads of execution are a perfect
|
|
|
|
* candidate for Ruby's Thread class.
|
|
|
|
*
|
|
|
|
* For example, we can create a new thread separate from the main thread's
|
|
|
|
* execution using ::new.
|
|
|
|
*
|
|
|
|
* thr = Thread.new { puts "Whats the big deal" }
|
|
|
|
*
|
|
|
|
* Then we are able to pause the execution of the main thread and allow
|
|
|
|
* our new thread to finish, using #join:
|
|
|
|
*
|
|
|
|
* thr.join #=> "Whats the big deal"
|
|
|
|
*
|
|
|
|
* If we don't call +thr.join+ before the main thread terminates, then all
|
|
|
|
* other threads including +thr+ will be killed.
|
|
|
|
*
|
|
|
|
* Alternatively, you can use an array for handling multiple threads at
|
|
|
|
* once, like in the following example:
|
|
|
|
*
|
|
|
|
* threads = []
|
|
|
|
* threads << Thread.new { puts "Whats the big deal" }
|
|
|
|
* threads << Thread.new { 3.times { puts "Threads are fun!" } }
|
|
|
|
*
|
|
|
|
* After creating a few threads we wait for them all to finish
|
|
|
|
* consecutively.
|
|
|
|
*
|
|
|
|
* threads.each { |thr| thr.join }
|
|
|
|
*
|
|
|
|
* === Thread initialization
|
|
|
|
*
|
|
|
|
* In order to create new threads, Ruby provides ::new, ::start, and
|
|
|
|
* ::fork. A block must be provided with each of these methods, otherwise
|
|
|
|
* a ThreadError will be raised.
|
|
|
|
*
|
|
|
|
* When subclassing the Thread class, the +initialize+ method of your
|
|
|
|
* subclass will be ignored by ::start and ::fork. Otherwise, be sure to
|
|
|
|
* call super in your +initialize+ method.
|
|
|
|
*
|
|
|
|
* === Thread termination
|
|
|
|
*
|
|
|
|
* For terminating threads, Ruby provides a variety of ways to do this.
|
|
|
|
*
|
|
|
|
* The class method ::kill, is meant to exit a given thread:
|
|
|
|
*
|
|
|
|
* thr = Thread.new { ... }
|
|
|
|
* Thread.kill(thr) # sends exit() to thr
|
|
|
|
*
|
2013-02-27 14:54:11 +04:00
|
|
|
* Alternatively, you can use the instance method #exit, or any of its
|
2013-02-27 08:02:06 +04:00
|
|
|
* aliases #kill or #terminate.
|
|
|
|
*
|
|
|
|
* thr.exit
|
|
|
|
*
|
|
|
|
* === Thread status
|
|
|
|
*
|
|
|
|
* Ruby provides a few instance methods for querying the state of a given
|
2013-02-27 14:54:11 +04:00
|
|
|
* thread. To get a string with the current thread's state use #status
|
2013-02-27 08:02:06 +04:00
|
|
|
*
|
|
|
|
* thr = Thread.new { sleep }
|
|
|
|
* thr.status # => "sleep"
|
|
|
|
* thr.exit
|
2013-02-27 21:43:25 +04:00
|
|
|
* thr.status # => false
|
2013-02-27 08:02:06 +04:00
|
|
|
*
|
|
|
|
* You can also use #alive? to tell if the thread is running or sleeping,
|
|
|
|
* and #stop? if the thread is dead or sleeping.
|
|
|
|
*
|
|
|
|
* === Thread variables and scope
|
|
|
|
*
|
|
|
|
* Since threads are created with blocks, the same rules apply to other
|
|
|
|
* Ruby blocks for variable scope. Any local variables created within this
|
|
|
|
* block are accessible to only this thread.
|
|
|
|
*
|
|
|
|
* ==== Fiber-local vs. Thread-local
|
|
|
|
*
|
2013-02-27 14:54:11 +04:00
|
|
|
* Each fiber has its own bucket for Thread#[] storage. When you set a
|
2013-02-27 08:02:06 +04:00
|
|
|
* new fiber-local it is only accessible within this Fiber. To illustrate:
|
|
|
|
*
|
|
|
|
* Thread.new {
|
|
|
|
* Thread.current[:foo] = "bar"
|
|
|
|
* Fiber.new {
|
|
|
|
* p Thread.current[:foo] # => nil
|
|
|
|
* }.resume
|
|
|
|
* }.join
|
|
|
|
*
|
2013-02-27 08:22:08 +04:00
|
|
|
* This example uses #[] for getting and #[]= for setting fiber-locals,
|
2013-02-27 08:02:06 +04:00
|
|
|
* you can also use #keys to list the fiber-locals for a given
|
|
|
|
* thread and #key? to check if a fiber-local exists.
|
|
|
|
*
|
|
|
|
* When it comes to thread-locals, they are accessible within the entire
|
|
|
|
* scope of the thread. Given the following example:
|
|
|
|
*
|
|
|
|
* Thread.new{
|
|
|
|
* Thread.current.thread_variable_set(:foo, 1)
|
|
|
|
* p Thread.current.thread_variable_get(:foo) # => 1
|
|
|
|
* Fiber.new{
|
|
|
|
* Thread.current.thread_variable_set(:foo, 2)
|
|
|
|
* p Thread.current.thread_variable_get(:foo) # => 2
|
|
|
|
* }.resume
|
|
|
|
* p Thread.current.thread_variable_get(:foo) # => 2
|
|
|
|
* }.join
|
|
|
|
*
|
|
|
|
* You can see that the thread-local +:foo+ carried over into the fiber
|
|
|
|
* and was changed to +2+ by the end of the thread.
|
|
|
|
*
|
|
|
|
* This example makes use of #thread_variable_set to create new
|
|
|
|
* thread-locals, and #thread_variable_get to reference them.
|
|
|
|
*
|
|
|
|
* There is also #thread_variables to list all thread-locals, and
|
|
|
|
* #thread_variable? to check if a given thread-local exists.
|
|
|
|
*
|
|
|
|
* === Exception handling
|
|
|
|
*
|
|
|
|
* Any thread can raise an exception using the #raise instance method,
|
|
|
|
* which operates similarly to Kernel#raise.
|
|
|
|
*
|
|
|
|
* However, it's important to note that an exception that occurs in any
|
|
|
|
* thread except the main thread depends on #abort_on_exception. This
|
|
|
|
* option is +false+ by default, meaning that any unhandled exception will
|
|
|
|
* cause the thread to terminate silently when waited on by either #join
|
|
|
|
* or #value. You can change this default by either #abort_on_exception=
|
|
|
|
* +true+ or setting $DEBUG to +true+.
|
|
|
|
*
|
|
|
|
* With the addition of the class method ::handle_interrupt, you can now
|
|
|
|
* handle exceptions asynchronously with threads.
|
|
|
|
*
|
|
|
|
* === Scheduling
|
|
|
|
*
|
|
|
|
* Ruby provides a few ways to support scheduling threads in your program.
|
|
|
|
*
|
|
|
|
* The first way is by using the class method ::stop, to put the current
|
|
|
|
* running thread to sleep and schedule the execution of another thread.
|
|
|
|
*
|
|
|
|
* Once a thread is asleep, you can use the instance method #wakeup to
|
|
|
|
* mark your thread as eligible for scheduling.
|
|
|
|
*
|
|
|
|
* You can also try ::pass, which attempts to pass execution to another
|
|
|
|
* thread but is dependent on the OS whether a running thread will switch
|
2013-02-27 14:54:11 +04:00
|
|
|
* or not. The same goes for #priority, which lets you hint to the thread
|
2013-02-27 08:02:06 +04:00
|
|
|
* scheduler which threads you want to take precedence when passing
|
|
|
|
* execution. This method is also dependent on the OS and may be ignored
|
|
|
|
* on some platforms.
|
|
|
|
*
|
|
|
|
*/
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
rb_cThread = rb_define_class("Thread", rb_cObject);
|
|
|
|
rb_undef_alloc_func(rb_cThread);
|
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
2012-01-02 12:28:05 +04:00
|
|
|
/* ::RubyVM::USAGE_ANALYSIS_* */
|
2013-06-02 07:12:04 +04:00
|
|
|
#define define_usage_analysis_hash(name) /* shut up rdoc -C */ \
|
|
|
|
rb_define_const(rb_cRubyVM, "USAGE_ANALYSIS_"#name, rb_hash_new())
|
|
|
|
define_usage_analysis_hash("INSN");
|
|
|
|
define_usage_analysis_hash("REGS");
|
|
|
|
define_usage_analysis_hash("INSN_BIGRAM");
|
2012-10-04 16:31:05 +04:00
|
|
|
|
|
|
|
rb_define_singleton_method(rb_cRubyVM, "USAGE_ANALYSIS_INSN_STOP", usage_analysis_insn_stop, 0);
|
|
|
|
rb_define_singleton_method(rb_cRubyVM, "USAGE_ANALYSIS_OPERAND_STOP", usage_analysis_operand_stop, 0);
|
|
|
|
rb_define_singleton_method(rb_cRubyVM, "USAGE_ANALYSIS_REGISTER_STOP", usage_analysis_register_stop, 0);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ::RubyVM::OPTS, which shows vm build options */
|
2008-06-29 21:26:16 +04:00
|
|
|
rb_define_const(rb_cRubyVM, "OPTS", opts = rb_ary_new());
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
#if OPT_DIRECT_THREADED_CODE
|
|
|
|
rb_ary_push(opts, rb_str_new2("direct threaded code"));
|
|
|
|
#elif OPT_TOKEN_THREADED_CODE
|
|
|
|
rb_ary_push(opts, rb_str_new2("token threaded code"));
|
|
|
|
#elif OPT_CALL_THREADED_CODE
|
|
|
|
rb_ary_push(opts, rb_str_new2("call threaded code"));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if OPT_STACK_CACHING
|
|
|
|
rb_ary_push(opts, rb_str_new2("stack caching"));
|
|
|
|
#endif
|
|
|
|
#if OPT_OPERANDS_UNIFICATION
|
2014-01-04 12:22:46 +04:00
|
|
|
rb_ary_push(opts, rb_str_new2("operands unification"));
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
#endif
|
|
|
|
#if OPT_INSTRUCTIONS_UNIFICATION
|
|
|
|
rb_ary_push(opts, rb_str_new2("instructions unification"));
|
|
|
|
#endif
|
|
|
|
#if OPT_INLINE_METHOD_CACHE
|
|
|
|
rb_ary_push(opts, rb_str_new2("inline method cache"));
|
|
|
|
#endif
|
|
|
|
#if OPT_BLOCKINLINING
|
|
|
|
rb_ary_push(opts, rb_str_new2("block inlining"));
|
|
|
|
#endif
|
|
|
|
|
2012-01-02 12:28:05 +04:00
|
|
|
/* ::RubyVM::INSTRUCTION_NAMES */
|
2009-01-19 04:06:56 +03:00
|
|
|
rb_define_const(rb_cRubyVM, "INSTRUCTION_NAMES", rb_insns_name_array());
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
2012-12-20 02:29:18 +04:00
|
|
|
/* ::RubyVM::DEFAULT_PARAMS
|
|
|
|
* This constant variable shows VM's default parameters.
|
2013-05-19 07:10:21 +04:00
|
|
|
* Note that changing these values does not affect VM execution.
|
2012-12-20 02:29:18 +04:00
|
|
|
* Specification is not stable and you should not depend on this value.
|
|
|
|
* Of course, this constant is MRI specific.
|
|
|
|
*/
|
|
|
|
rb_define_const(rb_cRubyVM, "DEFAULT_PARAMS", vm_default_params());
|
|
|
|
|
2012-01-02 12:28:05 +04:00
|
|
|
/* debug functions ::RubyVM::SDR(), ::RubyVM::NSDR() */
|
2008-05-22 14:01:32 +04:00
|
|
|
#if VMDEBUG
|
2008-06-29 21:26:16 +04:00
|
|
|
rb_define_singleton_method(rb_cRubyVM, "SDR", sdr, 0);
|
|
|
|
rb_define_singleton_method(rb_cRubyVM, "NSDR", nsdr, 0);
|
2008-06-01 23:55:25 +04:00
|
|
|
#else
|
|
|
|
(void)sdr;
|
|
|
|
(void)nsdr;
|
2008-05-22 14:01:32 +04:00
|
|
|
#endif
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
/* VM bootstrap: phase 2 */
|
|
|
|
{
|
|
|
|
rb_vm_t *vm = ruby_current_vm;
|
|
|
|
rb_thread_t *th = GET_THREAD();
|
2008-12-27 04:15:56 +03:00
|
|
|
VALUE filename = rb_str_new2("<main>");
|
2010-03-16 20:40:00 +03:00
|
|
|
volatile VALUE iseqval = rb_iseq_new(0, filename, filename, Qnil, 0, ISEQ_TYPE_TOP);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
volatile VALUE th_self;
|
2007-12-25 00:18:47 +03:00
|
|
|
rb_iseq_t *iseq;
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
/* create vm object */
|
2009-07-08 00:28:27 +04:00
|
|
|
vm->self = TypedData_Wrap_Struct(rb_cRubyVM, &vm_data_type, vm);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
|
|
|
|
/* create main thread */
|
2009-07-08 00:28:27 +04:00
|
|
|
th_self = th->self = TypedData_Wrap_Struct(rb_cThread, &thread_data_type, th);
|
2012-10-29 21:22:36 +04:00
|
|
|
rb_iv_set(th_self, "locals", rb_hash_new());
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
vm->main_thread = th;
|
|
|
|
vm->running_thread = th;
|
|
|
|
th->vm = vm;
|
|
|
|
th->top_wrapper = 0;
|
|
|
|
th->top_self = rb_vm_top_self();
|
|
|
|
rb_thread_set_current(th);
|
|
|
|
|
vm*: doubly-linked list from ccan to manage vm->living_threads
A doubly-linked list for tracking living threads guarantees
constant-time insert/delete performance with no corner cases of a
hash table. I chose this ccan implementation of doubly-linked
lists over the BSD sys/queue.h implementation since:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
(0002 patch in Feature 9632 will introduce a secondary list
for waiting FDs)
This also increases cache locality during iteration: improving
performance in a new IO#close benchmark with many sleeping threads
while still scanning the same number of threads.
vm_thread_close 1.762
* vm_core.h (rb_vm_t): list_head and counter for living_threads
(rb_thread_t): vmlt_node for living_threads linkage
(rb_vm_living_threads_init): new function wrapper
(rb_vm_living_threads_insert): ditto
(rb_vm_living_threads_remove): ditto
* vm.c (rb_vm_living_threads_foreach): new function wrapper
* thread.c (terminate_i, thread_start_func_2, thread_create_core,
thread_fd_close_i, thread_fd_close): update to use new APIs
* vm.c (vm_mark_each_thread_func, rb_vm_mark, ruby_vm_destruct,
vm_memsize, vm_init2, Init_VM): ditto
* vm_trace.c (clear_trace_func_i, rb_clear_trace_func): ditto
* benchmark/bm_vm_thread_close.rb: added to show improvement
* ccan/build_assert/build_assert.h: added as a dependency of list.h
* ccan/check_type/check_type.h: ditto
* ccan/container_of/container_of.h: ditto
* ccan/licenses/BSD-MIT: ditto
* ccan/licenses/CC0: ditto
* ccan/str/str.h: ditto (stripped of unused macros)
* ccan/list/list.h: ditto
* common.mk: add CCAN_LIST_INCLUDES
[ruby-core:61871][Feature 9632 (part 1)]
Apologies for the size of this commit, but I think a good
doubly-linked list will be useful for future features, too.
This may be used to add ordering to a container_of-based hash
table to preserve compatibility if required (e.g. feature 9614).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-11 03:48:51 +04:00
|
|
|
rb_vm_living_threads_insert(vm, th);
|
2007-12-25 00:18:47 +03:00
|
|
|
|
* gc.c, include/ruby/ruby.h: rename rb_register_mark_object()
to rb_gc_register_mark_object().
* eval.c, vm.c: initialize vm->mark_object_ary at
Init_top_self().
* bignum.c, complex.c, encoding.c, ext/win32ole/win32ole.c,
io.c, load.c, marshal.c, rational.c, ruby.c, vm.c:
use rb_gc_register_mark_object() instead of
rb_global_variable() or rb_gc_register_address().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-15 18:59:14 +04:00
|
|
|
rb_gc_register_mark_object(iseqval);
|
2007-12-25 00:18:47 +03:00
|
|
|
GetISeqPtr(iseqval, iseq);
|
|
|
|
th->cfp->iseq = iseq;
|
|
|
|
th->cfp->pc = iseq->iseq_encoded;
|
2008-12-27 04:15:56 +03:00
|
|
|
th->cfp->self = th->top_self;
|
* revised r37993 to avoid SEGV/ILL in tests. In r37993, a method
entry with VM_METHOD_TYPE_REFINED holds only the original method
definition, so ci->me is set to a method entry allocated in the
stack, and it causes SEGV/ILL. In this commit, a method entry
with VM_METHOD_TYPE_REFINED holds the whole original method entry.
Furthermore, rb_thread_mark() is changed to mark cfp->klass to
avoid GC for iclasses created by copy_refinement_iclass().
* vm_method.c (rb_method_entry_make): add a method entry with
VM_METHOD_TYPE_REFINED to the class refined by the refinement if
the target module is a refinement. When a method entry with
VM_METHOD_TYPE_UNDEF is invoked by vm_call_method(), a method with
the same name is searched in refinements. If such a method is
found, the method is invoked. Otherwise, the original method in
the refined class (rb_method_definition_t::body.orig_me) is
invoked. This change is made to simplify the normal method lookup
and to improve the performance of normal method calls.
* vm_method.c (EXPR1, search_method, rb_method_entry),
vm_eval.c (rb_call0, rb_search_method_entry): do not use
refinements for method lookup.
* vm_insnhelper.c (vm_call_method): search methods in refinements if
ci->me is VM_METHOD_TYPE_REFINED. If the method is called by
super (i.e., ci->call == vm_call_super_method), skip the same
method entry as the current method to avoid infinite call of the
same method.
* class.c (include_modules_at): add a refined method entry for each
method defined in a module included in a refinement.
* class.c (rb_prepend_module): set an empty table to
RCLASS_M_TBL(klass) to add refined method entries, because
refinements should have priority over prepended modules.
* proc.c (mnew): use rb_method_entry_with_refinements() to get
a refined method.
* vm.c (rb_thread_mark): mark cfp->klass for iclasses created by
copy_refinement_iclass().
* vm.c (Init_VM), cont.c (fiber_init): initialize th->cfp->klass.
* test/ruby/test_refinement.rb (test_inline_method_cache): do not skip
the test because it should pass successfully.
* test/ruby/test_refinement.rb (test_redefine_refined_method): new
test for the case a refined method is redefined.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-06 17:08:41 +04:00
|
|
|
th->cfp->klass = Qnil;
|
2008-12-27 04:15:56 +03:00
|
|
|
|
2011-06-29 07:09:34 +04:00
|
|
|
/*
|
|
|
|
* The Binding of the top level scope
|
|
|
|
*/
|
2008-12-27 04:15:56 +03:00
|
|
|
rb_define_global_const("TOPLEVEL_BINDING", rb_binding_new());
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
vm_init_redefined_flag();
|
2012-06-02 19:23:37 +04:00
|
|
|
|
2012-06-15 16:01:41 +04:00
|
|
|
/* vm_backtrace.c */
|
2012-06-02 19:23:37 +04:00
|
|
|
Init_vm_backtrace();
|
* vm_core.h, vm_insnhelper.c, vm_eval.c (OPT_CALL_CFUNC_WITHOUT_FRAME):
add a new otpimization and its macro `OPT_CALL_CFUNC_WITHOUT_FRAME'.
This optimization makes all cfunc method calls `frameless', which
is fster than ordinal cfunc method call.
If `frame' is needed (for example, it calls another method with
`rb_funcall()'), then build a frame. In other words, this
optimization delays frame building.
However, to delay the frame building, we need additional overheads:
(1) Store the last call information.
(2) Check the delayed frame buidling before the frame is needed.
(3) Overhead to build a delayed frame.
rb_thread_t::passed_ci is storage of delayed cfunc call information.
(1) is lightweight because it is only 1 assignment to `passed_ci'.
To achieve (2), we modify GET_THREAD() to check `passed_ci' every
time. It causes 10% overhead on my envrionment.
This optimization only works for cfunc methods which do not need
their `frame'.
After evaluation on my environment, this optimization does not
effective every time. Because of this evaluation results, this
optimization is disabled at default.
* vm_insnhelper.c, vm.c: add VM_PROFILE* macros to measure behaviour
of VM internals. I will extend this feature.
* vm_method.c, method.h: change parameters of the `invoker' function.
Receive `func' pointer as the first parameter.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37293 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-23 08:22:31 +04:00
|
|
|
VM_PROFILE_ATEXIT();
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
2009-05-17 09:02:58 +04:00
|
|
|
void
|
|
|
|
rb_vm_set_progname(VALUE filename)
|
|
|
|
{
|
|
|
|
rb_thread_t *th = GET_VM()->main_thread;
|
|
|
|
rb_control_frame_t *cfp = (void *)(th->stack + th->stack_size);
|
|
|
|
--cfp;
|
* include/ruby/ruby.h: rename OBJ_WRITE and OBJ_WRITTEN into
RB_OBJ_WRITE and RB_OBJ_WRITTEN.
* array.c, class.c, compile.c, hash.c, internal.h, iseq.c,
proc.c, process.c, re.c, string.c, variable.c, vm.c,
vm_eval.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: catch up this change.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-12-20 12:07:47 +04:00
|
|
|
RB_OBJ_WRITE(cfp->iseq->self, &cfp->iseq->location.path, filename);
|
2009-05-17 09:02:58 +04:00
|
|
|
}
|
|
|
|
|
2008-06-05 18:41:41 +04:00
|
|
|
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
2008-04-27 07:20:35 +04:00
|
|
|
struct rb_objspace *rb_objspace_alloc(void);
|
2008-06-05 18:41:41 +04:00
|
|
|
#endif
|
2010-06-06 03:26:43 +04:00
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
void
|
|
|
|
Init_BareVM(void)
|
|
|
|
{
|
|
|
|
/* VM bootstrap: phase 1 */
|
2012-01-10 07:49:10 +04:00
|
|
|
rb_vm_t * vm = ruby_mimmalloc(sizeof(*vm));
|
|
|
|
rb_thread_t * th = ruby_mimmalloc(sizeof(*th));
|
2008-08-01 16:30:25 +04:00
|
|
|
if (!vm || !th) {
|
|
|
|
fprintf(stderr, "[FATAL] failed to allocate memory\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
2007-11-21 12:06:06 +03:00
|
|
|
MEMZERO(th, rb_thread_t, 1);
|
2007-12-24 23:27:10 +03:00
|
|
|
rb_thread_set_current_raw(th);
|
|
|
|
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
vm_init2(vm);
|
2008-04-27 07:20:35 +04:00
|
|
|
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
|
|
|
vm->objspace = rb_objspace_alloc();
|
|
|
|
#endif
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
ruby_current_vm = vm;
|
|
|
|
|
2010-06-06 03:26:43 +04:00
|
|
|
Init_native_thread();
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
th->vm = vm;
|
2012-12-20 02:29:18 +04:00
|
|
|
th_init(th, 0);
|
2008-06-14 06:59:19 +04:00
|
|
|
ruby_thread_init_stack(th);
|
2014-05-04 17:04:37 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Init_vm_objects(void)
|
|
|
|
{
|
|
|
|
rb_vm_t *vm = GET_VM();
|
|
|
|
|
2013-10-13 15:59:27 +04:00
|
|
|
vm->defined_module_hash = rb_hash_new();
|
2014-05-04 17:04:37 +04:00
|
|
|
|
|
|
|
/* initialize mark object array, hash */
|
2014-07-06 08:42:35 +04:00
|
|
|
vm->mark_object_ary = rb_ary_tmp_new(128);
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* top self */
|
|
|
|
|
|
|
|
static VALUE
|
2008-05-22 20:19:14 +04:00
|
|
|
main_to_s(VALUE obj)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
return rb_str_new2("main");
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
2008-05-22 08:28:13 +04:00
|
|
|
rb_vm_top_self(void)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
return GET_VM()->top_self;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-05-22 08:28:13 +04:00
|
|
|
Init_top_self(void)
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
{
|
|
|
|
rb_vm_t *vm = GET_VM();
|
|
|
|
|
|
|
|
vm->top_self = rb_obj_alloc(rb_cObject);
|
|
|
|
rb_define_singleton_method(rb_vm_top_self(), "to_s", main_to_s, 0);
|
2012-08-15 15:50:01 +04:00
|
|
|
rb_define_alias(rb_singleton_class(rb_vm_top_self()), "inspect", "to_s");
|
* blockinlining.c: remove "yarv" prefix.
* array.c, numeric.c: ditto.
* insnhelper.ci, insns.def, vm_evalbody.ci: ditto.
* yarvcore.c: removed.
* yarvcore.h: renamed to core.h.
* cont.c, debug.c, error.c, process.c, signal.c : ditto.
* ext/probeprofiler/probeprofiler.c: ditto.
* id.c, id.h: added.
* inits.c: ditto.
* compile.c: rename internal functions.
* compile.h: fix debug flag.
* eval.c, object.c, vm.c: remove ruby_top_self.
use rb_vm_top_self() instead.
* eval_intern.h, eval_load: ditto.
* gc.c: rename yarv_machine_stack_mark() to
rb_gc_mark_machine_stack().
* insnhelper.h: remove unused macros.
* iseq.c: add iseq_compile() to create iseq object
from source string.
* proc.c: rename a internal function.
* template/insns.inc.tmpl: remove YARV prefix.
* thread.c:
* vm.c (rb_iseq_eval): added.
* vm.c: move some functions from yarvcore.c.
* vm_dump.c: fix to remove compiler warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-07-12 08:25:46 +04:00
|
|
|
}
|
2008-06-09 09:18:03 +04:00
|
|
|
|
|
|
|
VALUE *
|
|
|
|
ruby_vm_verbose_ptr(rb_vm_t *vm)
|
|
|
|
{
|
|
|
|
return &vm->verbose;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE *
|
|
|
|
ruby_vm_debug_ptr(rb_vm_t *vm)
|
|
|
|
{
|
|
|
|
return &vm->debug;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE *
|
|
|
|
rb_ruby_verbose_ptr(void)
|
|
|
|
{
|
|
|
|
return ruby_vm_verbose_ptr(GET_VM());
|
|
|
|
}
|
|
|
|
|
2008-06-14 06:59:19 +04:00
|
|
|
VALUE *
|
|
|
|
rb_ruby_debug_ptr(void)
|
2008-06-09 09:18:03 +04:00
|
|
|
{
|
|
|
|
return ruby_vm_debug_ptr(GET_VM());
|
|
|
|
}
|
2012-10-04 16:31:05 +04:00
|
|
|
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
/* iseq.c */
|
2013-03-06 10:30:03 +04:00
|
|
|
VALUE rb_insn_operand_intern(rb_iseq_t *iseq,
|
|
|
|
VALUE insn, int op_no, VALUE op,
|
|
|
|
int len, size_t pos, VALUE *pnop, VALUE child);
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
|
|
|
|
2013-12-08 04:41:01 +04:00
|
|
|
#define HASH_ASET(h, k, v) rb_hash_aset((h), (st_data_t)(k), (st_data_t)(v))
|
2012-10-04 16:48:35 +04:00
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
/* uh = {
|
|
|
|
* insn(Fixnum) => ihash(Hash)
|
|
|
|
* }
|
|
|
|
* ihash = {
|
|
|
|
* -1(Fixnum) => count, # insn usage
|
|
|
|
* 0(Fixnum) => ophash, # operand usage
|
|
|
|
* }
|
|
|
|
* ophash = {
|
|
|
|
* val(interned string) => count(Fixnum)
|
|
|
|
* }
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
vm_analysis_insn(int insn)
|
|
|
|
{
|
|
|
|
ID usage_hash;
|
|
|
|
ID bigram_hash;
|
|
|
|
static int prev_insn = -1;
|
|
|
|
|
|
|
|
VALUE uh;
|
|
|
|
VALUE ihash;
|
|
|
|
VALUE cv;
|
|
|
|
|
|
|
|
CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN");
|
|
|
|
CONST_ID(bigram_hash, "USAGE_ANALYSIS_INSN_BIGRAM");
|
|
|
|
uh = rb_const_get(rb_cRubyVM, usage_hash);
|
|
|
|
if ((ihash = rb_hash_aref(uh, INT2FIX(insn))) == Qnil) {
|
|
|
|
ihash = rb_hash_new();
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(uh, INT2FIX(insn), ihash);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
if ((cv = rb_hash_aref(ihash, INT2FIX(-1))) == Qnil) {
|
|
|
|
cv = INT2FIX(0);
|
|
|
|
}
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(ihash, INT2FIX(-1), INT2FIX(FIX2INT(cv) + 1));
|
2012-10-04 16:31:05 +04:00
|
|
|
|
|
|
|
/* calc bigram */
|
|
|
|
if (prev_insn != -1) {
|
|
|
|
VALUE bi;
|
|
|
|
VALUE ary[2];
|
|
|
|
VALUE cv;
|
|
|
|
|
|
|
|
ary[0] = INT2FIX(prev_insn);
|
|
|
|
ary[1] = INT2FIX(insn);
|
|
|
|
bi = rb_ary_new4(2, &ary[0]);
|
|
|
|
|
|
|
|
uh = rb_const_get(rb_cRubyVM, bigram_hash);
|
|
|
|
if ((cv = rb_hash_aref(uh, bi)) == Qnil) {
|
|
|
|
cv = INT2FIX(0);
|
|
|
|
}
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(uh, bi, INT2FIX(FIX2INT(cv) + 1));
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
prev_insn = insn;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
vm_analysis_operand(int insn, int n, VALUE op)
|
|
|
|
{
|
|
|
|
ID usage_hash;
|
|
|
|
|
|
|
|
VALUE uh;
|
|
|
|
VALUE ihash;
|
|
|
|
VALUE ophash;
|
|
|
|
VALUE valstr;
|
|
|
|
VALUE cv;
|
|
|
|
|
|
|
|
CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN");
|
|
|
|
|
|
|
|
uh = rb_const_get(rb_cRubyVM, usage_hash);
|
|
|
|
if ((ihash = rb_hash_aref(uh, INT2FIX(insn))) == Qnil) {
|
|
|
|
ihash = rb_hash_new();
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(uh, INT2FIX(insn), ihash);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
if ((ophash = rb_hash_aref(ihash, INT2FIX(n))) == Qnil) {
|
|
|
|
ophash = rb_hash_new();
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(ihash, INT2FIX(n), ophash);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
/* intern */
|
2013-03-06 10:30:03 +04:00
|
|
|
valstr = rb_insn_operand_intern(GET_THREAD()->cfp->iseq, insn, n, op, 0, 0, 0, 0);
|
2012-10-04 16:31:05 +04:00
|
|
|
|
|
|
|
/* set count */
|
|
|
|
if ((cv = rb_hash_aref(ophash, valstr)) == Qnil) {
|
|
|
|
cv = INT2FIX(0);
|
|
|
|
}
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(ophash, valstr, INT2FIX(FIX2INT(cv) + 1));
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
vm_analysis_register(int reg, int isset)
|
|
|
|
{
|
|
|
|
ID usage_hash;
|
|
|
|
VALUE uh;
|
|
|
|
VALUE valstr;
|
|
|
|
static const char regstrs[][5] = {
|
|
|
|
"pc", /* 0 */
|
|
|
|
"sp", /* 1 */
|
|
|
|
"ep", /* 2 */
|
|
|
|
"cfp", /* 3 */
|
|
|
|
"self", /* 4 */
|
|
|
|
"iseq", /* 5 */
|
|
|
|
};
|
|
|
|
static const char getsetstr[][4] = {
|
|
|
|
"get",
|
|
|
|
"set",
|
|
|
|
};
|
|
|
|
static VALUE syms[sizeof(regstrs) / sizeof(regstrs[0])][2];
|
|
|
|
|
|
|
|
VALUE cv;
|
|
|
|
|
|
|
|
CONST_ID(usage_hash, "USAGE_ANALYSIS_REGS");
|
|
|
|
if (syms[0] == 0) {
|
|
|
|
char buff[0x10];
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < (int)(sizeof(regstrs) / sizeof(regstrs[0])); i++) {
|
|
|
|
int j;
|
|
|
|
for (j = 0; j < 2; j++) {
|
|
|
|
snprintf(buff, 0x10, "%d %s %-4s", i, getsetstr[j], regstrs[i]);
|
|
|
|
syms[i][j] = ID2SYM(rb_intern(buff));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
valstr = syms[reg][isset];
|
|
|
|
|
|
|
|
uh = rb_const_get(rb_cRubyVM, usage_hash);
|
|
|
|
if ((cv = rb_hash_aref(uh, valstr)) == Qnil) {
|
|
|
|
cv = INT2FIX(0);
|
|
|
|
}
|
2012-10-04 16:48:35 +04:00
|
|
|
HASH_ASET(uh, valstr, INT2FIX(FIX2INT(cv) + 1));
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
|
2012-10-04 16:48:35 +04:00
|
|
|
#undef HASH_ASET
|
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
void (*ruby_vm_collect_usage_func_insn)(int insn) = vm_analysis_insn;
|
|
|
|
void (*ruby_vm_collect_usage_func_operand)(int insn, int n, VALUE op) = vm_analysis_operand;
|
|
|
|
void (*ruby_vm_collect_usage_func_register)(int reg, int isset) = vm_analysis_register;
|
|
|
|
|
|
|
|
/* :nodoc: */
|
|
|
|
static VALUE
|
|
|
|
usage_analysis_insn_stop(VALUE self)
|
|
|
|
{
|
|
|
|
ruby_vm_collect_usage_func_insn = 0;
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* :nodoc: */
|
|
|
|
static VALUE
|
|
|
|
usage_analysis_operand_stop(VALUE self)
|
|
|
|
{
|
|
|
|
ruby_vm_collect_usage_func_operand = 0;
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* :nodoc: */
|
|
|
|
static VALUE
|
|
|
|
usage_analysis_register_stop(VALUE self)
|
|
|
|
{
|
|
|
|
ruby_vm_collect_usage_func_register = 0;
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
#else
|
|
|
|
|
|
|
|
void (*ruby_vm_collect_usage_func_insn)(int insn) = NULL;
|
|
|
|
void (*ruby_vm_collect_usage_func_operand)(int insn, int n, VALUE op) = NULL;
|
|
|
|
void (*ruby_vm_collect_usage_func_register)(int reg, int isset) = NULL;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2012-11-22 11:23:40 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
2012-10-04 16:31:05 +04:00
|
|
|
/* @param insn instruction number */
|
|
|
|
static void
|
|
|
|
vm_collect_usage_insn(int insn)
|
|
|
|
{
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
if (RUBY_DTRACE_INSN_ENABLED()) {
|
|
|
|
RUBY_DTRACE_INSN(rb_insns_name(insn));
|
|
|
|
}
|
2012-10-04 16:31:05 +04:00
|
|
|
if (ruby_vm_collect_usage_func_insn)
|
2012-11-16 21:02:35 +04:00
|
|
|
(*ruby_vm_collect_usage_func_insn)(insn);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* @param insn instruction number
|
|
|
|
* @param n n-th operand
|
|
|
|
* @param op operand value
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
vm_collect_usage_operand(int insn, int n, VALUE op)
|
|
|
|
{
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
if (RUBY_DTRACE_INSN_OPERAND_ENABLED()) {
|
|
|
|
VALUE valstr;
|
|
|
|
|
2013-03-06 10:30:03 +04:00
|
|
|
valstr = rb_insn_operand_intern(GET_THREAD()->cfp->iseq, insn, n, op, 0, 0, 0, 0);
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
|
|
|
|
RUBY_DTRACE_INSN_OPERAND(RSTRING_PTR(valstr), rb_insns_name(insn));
|
2012-11-16 21:02:37 +04:00
|
|
|
RB_GC_GUARD(valstr);
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
}
|
2012-10-04 16:31:05 +04:00
|
|
|
if (ruby_vm_collect_usage_func_operand)
|
2012-11-16 21:02:35 +04:00
|
|
|
(*ruby_vm_collect_usage_func_operand)(insn, n, op);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* @param reg register id. see code of vm_analysis_register() */
|
2014-10-12 05:39:53 +04:00
|
|
|
/* @param isset 0: read, 1: write */
|
2012-10-04 16:31:05 +04:00
|
|
|
static void
|
|
|
|
vm_collect_usage_register(int reg, int isset)
|
|
|
|
{
|
|
|
|
if (ruby_vm_collect_usage_func_register)
|
2012-11-16 21:02:35 +04:00
|
|
|
(*ruby_vm_collect_usage_func_register)(reg, isset);
|
2012-10-04 16:31:05 +04:00
|
|
|
}
|
|
|
|
#endif
|