Skip to content

Commit 635f96a

Browse files
committed
fix pb with empty sequence in ps, after simplication of code involving ownership (views)
1 parent 4a59c12 commit 635f96a

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

src/madl_sequence.mad

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ local string, table, io =
5252

5353
-- backup original methods and metamethods
5454
local sequence_mt = getmetatable(sequence)
55-
local var_get, var_val, raw_get, is_instanceOf in sequence
55+
local var_get, var_val, is_instanceOf in sequence
5656
local seq_cpy, var_set = sequence.copy, sequence_mt.__newindex
5757

5858
-- root object ----------------------------------------------------------------o
@@ -133,7 +133,7 @@ end
133133
-- check shared element
134134
local function check_shared (seq, idx)
135135
local elm = seq.__dat[idx]
136-
if is_nil(raw_get(elm, 'l')) then return elm.parent end
136+
if is_nil(elm:raw_get'l') then return elm.parent end
137137
seq_error("invalid shared element (l defined)", seq, idx, elm)
138138
end
139139

@@ -644,8 +644,9 @@ end
644644
local function flatten_sequ (seq, flat, sref)
645645
local n, idx = seq:raw_len(), 2
646646
flat[1] = mkstart {at=0}
647+
647648
for i=1,n do
648-
local elm = seq:raw_get(i)
649+
local elm = seq:var_get(i)
649650
if not (is_element(elm) or is_rawtable(elm)) then
650651
seq_error("invalid element detected", seq, i)
651652
elseif elm.kind == 'bline' or is_rawtable(elm) then
@@ -706,7 +707,7 @@ local function clear_sub (seq, sref)
706707
end
707708

708709
-- finalize sequence
709-
local function finish_sequ (seq)
710+
local function fini_sequ (seq)
710711
local data = seq.__dat
711712

712713
-- clear memoization
@@ -729,31 +730,33 @@ end
729730
-- sequence init (build)
730731
local function init_mm (seq)
731732
local n = seq:raw_len()
733+
734+
-- check if sequence needs __dat
735+
if n == 0 and is_nil(seq:raw_get'l') then return seq end
736+
732737
local sref = { dir=seq.dir, sdir={} }
733738
local data = table.new(n+2,8)
734739

735-
-- disable inheritance
736-
-- seq:set_final()
737-
738740
-- flatten subsequences
739741
flatten_sequ(seq, data, sref)
740742
seq:clear_array()
741743

742-
local ne = #data
744+
local ne = #data
743745
data.eidx = table.new(0,ne)
744746
data.spos = table.new(ne,0)
745747
data.upos = table.new(ne,0)
746748
data.ds = table.new(ne,0)
747749
data.algn = table.new(ne,0)
748-
seq.__dat, data.ne = data, ne
750+
data.ne = ne
751+
seq.__dat = data
749752

750753
-- set minlen to 1e-6 [m] for MAD-X compatibility
751754
if option.madxenv then seq.minlen = 1e-6 end
752755

753756
build_idx(data)
754757
build_pos(seq, sref)
755758
clear_sub(seq, sref)
756-
finish_sequ(seq)
759+
fini_sequ(seq)
757760

758761
-- publish sequence elements in MADX environment
759762
if option.madxenv then seq:publish(MADX, true) end
@@ -764,27 +767,30 @@ end
764767
local function copy_mm (seq, name_)
765768
assert(not rawequal(seq, sequence), "invalid argument #1 (cannot copy 'sequence')")
766769
assert(is_sequence(seq) , "invalid argument #1 (sequence expected)")
767-
local cpy = seq_cpy(seq,name_)
770+
local cpy = seq_cpy(seq,name_)
771+
772+
-- check if copy needs to be further processed
773+
if seq:is_view() then return cpy end
774+
768775
local data = seq.__dat
769776
local ne = data.ne
770-
local cdat = table.new(ne,5) -- see init_mm
777+
local cdat = table.new(ne,8) -- see init_mm
771778
cdat.eidx = table.new(0,ne)
772779
cdat.spos = table.new(ne,0)
773780
cdat.upos = table.new(ne,0)
774781
cdat.ds = table.new(ne,0)
775782
cdat.algn = table.new(ne,0)
776783
cdat.ne = ne
784+
cpy.__dat = cdat
777785

778786
for i=1,ne do
779787
cdat[i] = data[i]:copy()
780788
cdat.spos[i], cdat.upos[i], cdat.ds[i], cdat.algn[i] =
781789
data.spos[i], data.upos[i], data.ds[i], data.algn[i]
782790
end
783791

784-
cpy:raw_set('__dat', cdat)
785-
786792
build_idx(cdat)
787-
finish_sequ(cpy)
793+
fini_sequ(cpy)
788794
return cpy
789795
end
790796

@@ -842,6 +848,11 @@ end
842848

843849
-- methods (readonly) ---------------------------------------------------------o
844850

851+
local function is_view (seq)
852+
assert(is_sequence(seq), "invalid argument #1 (sequence expected)")
853+
return is_nil(seq:raw_get'__dat')
854+
end
855+
845856
local function index (seq, idx)
846857
assert(is_sequence(seq), "invalid argument #1 (sequence expected)")
847858
assert(is_integer (idx), "invalid argument #2 (integer expected)")
@@ -1121,7 +1132,7 @@ local function build_index (seq)
11211132
assert(is_sequence(seq), "invalid argument #1 (sequence expected)")
11221133
local data = seq.__dat
11231134
build_idx (data)
1124-
finish_sequ(seq)
1135+
fini_sequ(seq)
11251136
return seq
11261137
end
11271138

@@ -1416,7 +1427,7 @@ local function share (seq1, seq2)
14161427
end
14171428
end
14181429
end
1419-
finish_sequ(seq1) finish_sequ(seq2)
1430+
fini_sequ(seq1) fini_sequ(seq2)
14201431
return elm_r, idx_r
14211432
end
14221433

@@ -1453,7 +1464,7 @@ local function unique (seq, fmt_)
14531464
if fmt_ then data.eidx[en] = nil end
14541465
end
14551466
end
1456-
finish_sequ(seq)
1467+
fini_sequ(seq)
14571468
return seq
14581469
end
14591470

@@ -1724,6 +1735,9 @@ sequence :set_methods {
17241735
-- duplicate
17251736
copy = copy_mm,
17261737

1738+
-- ownership
1739+
is_view = is_view,
1740+
17271741
-- flags
17281742
save_flags = save_flags,
17291743
restore_flags = restore_flags,

0 commit comments

Comments
 (0)