Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mruby
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
mruby
Commits
6bf1ee78
Commit
6bf1ee78
authored
May 30, 2014
by
Yukihiro "Matz" Matsumoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add internal function mrb_toplevel_run_keep() to keep stack contents; close #2326
parent
f38e53ec
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
14 additions
and
4 deletions
+14
-4
include/mruby/compile.h
include/mruby/compile.h
+2
-0
src/parse.y
src/parse.y
+3
-1
src/vm.c
src/vm.c
+9
-3
No files found.
include/mruby/compile.h
View file @
6bf1ee78
...
@@ -35,6 +35,8 @@ void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt);
...
@@ -35,6 +35,8 @@ void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt);
const
char
*
mrbc_filename
(
mrb_state
*
mrb
,
mrbc_context
*
c
,
const
char
*
s
);
const
char
*
mrbc_filename
(
mrb_state
*
mrb
,
mrbc_context
*
c
,
const
char
*
s
);
void
mrbc_partial_hook
(
mrb_state
*
mrb
,
mrbc_context
*
c
,
int
(
*
partial_hook
)(
struct
mrb_parser_state
*
),
void
*
data
);
void
mrbc_partial_hook
(
mrb_state
*
mrb
,
mrbc_context
*
c
,
int
(
*
partial_hook
)(
struct
mrb_parser_state
*
),
void
*
data
);
mrb_value
mrb_toplevel_run_keep
(
mrb_state
*
,
struct
RProc
*
,
unsigned
int
);
/* AST node structure */
/* AST node structure */
typedef
struct
mrb_ast_node
{
typedef
struct
mrb_ast_node
{
struct
mrb_ast_node
*
car
,
*
cdr
;
struct
mrb_ast_node
*
car
,
*
cdr
;
...
...
src/parse.y
View file @
6bf1ee78
...
@@ -5522,6 +5522,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
...
@@ -5522,6 +5522,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
struct RClass *target = mrb->object_class;
struct RClass *target = mrb->object_class;
struct RProc *proc;
struct RProc *proc;
mrb_value v;
mrb_value v;
unsigned int keep = 0;
if (!p) {
if (!p) {
return mrb_undef_value();
return mrb_undef_value();
...
@@ -5555,12 +5556,13 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
...
@@ -5555,12 +5556,13 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
if (c->target_class) {
if (c->target_class) {
target = c->target_class;
target = c->target_class;
}
}
keep = c->slen + 1;
}
}
proc->target_class = target;
proc->target_class = target;
if (mrb->c->ci) {
if (mrb->c->ci) {
mrb->c->ci->target_class = target;
mrb->c->ci->target_class = target;
}
}
v = mrb_toplevel_run
(mrb, proc
);
v = mrb_toplevel_run
_keep(mrb, proc, keep
);
if (mrb->exc) return mrb_nil_value();
if (mrb->exc) return mrb_nil_value();
return v;
return v;
}
}
...
...
src/vm.c
View file @
6bf1ee78
...
@@ -2402,19 +2402,25 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
...
@@ -2402,19 +2402,25 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
}
mrb_value
mrb_value
mrb_toplevel_run
(
mrb_state
*
mrb
,
struct
RProc
*
proc
)
mrb_toplevel_run
_keep
(
mrb_state
*
mrb
,
struct
RProc
*
proc
,
unsigned
int
stack_keep
)
{
{
mrb_callinfo
*
ci
;
mrb_callinfo
*
ci
;
mrb_value
v
;
mrb_value
v
;
if
(
!
mrb
->
c
->
cibase
||
mrb
->
c
->
ci
==
mrb
->
c
->
cibase
)
{
if
(
!
mrb
->
c
->
cibase
||
mrb
->
c
->
ci
==
mrb
->
c
->
cibase
)
{
return
mrb_context_run
(
mrb
,
proc
,
mrb_top_self
(
mrb
),
0
);
return
mrb_context_run
(
mrb
,
proc
,
mrb_top_self
(
mrb
),
stack_keep
);
}
}
ci
=
cipush
(
mrb
);
ci
=
cipush
(
mrb
);
ci
->
acc
=
CI_ACC_SKIP
;
ci
->
acc
=
CI_ACC_SKIP
;
ci
->
target_class
=
mrb
->
object_class
;
ci
->
target_class
=
mrb
->
object_class
;
v
=
mrb_context_run
(
mrb
,
proc
,
mrb_top_self
(
mrb
),
0
);
v
=
mrb_context_run
(
mrb
,
proc
,
mrb_top_self
(
mrb
),
stack_keep
);
cipop
(
mrb
);
cipop
(
mrb
);
return
v
;
return
v
;
}
}
mrb_value
mrb_toplevel_run
(
mrb_state
*
mrb
,
struct
RProc
*
proc
)
{
return
mrb_toplevel_run_keep
(
mrb
,
proc
,
0
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment