redshift 1.3.21 → 1.3.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/RELEASE-NOTES +14 -0
- data/bench/algebraic.rb +61 -0
- data/bench/bench +3 -0
- data/bench/connect.rb +75 -0
- data/bench/linked-flows.rb +71 -0
- data/examples/step-discrete-hook.rb +201 -0
- data/lib/redshift/component.rb +4 -1
- data/lib/redshift/meta.rb +2 -0
- data/lib/redshift/mixins/zeno-debugger.rb +1 -1
- data/lib/redshift/redshift.rb +48 -11
- data/lib/redshift/syntax.rb +9 -1
- data/lib/redshift/target/c/component-gen.rb +185 -91
- data/lib/redshift/target/c/flow-gen.rb +11 -9
- data/lib/redshift/target/c/flow/algebraic.rb +32 -37
- data/lib/redshift/target/c/flow/delay.rb +34 -32
- data/lib/redshift/target/c/flow/derivative.rb +30 -33
- data/lib/redshift/target/c/flow/euler.rb +24 -22
- data/lib/redshift/target/c/flow/expr.rb +40 -43
- data/lib/redshift/target/c/flow/rk4.rb +28 -32
- data/lib/redshift/target/c/library.rb +2 -8
- data/lib/redshift/target/c/world-gen.rb +31 -35
- data/lib/redshift/world.rb +6 -0
- metadata +12 -14
- data/.bnsignore +0 -27
- data/bench/after-flow-cache +0 -66
- data/bench/before-flow-cache +0 -66
@@ -1,32 +1,31 @@
|
|
1
1
|
module RedShift; class CexprGuard
|
2
|
-
|
3
2
|
def initialize f
|
4
3
|
super nil, f
|
5
4
|
end
|
6
5
|
|
7
|
-
@@serial = 0
|
6
|
+
@@serial = Hash.new(0)
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
cl_cname = CGenerator.make_c_name cl.name
|
14
|
-
g_cname = "Guard_#{@@serial}"; @@serial += 1
|
15
|
-
guard_name = "guard_#{cl_cname}_#{g_cname}"
|
16
|
-
|
17
|
-
Component::GuardWrapper.make_subclass guard_name do
|
18
|
-
@inspect_str = "#{cl.name}: #{guard.formula}"
|
8
|
+
def make_generator cl
|
9
|
+
@fname = "guard_#{CGenerator.make_c_name cl.name}_#{@@serial[cl]}"
|
10
|
+
@@serial[cl] += 1
|
11
|
+
@inspect_str = "#{cl.name}: #{formula}"
|
19
12
|
|
20
|
-
|
21
|
-
|
13
|
+
@generator = proc do
|
14
|
+
sl = cl.shadow_library
|
15
|
+
ssn = cl.shadow_struct_name
|
16
|
+
cont_state_ssn = cl.cont_state_class.shadow_struct_name
|
17
|
+
|
18
|
+
include_file, source_file = sl.add_file fname
|
22
19
|
|
23
20
|
# We need the struct
|
24
|
-
|
21
|
+
source_file.include(cl.shadow_library_include_file)
|
25
22
|
|
26
23
|
strict = false
|
27
24
|
|
28
|
-
|
25
|
+
guard = self
|
26
|
+
source_file.define(fname).instance_eval do
|
29
27
|
arguments "ComponentShadow *comp_shdw"
|
28
|
+
scope:extern
|
30
29
|
return_type "int"
|
31
30
|
declare :shadow => %{
|
32
31
|
struct #{ssn} *shadow;
|
@@ -35,23 +34,21 @@ module RedShift; class CexprGuard
|
|
35
34
|
}
|
36
35
|
setup :shadow => %{
|
37
36
|
shadow = (#{ssn} *)comp_shdw;
|
38
|
-
cont_state = (#{cont_state_ssn} *)shadow->cont_state;
|
37
|
+
cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
|
39
38
|
}
|
40
39
|
declare :result => "int result"
|
41
|
-
translation = guard.translate(self, "result",
|
40
|
+
translation = guard.translate(self, "result", cl, 0) {|s| strict = s}
|
42
41
|
body %{
|
43
42
|
#{translation.join("
|
44
43
|
")};
|
45
44
|
return result;
|
46
45
|
}
|
47
46
|
end
|
48
|
-
|
47
|
+
|
48
|
+
s = strict ? "STRICT" : "NONSTRICT"
|
49
|
+
sl.init_library_function.body \
|
50
|
+
"s_init_guard(#{fname}, #{fname.inspect}, #{inspect_str.inspect}, #{s});"
|
49
51
|
@strict = strict
|
50
|
-
## should set guard.strict = strict too?
|
51
|
-
|
52
|
-
define_c_method :calc_function_pointer do
|
53
|
-
body "shadow->guard = &#{guard_name}"
|
54
|
-
end
|
55
52
|
end
|
56
53
|
end
|
57
54
|
end; end
|
@@ -64,26 +61,30 @@ module RedShift; class Expr
|
|
64
61
|
@type = type
|
65
62
|
end
|
66
63
|
|
67
|
-
@@serial = 0
|
64
|
+
@@serial = Hash.new(0)
|
68
65
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
ex_cname = "Expr_#{@@serial}"; @@serial += 1
|
74
|
-
expr_name = "expr_#{cl_cname}_#{ex_cname}"
|
66
|
+
def make_generator cl
|
67
|
+
@fname = "expr_#{CGenerator.make_c_name cl.name}_#{@@serial[cl]}"
|
68
|
+
@@serial[cl] += 1
|
69
|
+
@inspect_str = "#{cl.name}: #{formula}"
|
75
70
|
|
76
|
-
|
77
|
-
|
71
|
+
@generator = proc do
|
72
|
+
sl = cl.shadow_library
|
73
|
+
ssn = cl.shadow_struct_name
|
74
|
+
cont_state_ssn = cl.cont_state_class.shadow_struct_name
|
75
|
+
|
76
|
+
sl.init_library_function.body \
|
77
|
+
"s_init_expr(#{fname}, #{fname.inspect}, #{inspect_str.inspect});"
|
78
78
|
|
79
|
-
|
80
|
-
cont_state_ssn = cl.cont_state_class.shadow_struct.name
|
79
|
+
include_file, source_file = sl.add_file fname
|
81
80
|
|
82
81
|
# We need the struct
|
83
|
-
|
82
|
+
source_file.include(cl.shadow_library_include_file)
|
84
83
|
|
85
|
-
|
84
|
+
expr = self
|
85
|
+
source_file.define(fname).instance_eval do
|
86
86
|
arguments "ComponentShadow *comp_shdw"
|
87
|
+
scope:extern
|
87
88
|
return_type expr.type
|
88
89
|
declare :shadow => %{
|
89
90
|
struct #{ssn} *shadow;
|
@@ -92,20 +93,16 @@ module RedShift; class Expr
|
|
92
93
|
}
|
93
94
|
setup :shadow => %{
|
94
95
|
shadow = (#{ssn} *)comp_shdw;
|
95
|
-
cont_state = (#{cont_state_ssn} *)shadow->cont_state;
|
96
|
+
cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
|
96
97
|
}
|
97
98
|
declare :result => "#{expr.type} result"
|
98
|
-
translation = expr.translate(self, "result",
|
99
|
+
translation = expr.translate(self, "result", cl, 0)
|
99
100
|
body %{
|
100
101
|
#{translation.join("
|
101
102
|
")};
|
102
103
|
return result;
|
103
104
|
}
|
104
105
|
end
|
105
|
-
|
106
|
-
define_c_method :calc_function_pointer do
|
107
|
-
body "shadow->expr = &#{expr_name}"
|
108
|
-
end
|
109
106
|
end
|
110
107
|
end
|
111
108
|
end; end
|
@@ -1,21 +1,26 @@
|
|
1
1
|
module RedShift; class RK4DifferentialFlow
|
2
|
-
def
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
flow_name = "flow_#{CGenerator.make_c_name cl.name}_#{var_name}_#{state}"
|
7
|
-
|
8
|
-
Component::FlowWrapper.make_subclass flow_name do
|
9
|
-
@inspect_str = "#{cl.name}:#{state}: #{var_name} = #{flow.formula}"
|
2
|
+
def make_generator cl, state
|
3
|
+
@fname = "flow_#{CGenerator.make_c_name cl.name}_#{var}_#{state}"
|
4
|
+
@inspect_str = "#{cl.name}:#{state}: #{var} = #{formula}"
|
10
5
|
|
11
|
-
|
12
|
-
|
6
|
+
@generator = proc do
|
7
|
+
sl = cl.shadow_library
|
8
|
+
ssn = cl.shadow_struct_name
|
9
|
+
cont_state_ssn = cl.cont_state_class.shadow_struct_name
|
10
|
+
|
11
|
+
sl.init_library_function.body \
|
12
|
+
"s_init_flow(#{fname}, #{fname.inspect}, #{inspect_str.inspect}, NONALGEBRAIC);"
|
13
|
+
|
14
|
+
include_file, source_file = sl.add_file fname
|
13
15
|
|
14
16
|
# We need the struct
|
15
|
-
|
17
|
+
source_file.include(cl.shadow_library_include_file)
|
16
18
|
|
17
|
-
|
19
|
+
flow = self
|
20
|
+
var_name = @var
|
21
|
+
source_file.define(fname).instance_eval do
|
18
22
|
arguments "ComponentShadow *comp_shdw"
|
23
|
+
scope :extern
|
19
24
|
declare :shadow => %{
|
20
25
|
struct #{ssn} *shadow;
|
21
26
|
struct #{cont_state_ssn} *cont_state;
|
@@ -26,7 +31,7 @@ module RedShift; class RK4DifferentialFlow
|
|
26
31
|
}
|
27
32
|
setup :shadow => %{
|
28
33
|
shadow = (#{ssn} *)comp_shdw;
|
29
|
-
cont_state = (#{cont_state_ssn} *)shadow->cont_state;
|
34
|
+
cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
|
30
35
|
var = &cont_state->#{var_name};
|
31
36
|
time_step = shadow->world->time_step;
|
32
37
|
}
|
@@ -34,32 +39,27 @@ module RedShift; class RK4DifferentialFlow
|
|
34
39
|
shadow->world->rk_level--;
|
35
40
|
} # has to happen before referenced alg flows are called in other setups
|
36
41
|
body %{
|
42
|
+
#{flow.translate(self, "ddt_#{var_name}", cl).join("
|
43
|
+
")};
|
44
|
+
|
37
45
|
switch (shadow->world->rk_level) {
|
38
46
|
case 0:
|
39
|
-
|
40
|
-
")};
|
41
|
-
var->value_1 = var->value_0 + ddt_#{var_name} * time_step/2;
|
47
|
+
var->value[1] = var->value[0] + ddt_#{var_name} * time_step/2;
|
42
48
|
break;
|
43
49
|
|
44
50
|
case 1:
|
45
|
-
|
46
|
-
")};
|
47
|
-
var->value_2 = var->value_0 + ddt_#{var_name} * time_step/2;
|
51
|
+
var->value[2] = var->value[0] + ddt_#{var_name} * time_step/2;
|
48
52
|
break;
|
49
53
|
|
50
54
|
case 2:
|
51
|
-
|
52
|
-
")};
|
53
|
-
var->value_3 = var->value_0 + ddt_#{var_name} * time_step;
|
55
|
+
var->value[3] = var->value[0] + ddt_#{var_name} * time_step;
|
54
56
|
break;
|
55
57
|
|
56
58
|
case 3:
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
(-3*var->value_0 + 2*var->value_1 + 4*var->value_2 +
|
62
|
-
2*var->value_3 + value_4) / 6;
|
59
|
+
value_4 = var->value[0] + ddt_#{var_name} * time_step;
|
60
|
+
var->value[0] =
|
61
|
+
(-3*var->value[0] + 2*var->value[1] + 4*var->value[2] +
|
62
|
+
2*var->value[3] + value_4) / 6;
|
63
63
|
break;
|
64
64
|
|
65
65
|
default:
|
@@ -71,10 +71,6 @@ module RedShift; class RK4DifferentialFlow
|
|
71
71
|
var->rk_level = shadow->world->rk_level;
|
72
72
|
}
|
73
73
|
end
|
74
|
-
|
75
|
-
define_c_method :calc_function_pointer do
|
76
|
-
body "shadow->flow = &#{flow_name}"
|
77
|
-
end
|
78
74
|
end
|
79
75
|
end
|
80
76
|
end; end
|
@@ -12,14 +12,7 @@ module RedShift
|
|
12
12
|
super
|
13
13
|
|
14
14
|
self.purge_source_dir = :delete
|
15
|
-
|
16
|
-
self.show_times_flag =
|
17
|
-
case $REDSHIFT_BUILD_TIMES
|
18
|
-
when nil, false, /\A(false|0*)\z/i
|
19
|
-
false
|
20
|
-
else
|
21
|
-
true
|
22
|
-
end
|
15
|
+
self.show_times_flag = $REDSHIFT_BUILD_TIMES
|
23
16
|
|
24
17
|
if $REDSHIFT_DEBUG
|
25
18
|
include_file.include "<assert.h>"
|
@@ -89,6 +82,7 @@ module RedShift
|
|
89
82
|
def precommit
|
90
83
|
## no need to precommit Component? Other abstract classes?
|
91
84
|
component_classes.each {|cl| cl.precommit}
|
85
|
+
component_classes.each {|cl| cl.generate_wrappers}
|
92
86
|
## optimization?
|
93
87
|
## check if changed
|
94
88
|
end
|
@@ -90,6 +90,10 @@ class World
|
|
90
90
|
shadow_attr_accessor :rk_level => "long rk_level"
|
91
91
|
shadow_attr_accessor :d_tick => "long d_tick"
|
92
92
|
shadow_attr_accessor :alg_nest => "long alg_nest"
|
93
|
+
shadow_attr_accessor :input_depth_limit =>
|
94
|
+
"long input_depth_limit"
|
95
|
+
shadow_attr_accessor :alg_depth_limit =>
|
96
|
+
"long alg_depth_limit"
|
93
97
|
|
94
98
|
shadow_attr_accessor :base_clock => "double base_clock"
|
95
99
|
shadow_attr_accessor :base_step_count =>
|
@@ -209,7 +213,7 @@ class World
|
|
209
213
|
while (var < end_var) {
|
210
214
|
var->rk_level = 0;
|
211
215
|
if (!var->flow) {
|
212
|
-
var->
|
216
|
+
var->value[1] = var->value[2] = var->value[3] = var->value[0];
|
213
217
|
}
|
214
218
|
var++;
|
215
219
|
}
|
@@ -377,7 +381,7 @@ class World
|
|
377
381
|
move_comp(l->ptr[l->len-1], list, next_list);
|
378
382
|
}
|
379
383
|
inline static void remove_comp(VALUE comp, VALUE list,
|
380
|
-
#{World.
|
384
|
+
#{World.shadow_struct_name} *shadow)
|
381
385
|
{
|
382
386
|
ComponentShadow *comp_shdw = get_shadow(comp);
|
383
387
|
assert(RARRAY(list)->ptr[RARRAY(list)->len-1] == comp);
|
@@ -390,7 +394,7 @@ class World
|
|
390
394
|
{
|
391
395
|
double (*fn)(ComponentShadow *), rslt;
|
392
396
|
assert(rb_obj_is_kind_of(expr, ExprWrapperClass));
|
393
|
-
fn = ((#{RedShift::Component::ExprWrapper.
|
397
|
+
fn = ((#{RedShift::Component::ExprWrapper.shadow_struct_name} *)
|
394
398
|
get_shadow(expr))->expr;
|
395
399
|
rslt = (*fn)(get_shadow(comp));
|
396
400
|
return rslt;
|
@@ -400,7 +404,8 @@ class World
|
|
400
404
|
ComponentShadow *(*fn)(ComponentShadow *);
|
401
405
|
ComponentShadow *rslt;
|
402
406
|
assert(rb_obj_is_kind_of(expr, ExprWrapperClass));
|
403
|
-
fn = ((
|
407
|
+
fn = (ComponentShadow *(*)(ComponentShadow *))
|
408
|
+
((#{RedShift::Component::ExprWrapper.shadow_struct_name} *)
|
404
409
|
get_shadow(expr))->expr;
|
405
410
|
rslt = (*fn)(get_shadow(comp));
|
406
411
|
return rslt;
|
@@ -409,7 +414,7 @@ class World
|
|
409
414
|
{
|
410
415
|
int (*fn)(ComponentShadow *), rslt;
|
411
416
|
assert(rb_obj_is_kind_of(guard, GuardWrapperClass));
|
412
|
-
fn = ((#{RedShift::Component::GuardWrapper.
|
417
|
+
fn = ((#{RedShift::Component::GuardWrapper.shadow_struct_name} *)
|
413
418
|
get_shadow(guard))->guard;
|
414
419
|
rslt = (*fn)(get_shadow(comp));
|
415
420
|
return rslt;
|
@@ -459,15 +464,6 @@ class World
|
|
459
464
|
}
|
460
465
|
break;
|
461
466
|
|
462
|
-
case T_CLASS:
|
463
|
-
assert(RTEST(rb_funcall(guard, #{declare_symbol "<"},
|
464
|
-
1, GuardWrapperClass)));
|
465
|
-
guard = rb_funcall(guard, #{declare_symbol :instance}, 0);
|
466
|
-
RARRAY(guards)->ptr[i] = guard;
|
467
|
-
if (!test_cexpr_guard(comp, guard))
|
468
|
-
return 0;
|
469
|
-
break;
|
470
|
-
|
471
467
|
default:
|
472
468
|
assert(0);
|
473
469
|
}
|
@@ -477,7 +473,7 @@ class World
|
|
477
473
|
}
|
478
474
|
|
479
475
|
inline static int comp_can_sync(ComponentShadow *comp_shdw,
|
480
|
-
#{World.
|
476
|
+
#{World.shadow_struct_name} *shadow)
|
481
477
|
{
|
482
478
|
int i, j;
|
483
479
|
int can_sync = 1;
|
@@ -523,7 +519,7 @@ class World
|
|
523
519
|
}
|
524
520
|
|
525
521
|
inline static int eval_events(ComponentShadow *comp_shdw,
|
526
|
-
#{World.
|
522
|
+
#{World.shadow_struct_name} *shadow)
|
527
523
|
{
|
528
524
|
VALUE events = cur_events(comp_shdw);
|
529
525
|
int has_events = RTEST(events);
|
@@ -557,7 +553,7 @@ class World
|
|
557
553
|
|
558
554
|
inline static void cache_new_constant_value(
|
559
555
|
double *dbl_ptr, double value,
|
560
|
-
#{World.
|
556
|
+
#{World.shadow_struct_name} *shadow)
|
561
557
|
{
|
562
558
|
CVCacheEntry *entry;
|
563
559
|
|
@@ -586,7 +582,7 @@ class World
|
|
586
582
|
}
|
587
583
|
|
588
584
|
inline static int assign_new_constant_values(
|
589
|
-
#{World.
|
585
|
+
#{World.shadow_struct_name} *shadow)
|
590
586
|
{
|
591
587
|
int did_reset = shadow->cv_cache_used;
|
592
588
|
|
@@ -606,7 +602,7 @@ class World
|
|
606
602
|
|
607
603
|
inline static void cache_new_link(
|
608
604
|
ComponentShadow **link_ptr, VALUE value,
|
609
|
-
#{World.
|
605
|
+
#{World.shadow_struct_name} *shadow)
|
610
606
|
{
|
611
607
|
LinkCacheEntry *entry;
|
612
608
|
|
@@ -634,7 +630,7 @@ class World
|
|
634
630
|
}
|
635
631
|
|
636
632
|
inline static int assign_new_links(
|
637
|
-
#{World.
|
633
|
+
#{World.shadow_struct_name} *shadow)
|
638
634
|
{
|
639
635
|
int did_reset = shadow->link_cache_used;
|
640
636
|
|
@@ -658,7 +654,7 @@ class World
|
|
658
654
|
}
|
659
655
|
|
660
656
|
inline static void cache_new_port(VALUE input_port, VALUE other_port,
|
661
|
-
#{World.
|
657
|
+
#{World.shadow_struct_name} *shadow)
|
662
658
|
{
|
663
659
|
PortCacheEntry *entry;
|
664
660
|
|
@@ -686,7 +682,7 @@ class World
|
|
686
682
|
}
|
687
683
|
|
688
684
|
inline static int assign_new_ports(
|
689
|
-
#{World.
|
685
|
+
#{World.shadow_struct_name} *shadow)
|
690
686
|
{
|
691
687
|
int did_reset = shadow->port_cache_used;
|
692
688
|
|
@@ -706,7 +702,7 @@ class World
|
|
706
702
|
}
|
707
703
|
|
708
704
|
inline static int eval_continuous_resets(ComponentShadow *comp_shdw,
|
709
|
-
#{World.
|
705
|
+
#{World.shadow_struct_name} *shadow)
|
710
706
|
{
|
711
707
|
VALUE resets = cur_resets(comp_shdw);
|
712
708
|
VALUE cont_resets;
|
@@ -770,7 +766,7 @@ class World
|
|
770
766
|
//%% rb_funcall(comp_shdw->cont_state->self,//
|
771
767
|
//%% #{declare_symbol :var_at_index},1,INT2NUM(i)),
|
772
768
|
//%% rb_float_new(new_value));
|
773
|
-
var->
|
769
|
+
var->value[1] = new_value;
|
774
770
|
var->reset = 1;
|
775
771
|
}
|
776
772
|
}
|
@@ -780,7 +776,7 @@ class World
|
|
780
776
|
}
|
781
777
|
|
782
778
|
inline static int eval_constant_resets(ComponentShadow *comp_shdw,
|
783
|
-
#{World.
|
779
|
+
#{World.shadow_struct_name} *shadow)
|
784
780
|
{
|
785
781
|
VALUE resets = cur_resets(comp_shdw);
|
786
782
|
VALUE const_resets;
|
@@ -879,7 +875,7 @@ class World
|
|
879
875
|
}
|
880
876
|
|
881
877
|
inline static int eval_port_connects(ComponentShadow *comp_shdw,
|
882
|
-
#{World.
|
878
|
+
#{World.shadow_struct_name} *shadow)
|
883
879
|
{
|
884
880
|
VALUE connects = cur_connects(comp_shdw);
|
885
881
|
|
@@ -937,7 +933,7 @@ class World
|
|
937
933
|
for (i = len; i > 0; i--, var++) {
|
938
934
|
if (var->reset) {
|
939
935
|
var->reset = 0;
|
940
|
-
var->
|
936
|
+
var->value[0] = var->value[1];
|
941
937
|
did_reset = 1;
|
942
938
|
}
|
943
939
|
}
|
@@ -945,7 +941,7 @@ class World
|
|
945
941
|
}
|
946
942
|
|
947
943
|
inline static void do_actions(ComponentShadow *comp_shdw, VALUE actions,
|
948
|
-
#{World.
|
944
|
+
#{World.shadow_struct_name} *shadow)
|
949
945
|
{
|
950
946
|
long i;
|
951
947
|
VALUE comp = comp_shdw->self;
|
@@ -969,7 +965,7 @@ class World
|
|
969
965
|
}
|
970
966
|
|
971
967
|
inline static void update_all_alg_vars(ComponentShadow *comp_shdw,
|
972
|
-
#{World.
|
968
|
+
#{World.shadow_struct_name} *shadow)
|
973
969
|
{
|
974
970
|
ContVar *vars = (ContVar *)&FIRST_CONT_VAR(comp_shdw);
|
975
971
|
long count = comp_shdw->var_count;
|
@@ -985,7 +981,7 @@ class World
|
|
985
981
|
}
|
986
982
|
|
987
983
|
inline static void start_trans(ComponentShadow *comp_shdw,
|
988
|
-
#{World.
|
984
|
+
#{World.shadow_struct_name} *shadow,
|
989
985
|
VALUE trans, VALUE dest)
|
990
986
|
{
|
991
987
|
comp_shdw->trans = trans;
|
@@ -994,7 +990,7 @@ class World
|
|
994
990
|
}
|
995
991
|
|
996
992
|
inline static void finish_trans(ComponentShadow *comp_shdw,
|
997
|
-
#{World.
|
993
|
+
#{World.shadow_struct_name} *shadow)
|
998
994
|
{ //%% hook_finish_transition(comp_shdw->self, comp_shdw->trans,
|
999
995
|
//%% comp_shdw->dest);
|
1000
996
|
if (comp_shdw->state != comp_shdw->dest) {
|
@@ -1024,16 +1020,16 @@ class World
|
|
1024
1020
|
if (var->ck_strict) {
|
1025
1021
|
var->ck_strict = 0;
|
1026
1022
|
(*var->flow)(comp_shdw);
|
1027
|
-
if (var->
|
1023
|
+
if (var->value[0] != var->value[1]) {
|
1028
1024
|
rb_funcall(comp_shdw->self,
|
1029
1025
|
#{declare_symbol :handle_strictness_error}, 3, INT2NUM(i),
|
1030
|
-
rb_float_new(var->
|
1026
|
+
rb_float_new(var->value[0]), rb_float_new(var->value[1]));
|
1031
1027
|
}
|
1032
1028
|
}
|
1033
1029
|
}
|
1034
1030
|
}
|
1035
1031
|
|
1036
|
-
inline static void check_guards(#{World.
|
1032
|
+
inline static void check_guards(#{World.shadow_struct_name} *shadow,
|
1037
1033
|
int sync_retry)
|
1038
1034
|
{
|
1039
1035
|
VALUE comp;
|
@@ -1109,7 +1105,7 @@ class World
|
|
1109
1105
|
assert(RARRAY(shadow->prev_awake)->len == 0);
|
1110
1106
|
}
|
1111
1107
|
|
1112
|
-
inline static void do_sync_phase(#{World.
|
1108
|
+
inline static void do_sync_phase(#{World.shadow_struct_name} *shadow)
|
1113
1109
|
{
|
1114
1110
|
VALUE comp;
|
1115
1111
|
ComponentShadow *comp_shdw;
|