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
da5b7fa7
Commit
da5b7fa7
authored
Apr 21, 2017
by
take_cheeze
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support freeze in `Struct`.
parent
94bcdca6
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
25 additions
and
2 deletions
+25
-2
mrbgems/mruby-struct/src/struct.c
mrbgems/mruby-struct/src/struct.c
+12
-2
mrbgems/mruby-struct/test/struct.rb
mrbgems/mruby-struct/test/struct.rb
+13
-0
No files found.
mrbgems/mruby-struct/src/struct.c
View file @
da5b7fa7
...
...
@@ -84,6 +84,16 @@ mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass)
return
ary
;
}
static
void
mrb_struct_modify
(
mrb_state
*
mrb
,
mrb_value
strct
)
{
if
(
MRB_FROZEN_P
(
mrb_basic_ptr
(
strct
)))
{
mrb_raise
(
mrb
,
E_RUNTIME_ERROR
,
"can't modify frozen struct"
);
}
mrb_write_barrier
(
mrb
,
mrb_basic_ptr
(
strct
));
}
/* 15.2.18.4.6 */
/*
* call-seq:
...
...
@@ -448,8 +458,8 @@ mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
ptr_members
=
RARRAY_PTR
(
members
);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
(
mrb_symbol
(
ptr_members
[
i
])
==
id
)
{
mrb_struct_modify
(
mrb
,
s
);
ptr
[
i
]
=
val
;
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
mrb_ptr
(
s
));
return
val
;
}
}
...
...
@@ -512,7 +522,7 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
"offset %S too large for struct(size:%S)"
,
mrb_fixnum_value
(
i
),
mrb_fixnum_value
(
RSTRUCT_LEN
(
s
)));
}
mrb_
write_barrier
(
mrb
,
(
struct
RBasic
*
)
mrb_ptr
(
s
)
);
mrb_
struct_modify
(
mrb
,
s
);
return
RSTRUCT_PTR
(
s
)[
i
]
=
val
;
}
...
...
mrbgems/mruby-struct/test/struct.rb
View file @
da5b7fa7
...
...
@@ -197,3 +197,16 @@ assert("Struct.new generates subclass of Struct") do
Struct
=
original_struct
end
end
assert
'Struct#freeze'
do
c
=
Struct
.
new
:m
o
=
c
.
new
o
.
m
=
:test
assert_equal
:test
,
o
.
m
o
.
freeze
assert_raise
(
RuntimeError
)
{
o
.
m
=
:modify
}
assert_raise
(
RuntimeError
)
{
o
[
:m
]
=
:modify
}
assert_equal
:test
,
o
.
m
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