redshift 1.3.21 → 1.3.22
Sign up to get free protection for your applications and to get access to all the features.
- 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;
|