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
d2011ce0
Commit
d2011ce0
authored
Apr 25, 2014
by
take_cheeze
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support file name and line argument in Kernel.eval .
Only a nil binding will be supported.
parent
215f8fdd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
66 additions
and
4 deletions
+66
-4
mrbgems/mruby-eval/src/eval.c
mrbgems/mruby-eval/src/eval.c
+59
-4
mrbgems/mruby-eval/test/eval.rb
mrbgems/mruby-eval/test/eval.rb
+7
-0
No files found.
mrbgems/mruby-eval/src/eval.c
View file @
d2011ce0
#include "mruby.h"
#include "mruby/compile.h"
static
struct
RProc
*
create_proc_from_string
(
mrb_state
*
mrb
,
char
*
s
,
int
len
,
mrb_value
binding
,
char
*
file
,
mrb_int
line
)
{
mrbc_context
*
cxt
;
struct
mrb_parser_state
*
p
;
struct
RProc
*
proc
;
if
(
!
mrb_nil_p
(
binding
))
{
mrb_raise
(
mrb
,
E_ARGUMENT_ERROR
,
"Binding of eval must be nil."
);
}
cxt
=
mrbc_context_new
(
mrb
);
cxt
->
lineno
=
line
;
if
(
file
)
{
mrbc_filename
(
mrb
,
cxt
,
file
);
}
p
=
mrb_parser_new
(
mrb
);
p
->
s
=
s
;
p
->
send
=
s
+
len
;
mrb_parser_parse
(
p
,
cxt
);
if
(
0
<
p
->
nerr
)
{
/* parse error */
char
buf
[
256
];
int
n
;
n
=
snprintf
(
buf
,
sizeof
(
buf
),
"line %d: %s
\n
"
,
p
->
error_buffer
[
0
].
lineno
,
p
->
error_buffer
[
0
].
message
);
mrb_parser_free
(
p
);
mrbc_context_free
(
mrb
,
cxt
);
mrb_exc_raise
(
mrb
,
mrb_exc_new
(
mrb
,
E_SYNTAX_ERROR
,
buf
,
n
));
}
proc
=
mrb_generate_code
(
mrb
,
p
);
mrb_parser_free
(
p
);
mrbc_context_free
(
mrb
,
cxt
);
if
(
proc
==
NULL
)
{
/* codegen error */
mrb_raise
(
mrb
,
E_SCRIPT_ERROR
,
"codegen error"
);
}
return
proc
;
}
static
mrb_value
f_eval
(
mrb_state
*
mrb
,
mrb_value
self
)
{
char
*
s
;
int
len
;
mrb_int
len
;
mrb_value
binding
=
mrb_nil_value
();
char
*
file
=
NULL
;
mrb_int
line
=
1
;
mrb_value
ret
;
mrb_get_args
(
mrb
,
"s|ozi"
,
&
s
,
&
len
,
&
binding
,
&
file
,
&
line
);
ret
=
mrb_toplevel_run
(
mrb
,
create_proc_from_string
(
mrb
,
s
,
len
,
binding
,
file
,
line
));
if
(
mrb
->
exc
)
{
mrb_exc_raise
(
mrb
,
mrb_obj_value
(
mrb
->
exc
));
}
mrb_get_args
(
mrb
,
"s"
,
&
s
,
&
len
);
return
mrb_load_nstring
(
mrb
,
s
,
len
);
return
ret
;
}
void
mrb_mruby_eval_gem_init
(
mrb_state
*
mrb
)
{
mrb_define_class_method
(
mrb
,
mrb
->
kernel_module
,
"eval"
,
f_eval
,
MRB_ARGS_REQ
(
1
));
mrb_define_class_method
(
mrb
,
mrb
->
kernel_module
,
"eval"
,
f_eval
,
MRB_ARGS_REQ
(
1
)
|
MRB_ARGS_OPT
(
3
)
);
}
void
...
...
mrbgems/mruby-eval/test/eval.rb
View file @
d2011ce0
...
...
@@ -6,3 +6,10 @@ end
assert
(
'eval'
)
do
assert_equal
(
10
)
{
eval
'1 * 10'
}
end
assert
(
'rest arguments of eval'
)
do
assert_raise
(
ArgumentError
)
{
Kernel
.
eval
(
'0'
,
0
,
'test'
,
0
)
}
assert_equal
[
'test'
,
'test.rb'
,
10
]
do
Kernel
.
eval
(
'[\'test\', __FILE__, __LINE__]'
,
nil
,
'test.rb'
,
10
)
end
end
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