2018-12-17 20:09:47 +01:00
#!/usr/bin/env python3
# Copyright (c) 2019, Nordic Semiconductor
# SPDX-License-Identifier: BSD-3-Clause
import os
import shutil
import sys
import dtlib
2019-09-21 04:14:33 +02:00
# Test suite for dtlib.py. Run it directly as an executable, in this directory:
2018-12-17 20:09:47 +01:00
#
2019-09-21 04:14:33 +02:00
# $ ./testdtlib.py
2018-12-17 20:09:47 +01:00
# TODO: Factor out common code from error tests
def run ( ) :
"""
Runs all dtlib tests . Immediately exits with status 1 and a message on
stderr on test suite failures .
"""
# Note: All code is within this function, even though some triple-quoted
# strings are unindented to make things less awkward
def fail ( msg ) :
sys . exit ( " test failed: {} " . format ( msg ) )
def parse ( dts , include_path = ( ) ) :
open ( " .tmp.dts " , " w " ) . write ( dts )
return dtlib . DT ( " .tmp.dts " , include_path )
def verify_parse ( dts , expected , include_path = ( ) ) :
# The [1:] is so that the first line can be put on a separate line
# after """
dt = parse ( dts [ 1 : ] , include_path )
actual = str ( dt )
expected = expected [ 1 : - 1 ]
if actual != expected :
fail ( " expected ' {} ' to parse as ' {} ' , parsed as ' {} ' "
. format ( dts , expected , actual ) )
return dt
def verify_error ( dts , msg ) :
prefix = " expected ' {} ' to generate the error ' {} ' , generated " \
. format ( dts , msg )
try :
parse ( dts [ 1 : ] )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
# These might already exist from failed earlier runs
try :
os . mkdir ( " .tmp " )
except OSError :
pass
try :
os . mkdir ( " .tmp2 " )
except OSError :
pass
#
# Test cell parsing
#
verify_parse ( """
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
a ;
b = < > ;
c = [ ] ;
d = < 10 20 > ;
e = < 0 U 1 L 2 UL 3 LL 4 ULL > ;
f = < 0x10 0x20 > ;
g = < 010 020 > ;
h = / bits / 8 < 0x10 0x20 ( - 1 ) > ;
i = / bits / 16 < 0x10 0x20 ( - 1 ) > ;
j = / bits / 32 < 0x10 0x20 ( - 1 ) > ;
k = / bits / 64 < 0x10 0x20 ( - 1 ) > ;
2019-08-13 08:23:19 +02:00
l = < ' a ' ' b ' ' c ' > ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a ;
2019-08-09 00:44:33 +02:00
b ;
c ;
d = < 0xa 0x14 > ;
e = < 0x0 0x1 0x2 0x3 0x4 > ;
f = < 0x10 0x20 > ;
g = < 0x8 0x10 > ;
h = [ 10 20 FF ] ;
i = / bits / 16 < 0x10 0x20 0xffff > ;
j = < 0x10 0x20 0xffffffff > ;
k = / bits / 64 < 0x10 0x20 0xffffffffffffffff > ;
2019-08-13 08:23:19 +02:00
l = < 0x61 0x62 0x63 > ;
2018-12-17 20:09:47 +01:00
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
a = / bits / 16 < 0x10000 > ;
} ;
""" ,
" .tmp.dts:4 (column 18): parse error: 65536 does not fit in 16 bits " )
verify_error ( """
/ dts - v1 / ;
/ {
a = < 0x100000000 > ;
} ;
""" ,
" .tmp.dts:4 (column 8): parse error: 4294967296 does not fit in 32 bits " )
verify_error ( """
/ dts - v1 / ;
/ {
a = / bits / 128 < 0 > ;
} ;
""" ,
" .tmp.dts:4 (column 13): parse error: expected 8, 16, 32, or 64 " )
#
# Test bytes parsing
#
verify_parse ( """
/ dts - v1 / ;
/ {
a = [ ] ;
b = [ 12 34 ] ;
c = [ 1234 ] ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a ;
b = [ 12 34 ] ;
c = [ 12 34 ] ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
a = [ 123 ] ;
} ;
""" ,
" .tmp.dts:4 (column 10): parse error: expected two-digit byte or ' ] ' " )
#
# Test string parsing
#
verify_parse ( r """
/ dts - v1 / ;
/ {
a = " " ;
b = " ABC " ;
2019-08-09 00:44:33 +02:00
c = " \\ \" \xab \377 \a \b \t \n \v \f \r " ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
2019-08-09 00:44:33 +02:00
r """
2018-12-17 20:09:47 +01:00
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
a = " " ;
b = " ABC " ;
c = " \\ \" \xab \xff \a \b \t \n \v \f \r " ;
2018-12-17 20:09:47 +01:00
} ;
""" )
verify_error ( r """
/ dts - v1 / ;
/ {
a = " \400 " ;
} ;
""" ,
" .tmp.dts:4 (column 6): parse error: octal escape out of range (> 255) " )
2019-08-13 08:23:19 +02:00
#
# Test character literal parsing
#
verify_parse ( r """
/ dts - v1 / ;
/ {
a = < ' \' ' > ;
b = < ' \x12 ' > ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a = < 0x27 > ;
b = < 0x12 > ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
/ / Character literals are not allowed at the top level
a = ' x ' ;
} ;
""" ,
" .tmp.dts:5 (column 6): parse error: malformed value " )
verify_error ( """
/ dts - v1 / ;
/ {
a = < ' ' > ;
} ;
""" ,
" .tmp.dts:4 (column 7): parse error: character literals must be length 1 " )
verify_error ( """
/ dts - v1 / ;
/ {
a = < ' 12 ' > ;
} ;
""" ,
" .tmp.dts:4 (column 7): parse error: character literals must be length 1 " )
2018-12-17 20:09:47 +01:00
#
# Test /incbin/
#
open ( " .tmp.bin " , " wb " ) . write ( b " \00 \01 \02 \03 " )
verify_parse ( """
/ dts - v1 / ;
/ {
a = / incbin / ( " .tmp.bin " ) ;
b = / incbin / ( " .tmp.bin " , 1 , 1 ) ;
c = / incbin / ( " .tmp.bin " , 1 , 2 ) ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a = [ 00 01 02 03 ] ;
b = [ 01 ] ;
c = [ 01 02 ] ;
} ;
""" )
open ( " .tmp/in_subdir " , " wb " ) . write ( b " \00 \01 \02 " )
verify_parse ( """
/ dts - v1 / ;
/ {
a = / incbin / ( " in_subdir " ) ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a = [ 00 01 02 ] ;
} ;
""" ,
include_path = ( " .tmp " , ) )
verify_error ( r """
/ dts - v1 / ;
/ {
a = / incbin / ( " missing " ) ;
} ;
""" ,
" .tmp.dts:4 (column 25): parse error: ' missing ' could not be found " )
#
# Test node merging
#
verify_parse ( """
/ dts - v1 / ;
/ {
l1 : l2 : l1 : foo {
foo1 = [ 01 ] ;
l4 : l5 : bar {
bar1 = [ 01 ] ;
} ;
} ;
} ;
l3 : & l1 {
foo2 = [ 02 ] ;
l6 : l7 : bar {
bar2 = [ 02 ] ;
} ;
} ;
& l3 {
foo3 = [ 03 ] ;
} ;
& { / foo } {
foo4 = [ 04 ] ;
} ;
& { / foo / bar } {
bar3 = [ 03 ] ;
l8 : baz { } ;
} ;
/ {
} ;
/ {
top = [ 01 ] ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
top = [ 01 ] ;
l1 : l2 : l3 : foo {
foo1 = [ 01 ] ;
foo2 = [ 02 ] ;
foo3 = [ 03 ] ;
foo4 = [ 04 ] ;
l4 : l5 : l6 : l7 : bar {
bar1 = [ 01 ] ;
bar2 = [ 02 ] ;
bar3 = [ 03 ] ;
l8 : baz {
} ;
} ;
} ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
} ;
& missing {
} ;
""" ,
" .tmp.dts:6 (column 1): parse error: undefined node label ' missing ' " )
verify_error ( """
/ dts - v1 / ;
/ {
} ;
& { foo } {
} ;
""" ,
2019-08-15 10:00:55 +02:00
" .tmp.dts:6 (column 1): parse error: node path ' foo ' does not start with ' / ' " )
2018-12-17 20:09:47 +01:00
verify_error ( """
/ dts - v1 / ;
/ {
} ;
& { / foo } {
} ;
""" ,
2019-08-15 10:00:55 +02:00
" .tmp.dts:6 (column 1): parse error: component ' foo ' in path ' /foo ' does not exist " )
2018-12-17 20:09:47 +01:00
#
# Test property labels
#
def verify_label2prop ( label , expected ) :
actual = dt . label2prop [ label ] . name
if actual != expected :
fail ( " expected label ' {} ' to map to prop ' {} ' , mapped to prop ' {} ' "
. format ( label , expected , actual ) )
dt = verify_parse ( """
/ dts - v1 / ;
/ {
a ;
b ;
l2 : c ;
l4 : l5 : l5 : l4 : d = < 0 > ;
} ;
/ {
l1 : b ;
l3 : c ;
l6 : d ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
a ;
l1 : b ;
l2 : l3 : c ;
2019-08-09 00:44:33 +02:00
l4 : l5 : l6 : d = < 0x0 > ;
2018-12-17 20:09:47 +01:00
} ;
""" )
verify_label2prop ( " l1 " , " b " )
verify_label2prop ( " l2 " , " c " )
verify_label2prop ( " l3 " , " c " )
verify_label2prop ( " l4 " , " d " )
verify_label2prop ( " l5 " , " d " )
verify_label2prop ( " l6 " , " d " )
#
# Test offset labels
#
def verify_label2offset ( label , expected_prop , expected_offset ) :
actual_prop , actual_offset = dt . label2prop_offset [ label ]
actual_prop = actual_prop . name
if ( actual_prop , actual_offset ) != ( expected_prop , expected_offset ) :
fail ( " expected label ' {} ' to map to offset {} on prop ' {} ' , "
" mapped to offset {} on prop ' {} ' "
. format ( label , expected_offset , expected_prop , actual_offset ,
actual_prop ) )
dt = verify_parse ( """
/ dts - v1 / ;
/ {
2019-08-16 09:35:03 +02:00
a = l01 : l02 : < l03 : & node l04 : l05 : 2 l06 : > ,
l07 : l08 : [ l09 : 03 l10 : l11 : 04 l12 : l13 : ] l14 : , " A " ;
2018-12-17 20:09:47 +01:00
2019-08-16 09:35:03 +02:00
b = < 0 > l23 : l24 : ;
2018-12-17 20:09:47 +01:00
2019-08-16 09:35:03 +02:00
node : node {
} ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
a = l01 : l02 : < l03 : & node l04 : l05 : 0x2 l06 : l07 : l08 : > , [ l09 : 03 l10 : l11 : 04 l12 : l13 : l14 : ] , " A " ;
2019-08-09 00:44:33 +02:00
b = < 0x0 l23 : l24 : > ;
2018-12-17 20:09:47 +01:00
node : node {
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
verify_label2offset ( " l01 " , " a " , 0 )
2019-08-09 00:44:33 +02:00
verify_label2offset ( " l02 " , " a " , 0 )
verify_label2offset ( " l04 " , " a " , 4 )
2018-12-17 20:09:47 +01:00
verify_label2offset ( " l05 " , " a " , 4 )
2019-08-09 00:44:33 +02:00
verify_label2offset ( " l06 " , " a " , 8 )
verify_label2offset ( " l09 " , " a " , 8 )
verify_label2offset ( " l10 " , " a " , 9 )
2018-12-17 20:09:47 +01:00
verify_label2offset ( " l23 " , " b " , 4 )
verify_label2offset ( " l24 " , " b " , 4 )
#
# Test unit_addr
#
def verify_unit_addr ( path , expected ) :
node = dt . get_node ( path )
if node . unit_addr != expected :
fail ( " expected {!r} to have unit_addr ' {} ' , was ' {} ' "
. format ( node , expected , node . unit_addr ) )
dt = verify_parse ( """
/ dts - v1 / ;
/ {
no - unit - addr {
} ;
unit - addr @ABC {
} ;
unit - addr - non - numeric @foo - bar {
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
no - unit - addr {
} ;
unit - addr @ABC {
} ;
unit - addr - non - numeric @foo - bar {
} ;
} ;
""" )
verify_unit_addr ( " /no-unit-addr " , " " )
verify_unit_addr ( " /unit-addr@ABC " , " ABC " )
verify_unit_addr ( " /unit-addr-non-numeric@foo-bar " , " foo-bar " )
#
# Test node path references
#
verify_parse ( """
/ dts - v1 / ;
/ {
a = & label ;
2019-08-09 00:44:33 +02:00
b = [ 01 ] , & label ;
c = [ 01 ] , & label , < 2 > ;
d = & { / abc } ;
2018-12-17 20:09:47 +01:00
label : abc {
2019-08-09 00:44:33 +02:00
e = & label ;
f = & { / abc } ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
a = & label ;
b = [ 01 ] , & label ;
c = [ 01 ] , & label , < 0x2 > ;
d = & { / abc } ;
2018-12-17 20:09:47 +01:00
label : abc {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
e = & label ;
f = & { / abc } ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
sub {
x = & missing ;
} ;
} ;
""" ,
" /sub: undefined node label ' missing ' " )
verify_error ( """
/ dts - v1 / ;
/ {
sub {
x = & { / sub / missing } ;
} ;
} ;
""" ,
2019-08-15 10:00:55 +02:00
" /sub: component ' missing ' in path ' /sub/missing ' does not exist " )
2018-12-17 20:09:47 +01:00
#
# Test phandles
#
verify_parse ( """
/ dts - v1 / ;
/ {
x = < & a & { / b } & c > ;
dummy1 {
phandle = < 1 > ;
} ;
dummy2 {
phandle = < 3 > ;
} ;
a : a {
} ;
b {
} ;
c : c {
phandle = < 0xFF > ;
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
x = < & a & { / b } & c > ;
2018-12-17 20:09:47 +01:00
dummy1 {
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
dummy2 {
2019-08-09 00:44:33 +02:00
phandle = < 0x3 > ;
2018-12-17 20:09:47 +01:00
} ;
a : a {
2019-08-09 00:44:33 +02:00
phandle = < 0x2 > ;
2018-12-17 20:09:47 +01:00
} ;
b {
2019-08-09 00:44:33 +02:00
phandle = < 0x4 > ;
2018-12-17 20:09:47 +01:00
} ;
c : c {
2019-08-09 00:44:33 +02:00
phandle = < 0xff > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
# Check that a node can be assigned a phandle to itself. This just forces a
# phandle to be allocated on it. The C tools support this too.
verify_parse ( """
/ dts - v1 / ;
/ {
dummy {
phandle = < 1 > ;
} ;
a {
foo : phandle = < & { / a } > ;
} ;
label : b {
bar : phandle = < & label > ;
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dummy {
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
a {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
foo : phandle = < & { / a } > ;
2018-12-17 20:09:47 +01:00
} ;
label : b {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
bar : phandle = < & label > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
sub {
x = < & missing > ;
} ;
} ;
""" ,
" /sub: undefined node label ' missing ' " )
verify_error ( """
/ dts - v1 / ;
/ {
a : sub {
x = / bits / 16 < & a > ;
} ;
} ;
""" ,
" .tmp.dts:5 (column 19): parse error: phandle references are only allowed in arrays with 32-bit elements " )
verify_error ( """
/ dts - v1 / ;
/ {
foo {
phandle = [ 00 ] ;
} ;
} ;
""" ,
" /foo: bad phandle length (1), expected 4 bytes " )
verify_error ( """
/ dts - v1 / ;
/ {
foo {
phandle = < 0 > ;
} ;
} ;
""" ,
" /foo: bad value 0x00000000 for phandle " )
verify_error ( """
/ dts - v1 / ;
/ {
foo {
phandle = < ( - 1 ) > ;
} ;
} ;
""" ,
" /foo: bad value 0xffffffff for phandle " )
verify_error ( """
/ dts - v1 / ;
/ {
foo {
phandle = < 17 > ;
} ;
bar {
phandle = < 17 > ;
} ;
} ;
""" ,
" /bar: duplicated phandle 0x11 (seen before at /foo) " )
verify_error ( """
/ dts - v1 / ;
/ {
foo {
phandle = < & { / bar } > ;
} ;
bar {
} ;
} ;
""" ,
" /foo: phandle refers to another node " )
# Test phandle2node
def verify_phandle2node ( prop , offset , expected_name ) :
phandle = dtlib . to_num ( dt . root . props [ prop ] . value [ offset : offset + 4 ] )
actual_name = dt . phandle2node [ phandle ] . name
if actual_name != expected_name :
fail ( " expected {} to be a phandle for {} , was a phandle for {} "
. format ( prop , expected_name , actual_name ) )
dt = parse ( """
/ dts - v1 / ;
/ {
phandle_ = < & { / node1 } 0 1 > ;
phandles = < 0 & { / node2 } 1 & { / node3 } > ;
node1 {
phandle = < 123 > ;
} ;
node2 {
} ;
node3 {
} ;
} ;
""" )
verify_phandle2node ( " phandle_ " , 0 , " node1 " )
verify_phandle2node ( " phandles " , 4 , " node2 " )
verify_phandle2node ( " phandles " , 12 , " node3 " )
#
# Test mixed value type assignments
#
verify_parse ( """
/ dts - v1 / ;
/ {
x = / bits / 8 < 0xFF 0xFF > ,
& abc ,
< 0xFF & abc 0xFF & abc > ,
& abc ,
[ FF FF ] ,
" abc " ;
abc : abc {
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
x = [ FF FF ] , & abc , < 0xff & abc 0xff & abc > , & abc , [ FF FF ] , " abc " ;
2018-12-17 20:09:47 +01:00
abc : abc {
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
#
# Test property deletion
#
verify_parse ( """
/ dts - v1 / ;
/ {
keep = < 1 > ;
delete = < & sub > , & sub ;
/ delete - property / missing ;
/ delete - property / delete ;
sub : sub {
y = < & sub > , & sub ;
} ;
} ;
& sub {
/ delete - property / y ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
keep = < 0x1 > ;
2018-12-17 20:09:47 +01:00
sub : sub {
} ;
} ;
""" )
#
# Test node deletion
#
verify_parse ( """
/ dts - v1 / ;
/ {
sub1 {
x = < 1 > ;
sub2 {
x = < & sub > , & sub ;
} ;
/ delete - node / sub2 ;
} ;
sub3 : sub3 {
x = < & sub > , & sub ;
} ;
sub4 {
x = < & sub > , & sub ;
} ;
} ;
/ delete - node / & sub3 ;
/ delete - node / & { / sub4 } ;
""" ,
"""
/ dts - v1 / ;
/ {
sub1 {
2019-08-09 00:44:33 +02:00
x = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
} ;
/ delete - node / & missing ;
""" ,
" .tmp.dts:6 (column 15): parse error: undefined node label ' missing ' " )
2019-08-15 10:00:55 +02:00
verify_error ( """
/ dts - v1 / ;
/ delete - node / {
""" ,
" .tmp.dts:3 (column 15): parse error: expected label (&foo) or path (& { /foo/bar}) reference " )
2018-12-17 20:09:47 +01:00
#
# Test /include/ (which is handled in the lexer)
#
# Verify that /include/ searches the current directory
open ( " .tmp/same-dir-1 " , " w " ) . write ( """
x = [ 00 ] ;
/ include / " same-dir-2 "
""" )
open ( " .tmp/same-dir-2 " , " w " ) . write ( """
y = [ 01 ] ;
/ include / " same-dir-3 "
""" )
open ( " .tmp/same-dir-3 " , " w " ) . write ( """
z = [ 02 ] ;
""" )
verify_parse ( """
/ dts - v1 / ;
/ {
/ include / " .tmp/same-dir-1 "
} ;
""" ,
"""
/ dts - v1 / ;
/ {
x = [ 00 ] ;
y = [ 01 ] ;
z = [ 02 ] ;
} ;
""" )
# Test tricky includes and include paths
open ( " .tmp2.dts " , " w " ) . write ( """
/ dts - v1 / ;
/ {
""" )
open ( " .tmp3.dts " , " w " ) . write ( """
x = < 1 > ;
""" )
open ( " .tmp/via-include-path-1 " , " w " ) . write ( """
= / include / " via-include-path-2 "
""" )
open ( " .tmp2/via-include-path-2 " , " w " ) . write ( """
< 2 > ;
} ;
""" )
verify_parse ( """
/ include / " .tmp2.dts "
/ include / " .tmp3.dts "
y / include / " via-include-path-1 "
""" ,
"""
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
x = < 0x1 > ;
y = < 0x2 > ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
include_path = ( " .tmp " , " .tmp2 " , ) )
verify_error ( """
/ include / " missing "
""" ,
" .tmp.dts:1 (column 1): parse error: ' missing ' could not be found " )
# Verify that an error in an included file points to the right location
open ( " .tmp2.dts " , " w " ) . write ( """ \
x
""" )
verify_error ( """
/ include / " .tmp2.dts "
""" ,
" .tmp2.dts:3 (column 3): parse error: expected ' /dts-v1/; ' at start of file " )
# Test recursive /include/ detection
open ( " .tmp2.dts " , " w " ) . write ( """ \
/ include / " .tmp3.dts "
""" )
open ( " .tmp3.dts " , " w " ) . write ( """ \
/ include / " .tmp.dts "
""" )
verify_error ( """
/ include / " .tmp2.dts "
""" ,
""" \
. tmp3 . dts : 1 ( column 1 ) : parse error : recursive / include / :
. tmp . dts : 1 - >
. tmp2 . dts : 1 - >
. tmp3 . dts : 1 - >
. tmp . dts \
""" )
verify_error ( """
/ include / " .tmp.dts "
""" ,
""" \
. tmp . dts : 1 ( column 1 ) : parse error : recursive / include / :
. tmp . dts : 1 - >
. tmp . dts \
""" )
#
# Test /omit-if-no-ref/
#
verify_parse ( """
/ dts - v1 / ;
/ {
x = < & { / referenced } > , & referenced2 ;
/ omit - if - no - ref / referenced {
} ;
referenced2 : referenced2 {
} ;
/ omit - if - no - ref / unreferenced {
} ;
l1 : / omit - if - no - ref / unreferenced2 {
} ;
/ omit - if - no - ref / l2 : unreferenced3 {
} ;
unreferenced4 : unreferenced4 {
} ;
unreferenced5 {
} ;
} ;
/ omit - if - no - ref / & referenced2 ;
/ omit - if - no - ref / & unreferenced4 ;
/ omit - if - no - ref / & { / unreferenced5 } ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
x = < & { / referenced } > , & referenced2 ;
2018-12-17 20:09:47 +01:00
referenced {
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
referenced2 : referenced2 {
} ;
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
/ omit - if - no - ref / x = " " ;
} ;
""" ,
" .tmp.dts:4 (column 21): parse error: /omit-if-no-ref/ can only be used on nodes " )
verify_error ( """
/ dts - v1 / ;
/ {
/ omit - if - no - ref / x ;
} ;
""" ,
" .tmp.dts:4 (column 20): parse error: /omit-if-no-ref/ can only be used on nodes " )
verify_error ( """
/ dts - v1 / ;
/ {
/ omit - if - no - ref / {
} ;
} ;
""" ,
" .tmp.dts:4 (column 19): parse error: expected node or property name " )
verify_error ( """
/ dts - v1 / ;
/ {
/ omit - if - no - ref / = < 0 > ;
} ;
""" ,
" .tmp.dts:4 (column 19): parse error: expected node or property name " )
verify_error ( """
/ dts - v1 / ;
/ {
} ;
/ omit - if - no - ref / & missing ;
""" ,
" .tmp.dts:6 (column 18): parse error: undefined node label ' missing ' " )
2019-08-15 10:00:55 +02:00
verify_error ( """
/ dts - v1 / ;
/ omit - if - no - ref / {
""" ,
" .tmp.dts:3 (column 18): parse error: expected label (&foo) or path (& { /foo/bar}) reference " )
2018-12-17 20:09:47 +01:00
#
# Test expressions
#
verify_parse ( """
/ dts - v1 / ;
/ {
ter1 = < ( 0 ? 1 : 0 ? 2 : 3 ) > ;
ter2 = < ( 0 ? 1 : 1 ? 2 : 3 ) > ;
ter3 = < ( 1 ? 1 : 0 ? 2 : 3 ) > ;
ter4 = < ( 1 ? 1 : 1 ? 2 : 3 ) > ;
or1 = < ( 0 | | 0 ) > ;
or2 = < ( 0 | | 1 ) > ;
or3 = < ( 1 | | 0 ) > ;
or4 = < ( 1 | | 1 ) > ;
and1 = < ( 0 & & 0 ) > ;
and2 = < ( 0 & & 1 ) > ;
and3 = < ( 1 & & 0 ) > ;
and4 = < ( 1 & & 1 ) > ;
bitor = < ( 1 | 2 ) > ;
bitxor = < ( 7 ^ 2 ) > ;
bitand = < ( 3 & 6 ) > ;
eq1 = < ( 1 == 0 ) > ;
eq2 = < ( 1 == 1 ) > ;
neq1 = < ( 1 != 0 ) > ;
neq2 = < ( 1 != 1 ) > ;
lt1 = < ( 1 < 2 ) > ;
lt2 = < ( 2 < 2 ) > ;
lt3 = < ( 3 < 2 ) > ;
lteq1 = < ( 1 < = 2 ) > ;
lteq2 = < ( 2 < = 2 ) > ;
lteq3 = < ( 3 < = 2 ) > ;
gt1 = < ( 1 > 2 ) > ;
gt2 = < ( 2 > 2 ) > ;
gt3 = < ( 3 > 2 ) > ;
gteq1 = < ( 1 > = 2 ) > ;
gteq2 = < ( 2 > = 2 ) > ;
gteq3 = < ( 3 > = 2 ) > ;
lshift = < ( 2 << 3 ) > ;
rshift = < ( 16 >> 3 ) > ;
add = < ( 3 + 4 ) > ;
sub = < ( 7 - 4 ) > ;
mul = < ( 3 * 4 ) > ;
div = < ( 11 / 3 ) > ;
mod = < ( 11 % 3 ) > ;
unary_minus = < ( - 3 ) > ;
bitnot = < ( ~ 1 ) > ;
not0 = < ( ! - 1 ) > ;
not1 = < ( ! 0 ) > ;
not2 = < ( ! 1 ) > ;
not3 = < ( ! 2 ) > ;
nest = < ( ( ( - - 3 ) + ( - 2 ) ) * ( - - ( - 2 ) ) ) > ;
2019-08-13 08:23:19 +02:00
char_lits = < ( ' a ' + ' b ' ) > ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
"""
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
ter1 = < 0x3 > ;
ter2 = < 0x2 > ;
ter3 = < 0x1 > ;
ter4 = < 0x1 > ;
or1 = < 0x0 > ;
or2 = < 0x1 > ;
or3 = < 0x1 > ;
or4 = < 0x1 > ;
and1 = < 0x0 > ;
and2 = < 0x0 > ;
and3 = < 0x0 > ;
and4 = < 0x1 > ;
bitor = < 0x3 > ;
bitxor = < 0x5 > ;
bitand = < 0x2 > ;
eq1 = < 0x0 > ;
eq2 = < 0x1 > ;
neq1 = < 0x1 > ;
neq2 = < 0x0 > ;
lt1 = < 0x1 > ;
lt2 = < 0x0 > ;
lt3 = < 0x0 > ;
lteq1 = < 0x1 > ;
lteq2 = < 0x1 > ;
lteq3 = < 0x0 > ;
gt1 = < 0x0 > ;
gt2 = < 0x0 > ;
gt3 = < 0x1 > ;
gteq1 = < 0x0 > ;
gteq2 = < 0x1 > ;
gteq3 = < 0x1 > ;
lshift = < 0x10 > ;
rshift = < 0x2 > ;
add = < 0x7 > ;
sub = < 0x3 > ;
mul = < 0xc > ;
div = < 0x3 > ;
mod = < 0x2 > ;
unary_minus = < 0xfffffffd > ;
bitnot = < 0xfffffffe > ;
not0 = < 0x0 > ;
not1 = < 0x1 > ;
not2 = < 0x0 > ;
not3 = < 0x0 > ;
nest = < 0xfffffffe > ;
2019-08-13 08:23:19 +02:00
char_lits = < 0xc3 > ;
2018-12-17 20:09:47 +01:00
} ;
""" )
verify_error ( """
/ dts - v1 / ;
/ {
a = < ( 1 / ( - 1 + 1 ) ) > ;
} ;
""" ,
" .tmp.dts:4 (column 18): parse error: division by zero " )
verify_error ( """
/ dts - v1 / ;
/ {
a = < ( 1 % 0 ) > ;
} ;
""" ,
" .tmp.dts:4 (column 11): parse error: division by zero " )
#
# Test comment removal
#
verify_parse ( """
/ * * / / dts - v1 / / * * / ; / /
/ /
/ / foo
/ / * * / { / / foo
x / * * / = / *
foo
* / < / * * / 1 / * * * / > / * * * * / ; / * * / } / * / * * / ;
""" ,
"""
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
x = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
""" )
#
# Test get_node()
#
def verify_path_is ( path , node_name ) :
try :
node = dt . get_node ( path )
if node . name != node_name :
fail ( " expected {} to lead to {} , lead to {} "
. format ( path , node_name , node . name ) )
except dtlib . DTError :
2019-09-04 14:43:17 +02:00
fail ( " no node found for path " + path )
2018-12-17 20:09:47 +01:00
def verify_path_error ( path , msg ) :
prefix = " expected looking up ' {} ' to generate the error ' {} ' , " \
" generated " . format ( path , msg )
try :
dt . get_node ( path )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
def verify_path_exists ( path ) :
if not dt . has_node ( path ) :
fail ( " expected path ' {} ' to exist, didn ' t " . format ( path ) )
def verify_path_missing ( path ) :
if dt . has_node ( path ) :
fail ( " expected path ' {} ' to not exist, did " . format ( path ) )
dt = parse ( """
/ dts - v1 / ;
/ {
foo {
bar {
} ;
} ;
baz {
} ;
} ;
""" )
verify_path_is ( " / " , " / " )
verify_path_is ( " // " , " / " )
verify_path_is ( " /// " , " / " )
verify_path_is ( " /foo " , " foo " )
verify_path_is ( " //foo " , " foo " )
verify_path_is ( " ///foo " , " foo " )
verify_path_is ( " /foo/bar " , " bar " )
verify_path_is ( " //foo//bar " , " bar " )
verify_path_is ( " ///foo///bar " , " bar " )
verify_path_is ( " /baz " , " baz " )
verify_path_error ( " " , " no alias ' ' found -- did you forget the leading ' / ' in the node path? " )
verify_path_error ( " missing " , " no alias ' missing ' found -- did you forget the leading ' / ' in the node path? " )
2019-08-15 10:00:55 +02:00
verify_path_error ( " /missing " , " component ' missing ' in path ' /missing ' does not exist " )
verify_path_error ( " /foo/missing " , " component ' missing ' in path ' /foo/missing ' does not exist " )
2018-12-17 20:09:47 +01:00
verify_path_exists ( " / " )
verify_path_exists ( " /foo " )
verify_path_exists ( " /foo/bar " )
verify_path_missing ( " /missing " )
verify_path_missing ( " /foo/missing " )
#
# Test /aliases
#
def verify_alias_target ( alias , node_name ) :
verify_path_is ( alias , node_name )
if alias not in dt . alias2node :
fail ( " expected {} to be in alias2node " . format ( alias ) )
if dt . alias2node [ alias ] . name != node_name :
fail ( " expected alias {} to lead to {} , lead to {} "
. format ( alias , node_name , dt . alias2node [ alias ] . name ) )
dt = parse ( """
/ dts - v1 / ;
/ {
aliases {
alias1 = & l1 ;
alias2 = & l2 ;
alias3 = & { / sub / node3 } ;
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
alias4 = & { / node4 } ;
2018-12-17 20:09:47 +01:00
} ;
l1 : node1 {
} ;
l2 : node2 {
} ;
sub {
node3 {
} ;
} ;
node4 {
node5 {
} ;
} ;
} ;
""" )
verify_alias_target ( " alias1 " , " node1 " )
verify_alias_target ( " alias2 " , " node2 " )
verify_alias_target ( " alias3 " , " node3 " )
verify_path_is ( " alias4/node5 " , " node5 " )
verify_path_error ( " alias4/node5/node6 " ,
2019-08-15 10:00:55 +02:00
" component ' node6 ' in path ' alias4/node5/node6 ' does not exist " )
2018-12-17 20:09:47 +01:00
verify_error ( """
/ dts - v1 / ;
/ {
aliases {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
a = [ 00 ] ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" ,
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
" expected property ' a ' on /aliases in .tmp.dts to be assigned with either ' a = &foo ' or ' a = \" /path/to/node \" ' , not ' a = [ 00 ]; ' " )
2018-12-17 20:09:47 +01:00
verify_error ( r """
/ dts - v1 / ;
/ {
aliases {
a = " \xFF " ;
} ;
} ;
""" ,
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
r " value of property ' a ' (b ' \ xff \ x00 ' ) on /aliases in .tmp.dts is not valid UTF-8 " )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_error ( """
2018-12-17 20:09:47 +01:00
/ dts - v1 / ;
/ {
aliases {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
A = " /aliases " ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" ,
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
" /aliases: alias property name ' A ' should include only characters from [0-9a-z-] " )
2018-12-17 20:09:47 +01:00
verify_error ( r """
/ dts - v1 / ;
/ {
aliases {
a = " /missing " ;
} ;
} ;
""" ,
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
" property ' a ' on /aliases in .tmp.dts points to the non-existent node \" /missing \" " )
2018-12-17 20:09:47 +01:00
#
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
# Test Property.type
2018-12-17 20:09:47 +01:00
#
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_type ( prop , expected ) :
actual = dt . root . props [ prop ] . type
if actual != expected :
fail ( " expected {} to have type {} , had type {} "
. format ( prop , expected , actual ) )
dt = parse ( """
/ dts - v1 / ;
/ {
empty ;
bytes1 = [ ] ;
bytes2 = [ 01 ] ;
bytes3 = [ 01 02 ] ;
bytes4 = foo : [ 01 bar : 02 ] ;
bytes5 = / bits / 8 < 1 2 3 > ;
num = < 1 > ;
nums1 = < > ;
nums2 = < > , < > ;
nums3 = < 1 2 > ;
nums4 = < 1 2 > , < 3 > , < 4 > ;
string = " foo " ;
strings = " foo " , " bar " ;
path1 = & node ;
path2 = & { / node } ;
2019-08-13 11:52:10 +02:00
phandle1 = < & node > ;
phandle2 = < & { / node } > ;
phandles1 = < & node & node > ;
phandles2 = < & node > , < & node > ;
phandle - and - nums - 1 = < & node 1 > ;
phandle - and - nums - 2 = < & node 1 2 & node 3 4 > ;
phandle - and - nums - 3 = < & node 1 2 > , < & node 3 4 > ;
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
compound1 = < 1 > , [ 02 ] ;
compound2 = " foo " , < > ;
node : node {
} ;
} ;
""" )
verify_type ( " empty " , dtlib . TYPE_EMPTY )
verify_type ( " bytes1 " , dtlib . TYPE_BYTES )
verify_type ( " bytes2 " , dtlib . TYPE_BYTES )
verify_type ( " bytes3 " , dtlib . TYPE_BYTES )
verify_type ( " bytes4 " , dtlib . TYPE_BYTES )
verify_type ( " bytes5 " , dtlib . TYPE_BYTES )
verify_type ( " num " , dtlib . TYPE_NUM )
verify_type ( " nums1 " , dtlib . TYPE_NUMS )
verify_type ( " nums2 " , dtlib . TYPE_NUMS )
verify_type ( " nums3 " , dtlib . TYPE_NUMS )
verify_type ( " nums4 " , dtlib . TYPE_NUMS )
verify_type ( " string " , dtlib . TYPE_STRING )
verify_type ( " strings " , dtlib . TYPE_STRINGS )
verify_type ( " phandle1 " , dtlib . TYPE_PHANDLE )
verify_type ( " phandle2 " , dtlib . TYPE_PHANDLE )
2019-08-13 11:52:10 +02:00
verify_type ( " phandles1 " , dtlib . TYPE_PHANDLES )
verify_type ( " phandles2 " , dtlib . TYPE_PHANDLES )
verify_type ( " phandle-and-nums-1 " , dtlib . TYPE_PHANDLES_AND_NUMS )
verify_type ( " phandle-and-nums-2 " , dtlib . TYPE_PHANDLES_AND_NUMS )
verify_type ( " phandle-and-nums-3 " , dtlib . TYPE_PHANDLES_AND_NUMS )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_type ( " path1 " , dtlib . TYPE_PATH )
verify_type ( " path2 " , dtlib . TYPE_PATH )
verify_type ( " compound1 " , dtlib . TYPE_COMPOUND )
verify_type ( " compound2 " , dtlib . TYPE_COMPOUND )
#
# Test Property.to_{num,nums,string,strings,node}()
#
dt = parse ( r """
/ dts - v1 / ;
/ {
u = < 1 > ;
s = < 0xFFFFFFFF > ;
u8 = / bits / 8 < 1 > ;
u16 = / bits / 16 < 1 2 > ;
u64 = / bits / 64 < 1 > ;
bytes = [ 01 02 03 ] ;
empty ;
zero = < > ;
two_u = < 1 2 > ;
two_s = < 0xFFFFFFFF 0xFFFFFFFE > ;
three_u = < 1 2 3 > ;
three_u_split = < 1 > , < 2 > , < 3 > ;
empty_string = " " ;
string = " foo \t bar baz " ;
invalid_string = " \xff " ;
strings = " foo " , " bar " , " baz " ;
invalid_strings = " foo " , " \xff " , " bar " ;
ref = < & { / target } > ;
2019-08-13 11:52:10 +02:00
refs = < & { / target } & { / target2 } > ;
refs2 = < & { / target } > , < & { / target2 } > ;
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
path = & { / target } ;
manualpath = " /target " ;
missingpath = " /missing " ;
target {
phandle = < 100 > ;
} ;
2019-08-13 11:52:10 +02:00
target2 {
} ;
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
} ;
""" )
# Test Property.to_num()
def verify_to_num ( prop , signed , expected ) :
2018-12-17 20:09:47 +01:00
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
actual = dt . root . props [ prop ] . to_num ( signed )
2018-12-17 20:09:47 +01:00
except dtlib . DTError as e :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " failed to convert ' {} ' to {} number: {} "
. format ( prop , " a signed " if signed else " an unsigned " , e ) )
2018-12-17 20:09:47 +01:00
if actual != expected :
fail ( " expected {} to have the {} numeric value {:#x} , had the "
" value {:#x} " . format ( prop , " signed " if signed else " unsigned " ,
expected , actual ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_to_num_error ( prop , msg ) :
prefix = " expected fetching ' {} ' as a number to generate the error " \
" ' {} ' , generated " . format ( prop , msg )
2018-12-17 20:09:47 +01:00
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
dt . root . props [ prop ] . to_num ( )
2018-12-17 20:09:47 +01:00
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_num ( " u " , False , 1 )
verify_to_num ( " u " , True , 1 )
verify_to_num ( " s " , False , 0xFFFFFFFF )
verify_to_num ( " s " , True , - 1 )
verify_to_num_error ( " two_u " , " expected property ' two_u ' on / in .tmp.dts to be assigned with ' two_u = < (number) >; ' , not ' two_u = < 0x1 0x2 >; ' " )
verify_to_num_error ( " u8 " , " expected property ' u8 ' on / in .tmp.dts to be assigned with ' u8 = < (number) >; ' , not ' u8 = [ 01 ]; ' " )
verify_to_num_error ( " u16 " , " expected property ' u16 ' on / in .tmp.dts to be assigned with ' u16 = < (number) >; ' , not ' u16 = /bits/ 16 < 0x1 0x2 >; ' " )
verify_to_num_error ( " u64 " , " expected property ' u64 ' on / in .tmp.dts to be assigned with ' u64 = < (number) >; ' , not ' u64 = /bits/ 64 < 0x1 >; ' " )
verify_to_num_error ( " string " , " expected property ' string ' on / in .tmp.dts to be assigned with ' string = < (number) >; ' , not ' string = \" foo \\ tbar baz \" ; ' " )
# Test Property.to_nums()
def verify_to_nums ( prop , signed , expected ) :
2018-12-17 20:09:47 +01:00
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
actual = dt . root . props [ prop ] . to_nums ( signed )
2018-12-17 20:09:47 +01:00
except dtlib . DTError as e :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " failed to convert ' {} ' to {} numbers: {} "
. format ( prop , " signed " if signed else " unsigned " , e ) )
2018-12-17 20:09:47 +01:00
if actual != expected :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " expected {} to give the {} numbers {} , gave {} "
2018-12-17 20:09:47 +01:00
. format ( prop , " signed " if signed else " unsigned " , expected ,
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
actual ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_to_nums_error ( prop , msg ) :
prefix = " expected converting ' {} ' to numbers to generate the error " \
" ' {} ' , generated " . format ( prop , msg )
2018-12-17 20:09:47 +01:00
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
dt . root . props [ prop ] . to_nums ( )
2018-12-17 20:09:47 +01:00
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_nums ( " zero " , False , [ ] )
verify_to_nums ( " u " , False , [ 1 ] )
verify_to_nums ( " two_u " , False , [ 1 , 2 ] )
verify_to_nums ( " two_u " , True , [ 1 , 2 ] )
verify_to_nums ( " two_s " , False , [ 0xFFFFFFFF , 0xFFFFFFFE ] )
verify_to_nums ( " two_s " , True , [ - 1 , - 2 ] )
verify_to_nums ( " three_u " , False , [ 1 , 2 , 3 ] )
verify_to_nums ( " three_u_split " , False , [ 1 , 2 , 3 ] )
2019-08-09 20:38:17 +02:00
verify_to_nums_error ( " empty " , " expected property ' empty ' on / in .tmp.dts to be assigned with ' empty = < (number) (number) ... >; ' , not ' empty; ' " )
verify_to_nums_error ( " string " , " expected property ' string ' on / in .tmp.dts to be assigned with ' string = < (number) (number) ... >; ' , not ' string = \" foo \\ tbar baz \" ; ' " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
# Test Property.to_bytes()
def verify_to_bytes ( prop , expected ) :
2018-12-17 20:09:47 +01:00
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
actual = dt . root . props [ prop ] . to_bytes ( )
except dtlib . DTError as e :
fail ( " failed to convert ' {} ' to bytes: {} " . format ( prop , e ) )
if actual != expected :
fail ( " expected {} to give the bytes {} , gave {} "
. format ( prop , expected , actual ) )
def verify_to_bytes_error ( prop , msg ) :
prefix = " expected converting ' {} ' to bytes to generate the error " \
" ' {} ' , generated " . format ( prop , msg )
try :
dt . root . props [ prop ] . to_bytes ( )
2018-12-17 20:09:47 +01:00
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_bytes ( " u8 " , b " \x01 " )
verify_to_bytes ( " bytes " , b " \x01 \x02 \x03 " )
2019-08-09 20:38:17 +02:00
verify_to_bytes_error ( " u16 " , " expected property ' u16 ' on / in .tmp.dts to be assigned with ' u16 = [ (byte) (byte) ... ]; ' , not ' u16 = /bits/ 16 < 0x1 0x2 >; ' " )
verify_to_bytes_error ( " empty " , " expected property ' empty ' on / in .tmp.dts to be assigned with ' empty = [ (byte) (byte) ... ]; ' , not ' empty; ' " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
# Test Property.to_string()
2018-12-17 20:09:47 +01:00
def verify_to_string ( prop , expected ) :
try :
actual = dt . root . props [ prop ] . to_string ( )
except dtlib . DTError as e :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " failed to convert ' {} ' to string: {} " . format ( prop , e ) )
2018-12-17 20:09:47 +01:00
if actual != expected :
fail ( " expected {} to have the value ' {} ' , had the value ' {} ' "
. format ( prop , expected , actual ) )
def verify_to_string_error ( prop , msg ) :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
prefix = " expected converting ' {} ' to string to generate the error " \
2018-12-17 20:09:47 +01:00
" ' {} ' , generated " . format ( prop , msg )
try :
dt . root . props [ prop ] . to_string ( )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_string ( " empty_string " , " " )
verify_to_string ( " string " , " foo \t bar baz " )
2019-08-09 20:38:17 +02:00
verify_to_string_error ( " u " , " expected property ' u ' on / in .tmp.dts to be assigned with ' u = \" string \" ; ' , not ' u = < 0x1 >; ' " )
verify_to_string_error ( " strings " , " expected property ' strings ' on / in .tmp.dts to be assigned with ' strings = \" string \" ; ' , not ' strings = \" foo \" , \" bar \" , \" baz \" ; ' " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_string_error ( " invalid_string " , r " value of property ' invalid_string ' (b ' \ xff \ x00 ' ) on / in .tmp.dts is not valid UTF-8 " )
# Test Property.to_strings()
2018-12-17 20:09:47 +01:00
def verify_to_strings ( prop , expected ) :
try :
actual = dt . root . props [ prop ] . to_strings ( )
except dtlib . DTError as e :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " failed to convert ' {} ' to strings: {} " . format ( prop , e ) )
2018-12-17 20:09:47 +01:00
if actual != expected :
fail ( " expected {} to have the value ' {} ' , had the value ' {} ' "
. format ( prop , expected , actual ) )
def verify_to_strings_error ( prop , msg ) :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
prefix = " expected converting ' {} ' to strings to generate the error " \
2018-12-17 20:09:47 +01:00
" ' {} ' , generated " . format ( prop , msg )
try :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
dt . root . props [ prop ] . to_strings ( )
2018-12-17 20:09:47 +01:00
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_strings ( " empty_string " , [ " " ] )
verify_to_strings ( " string " , [ " foo \t bar baz " ] )
verify_to_strings ( " strings " , [ " foo " , " bar " , " baz " ] )
2019-08-09 20:38:17 +02:00
verify_to_strings_error ( " u " , " expected property ' u ' on / in .tmp.dts to be assigned with ' u = \" string \" , \" string \" , ... ; ' , not ' u = < 0x1 >; ' " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_strings_error ( " invalid_strings " , r " value of property ' invalid_strings ' (b ' foo \ x00 \ xff \ x00bar \ x00 ' ) on / in .tmp.dts is not valid UTF-8 " )
# Test Property.to_node()
2018-12-17 20:09:47 +01:00
def verify_to_node ( prop , path ) :
try :
actual = dt . root . props [ prop ] . to_node ( ) . path
except dtlib . DTError as e :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
fail ( " failed to convert ' {} ' to node: {} " . format ( prop , e ) )
2018-12-17 20:09:47 +01:00
if actual != path :
fail ( " expected {} to point to {} , pointed to {} "
. format ( prop , path , actual ) )
def verify_to_node_error ( prop , msg ) :
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
prefix = " expected converting ' {} ' to a node to generate the error " \
2018-12-17 20:09:47 +01:00
" ' {} ' , generated " . format ( prop , msg )
try :
dt . root . props [ prop ] . to_node ( )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_node ( " ref " , " /target " )
2018-12-17 20:09:47 +01:00
2019-08-09 20:38:17 +02:00
verify_to_node_error ( " u " , " expected property ' u ' on / in .tmp.dts to be assigned with ' u = < &foo >; ' , not ' u = < 0x1 >; ' " )
verify_to_node_error ( " string " , " expected property ' string ' on / in .tmp.dts to be assigned with ' string = < &foo >; ' , not ' string = \" foo \\ tbar baz \" ; ' " )
2018-12-17 20:09:47 +01:00
2019-08-13 11:52:10 +02:00
# Test Property.to_nodes()
def verify_to_nodes ( prop , paths ) :
try :
actual = [ node . path for node in dt . root . props [ prop ] . to_nodes ( ) ]
except dtlib . DTError as e :
fail ( " failed to convert ' {} ' to nodes: {} " . format ( prop , e ) )
if actual != paths :
fail ( " expected {} to point to the paths {} , pointed to {} "
. format ( prop , paths , actual ) )
def verify_to_nodes_error ( prop , msg ) :
prefix = " expected converting ' {} ' to a nodes to generate the error " \
" ' {} ' , generated " . format ( prop , msg )
try :
dt . root . props [ prop ] . to_nodes ( )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
verify_to_nodes ( " zero " , [ ] )
verify_to_nodes ( " ref " , [ " /target " ] )
verify_to_nodes ( " refs " , [ " /target " , " /target2 " ] )
verify_to_nodes ( " refs2 " , [ " /target " , " /target2 " ] )
verify_to_nodes_error ( " u " , " expected property ' u ' on / in .tmp.dts to be assigned with ' u = < &foo &bar ... >; ' , not ' u = < 0x1 >; ' " )
verify_to_nodes_error ( " string " , " expected property ' string ' on / in .tmp.dts to be assigned with ' string = < &foo &bar ... >; ' , not ' string = \" foo \\ tbar baz \" ; ' " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
# Test Property.to_path()
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_to_path ( prop , path ) :
try :
actual = dt . root . props [ prop ] . to_path ( ) . path
except dtlib . DTError as e :
fail ( " failed to convert ' {} ' to path: {} " . format ( prop , e ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
if actual != path :
fail ( " expected {} to contain the path {} , contained {} "
. format ( prop , path , actual ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_to_path_error ( prop , msg ) :
prefix = " expected converting ' {} ' to a path to generate the error " \
" ' {} ' , generated " . format ( prop , msg )
try :
dt . root . props [ prop ] . to_path ( )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_path ( " path " , " /target " )
verify_to_path ( " manualpath " , " /target " )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_to_path_error ( " u " , " expected property ' u ' on / in .tmp.dts to be assigned with either ' u = &foo ' or ' u = \" /path/to/node \" ' , not ' u = < 0x1 >; ' " )
verify_to_path_error ( " missingpath " , " property ' missingpath ' on / in .tmp.dts points to the non-existent node \" /missing \" " )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
# Test top-level to_num() and to_nums()
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_raw_to_num ( fn , prop , length , signed , expected ) :
try :
actual = fn ( dt . root . props [ prop ] . value , length , signed )
except dtlib . DTError as e :
fail ( " failed to convert ' {} ' to {} number(s) with {} : {} "
. format ( prop , " signed " if signed else " unsigned " ,
fn . __name__ , e ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
if actual != expected :
fail ( " expected {} (< {} >, {} , {} ) to be {} , was {} "
. format ( fn . __name__ , prop , length , signed , expected , actual ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
def verify_raw_to_num_error ( fn , data , length , msg ) :
prefix = " expected {} () called with data= ' {} ' , length= ' {} ' to " \
" generate the error ' {} ' , generated " \
. format ( fn . __name__ , data , length , msg )
try :
fn ( data , length )
fail ( prefix + " no error " )
except dtlib . DTError as e :
if str ( e ) != msg :
fail ( " {} the error ' {} ' " . format ( prefix , e ) )
except Exception as e :
fail ( " {} the non-DTError ' {} ' " . format ( prefix , e ) )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_raw_to_num ( dtlib . to_num , " u " , None , False , 1 )
verify_raw_to_num ( dtlib . to_num , " u " , 4 , False , 1 )
verify_raw_to_num ( dtlib . to_num , " s " , None , False , 0xFFFFFFFF )
verify_raw_to_num ( dtlib . to_num , " s " , None , True , - 1 )
verify_raw_to_num ( dtlib . to_nums , " empty " , 4 , False , [ ] )
verify_raw_to_num ( dtlib . to_nums , " u16 " , 2 , False , [ 1 , 2 ] )
verify_raw_to_num ( dtlib . to_nums , " two_s " , 4 , False , [ 0xFFFFFFFF , 0xFFFFFFFE ] )
verify_raw_to_num ( dtlib . to_nums , " two_s " , 4 , True , [ - 1 , - 2 ] )
2018-12-17 20:09:47 +01:00
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_raw_to_num_error ( dtlib . to_num , 0 , 0 , " ' 0 ' has type ' int ' , expected ' bytes ' " )
verify_raw_to_num_error ( dtlib . to_num , b " " , 0 , " ' length ' must be greater than zero, was 0 " )
2019-08-15 11:46:44 +02:00
verify_raw_to_num_error ( dtlib . to_num , b " foo " , 2 , " b ' foo ' is 3 bytes long, expected 2 " )
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
verify_raw_to_num_error ( dtlib . to_nums , 0 , 0 , " ' 0 ' has type ' int ' , expected ' bytes ' " )
verify_raw_to_num_error ( dtlib . to_nums , b " " , 0 , " ' length ' must be greater than zero, was 0 " )
2019-08-15 11:46:44 +02:00
verify_raw_to_num_error ( dtlib . to_nums , b " foooo " , 2 , " b ' foooo ' is 5 bytes long, expected a length that ' s a a multiple of 2 " )
2018-12-17 20:09:47 +01:00
#
# Test duplicate label error
#
verify_error ( """
/ dts - v1 / ;
/ {
sub1 {
label : foo {
} ;
} ;
sub2 {
label : bar {
} ;
} ;
} ;
""" ,
" Label ' label ' appears on /sub1/foo and on /sub2/bar " )
verify_error ( """
/ dts - v1 / ;
/ {
sub {
label : foo {
} ;
} ;
} ;
/ {
sub {
label : bar {
} ;
} ;
} ;
""" ,
" Label ' label ' appears on /sub/bar and on /sub/foo " )
verify_error ( """
/ dts - v1 / ;
/ {
foo : a = < 0 > ;
foo : node {
} ;
} ;
""" ,
" Label ' foo ' appears on /node and on property ' a ' of node / " )
verify_error ( """
/ dts - v1 / ;
/ {
foo : a = < 0 > ;
node {
foo : b = < 0 > ;
} ;
} ;
""" ,
" Label ' foo ' appears on property ' a ' of node / and on property ' b ' of node /node " )
verify_error ( """
/ dts - v1 / ;
/ {
foo : a = foo : < 0 > ;
} ;
""" ,
" Label ' foo ' appears in the value of property ' a ' of node / and on property ' a ' of node / " )
# Giving the same label twice for the same node is fine
verify_parse ( """
/ dts - v1 / ;
/ {
sub {
label : foo {
} ;
} ;
} ;
/ {
sub {
label : foo {
} ;
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
sub {
label : foo {
} ;
} ;
} ;
""" )
# Duplicate labels are fine if one of the nodes is deleted
verify_parse ( """
/ dts - v1 / ;
/ {
label : foo {
} ;
label : bar {
} ;
} ;
/ delete - node / & { / bar } ;
""" ,
"""
/ dts - v1 / ;
/ {
label : foo {
} ;
} ;
""" )
#
# Test overriding/deleting a property with references
#
verify_parse ( """
/ dts - v1 / ;
/ {
x = & foo , < & foo > ;
y = & foo , < & foo > ;
foo : foo {
} ;
} ;
/ {
x = < 1 > ;
/ delete - property / y ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
2019-08-09 00:44:33 +02:00
x = < 0x1 > ;
2018-12-17 20:09:47 +01:00
foo : foo {
} ;
} ;
""" )
#
# Test self-referential node
#
verify_parse ( """
/ dts - v1 / ;
/ {
label : foo {
x = & { / foo } , & label , < & label > ;
} ;
} ;
""" ,
"""
/ dts - v1 / ;
/ {
label : foo {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
x = & { / foo } , & label , < & label > ;
2019-08-09 00:44:33 +02:00
phandle = < 0x1 > ;
2018-12-17 20:09:47 +01:00
} ;
} ;
""" )
#
# Test /memreserve/
#
dt = verify_parse ( """
/ dts - v1 / ;
l1 : l2 : / memreserve / ( 1 + 1 ) ( 2 * 2 ) ;
/ memreserve / 0x100 0x200 ;
/ {
} ;
""" ,
"""
/ dts - v1 / ;
l1 : l2 : / memreserve / 0x0000000000000002 0x0000000000000004 ;
/ memreserve / 0x0000000000000100 0x0000000000000200 ;
/ {
} ;
""" )
expected = [ ( [ " l1 " , " l2 " ] , 2 , 4 ) , ( [ ] , 0x100 , 0x200 ) ]
if dt . memreserves != expected :
fail ( " expected {} for dt.memreserve, got {} "
. format ( expected , dt . memreserves ) )
2019-08-16 09:35:03 +02:00
verify_error ( """
/ dts - v1 / ;
foo : / {
} ;
""" ,
" .tmp.dts:3 (column 6): parse error: expected /memreserve/ after labels at beginning of file " )
2018-12-17 20:09:47 +01:00
#
# Test __repr__() functions
#
def verify_repr ( obj , expected ) :
if repr ( obj ) != expected :
fail ( " expected repr() to be ' {} ' , was ' {} ' "
. format ( expected , repr ( obj ) ) )
dt = parse ( """
/ dts - v1 / ;
/ {
x = < 0 > ;
sub {
y = < 1 > ;
} ;
} ;
""" ,
include_path = ( " foo " , " bar " ) )
verify_repr ( dt , " DT(filename= ' .tmp.dts ' , include_path=( ' foo ' , ' bar ' )) " )
verify_repr ( dt . root . props [ " x " ] , " <Property ' x ' at ' / ' in ' .tmp.dts ' > " )
verify_repr ( dt . root . nodes [ " sub " ] , " <Node /sub in ' .tmp.dts ' > " )
#
# Test names
#
# The C tools disallow '@' in property names, but otherwise accept the same
# characters in node and property names. Emulate that instead of the DT spec
# (v0.2), which gives different characters for nodes and properties.
verify_parse ( r """
/ dts - v1 / ;
/ {
/ / A leading \ is accepted but ignored in node / propert names
\aA0 , . _ + * #?- = &_, &{/aA0,._+*#?@-};
2019-08-13 08:23:19 +02:00
/ / Names that overlap with operators and integer literals
2018-12-17 20:09:47 +01:00
+ = [ 00 ] ;
* = [ 02 ] ;
- = [ 01 ] ;
? = [ 03 ] ;
2019-08-13 08:23:19 +02:00
0 = [ 04 ] ;
0x123 = [ 05 ] ;
2018-12-17 20:09:47 +01:00
_ : \aA0 , . _ + * #?@- {
} ;
2019-08-13 08:23:19 +02:00
0 {
} ;
2018-12-17 20:09:47 +01:00
} ;
""" ,
"""
/ dts - v1 / ;
/ {
dts: dtlib/edtlib: Add a syntax-based type-checking system
Property type-checking has been pretty rudimentary until now, only
checking things like the length being divisible by 4 for 'type: array',
and strings being null-terminated. In particular, no checking was done
for 'type: uint8-array', letting
jedec-id = < 0xc8 0x28 0x17 >;
slip through when
jedec-id = [ 0xc8 0x28 0x17 ];
was intended.
Fix it by adding a syntax-based type checker:
1. Add Property.type, which gives a high-level type for the property,
derived from the markers added in the previous commit.
This includes types like TYPE_EMPTY ('foo;'),
TYPE_NUM ('foo = < 3 >;'), TYPE_BYTES ('foo = [ 01 02 ];'),
TYPE_STRINGS ('foo = "bar", "baz"'),
TYPE_PHANDLE ('foo = < &bar >;'), and TYPE_COMPOUND (everything not
recognized).
See the Property.type docstring in dtlib for more info.
2. Use the high-level type in
Property.to_num()/to_string()/to_node()/etc. to verify that the
property was assigned in an expected way for the type.
If the assignment looks bad, give a helpful error:
expected property 'nums' on /foo/bar in some.dts to be assigned
with 'nums = < (number) (number) ... >', not 'nums = "oops";'
Some other related changes are included as well:
- There's a new Property.to_bytes() function that works like accessing
Property.bytes, except with an added check for the value being
assigned like 'foo = [ ... ]'.
This function solves problems like the jedec-id one.
- There's a new Property.to_path() function for fetching the
referenced node for assignments like 'foo = &node;', with type
checking. (Strings are accepted too, as long as they give the path
to an existing node.)
This function is used for /chosen and /aliases.
- A new 'type: phandle' type can now be given in bindings, for
properties that are assigned like 'foo = < &node >;'.
- Property.__str__() now displays phandles and path references as they
were written (e.g. '< &foo >' instead of '< 0x1 >', if the
allocated phandle happened to be 1).
- Property.to_num() and Property.to_nums() no longer take a 'length'
parameter, because it makes no sense with the type checking.
- The global dtlib.to_string() and dtlib.to_strings() functions were
removed, because they're not that useful.
- More tests were added, along with misc. minor cleanup in various
places.
- Probably other stuff I forgot.
The more strict type checking in dtlib indirectly makes some parts of
edtlib more strict as well (wherever Property.to_*() is used).
Fixes: #18131
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
2019-08-09 20:38:17 +02:00
aA0 , . _ + * #?- = &_, &{/aA0,._+*#?@-};
2018-12-17 20:09:47 +01:00
+ = [ 00 ] ;
* = [ 02 ] ;
- = [ 01 ] ;
? = [ 03 ] ;
2019-08-13 08:23:19 +02:00
0 = [ 04 ] ;
0x123 = [ 05 ] ;
2018-12-17 20:09:47 +01:00
_ : aA0 , . _ + * #?@- {
} ;
2019-08-13 08:23:19 +02:00
0 {
} ;
2018-12-17 20:09:47 +01:00
} ;
""" )
verify_error ( r """
/ dts - v1 / ;
/ {
foo @ 3 ;
} ;
""" ,
" .tmp.dts:4 (column 7): parse error: ' @ ' is only allowed in node names " )
verify_error ( r """
/ dts - v1 / ;
/ {
foo @ 3 = < 0 > ;
} ;
""" ,
" .tmp.dts:4 (column 8): parse error: ' @ ' is only allowed in node names " )
verify_error ( r """
/ dts - v1 / ;
/ {
foo @ 2 @ 3 {
} ;
} ;
""" ,
" .tmp.dts:4 (column 10): parse error: multiple ' @ ' in node name " )
#
# Test bad formatting
#
verify_parse ( """
/ dts - v1 / ; / { l1 : l2 : foo { l3 : l4 : bar { l5 : x = l6 : / bits / 8 < l7 : 1 l8 : 2 > l9 : , [ 03 ] , " a " ; } ; } ; } ;
""" ,
"""
/ dts - v1 / ;
/ {
l1 : l2 : foo {
l3 : l4 : bar {
2019-08-09 00:44:33 +02:00
l5 : x = l6 : [ l7 : 01 l8 : 02 l9 : ] , [ 03 ] , " a " ;
2018-12-17 20:09:47 +01:00
} ;
} ;
} ;
""" )
#
# Test misc. errors and non-errors
#
verify_error ( " " , " .tmp.dts:1 (column 1): parse error: expected ' /dts-v1/; ' at start of file " )
verify_error ( """
/ dts - v1 / ;
""" ,
" .tmp.dts:2 (column 1): parse error: no root node defined " )
verify_error ( """
/ dts - v1 / ; / plugin / ;
""" ,
" .tmp.dts:1 (column 11): parse error: /plugin/ is not supported " )
verify_error ( """
/ dts - v1 / ;
/ {
foo : foo {
} ;
} ;
/ / Only one label supported before label references at the top level
l1 : l2 : & foo {
} ;
""" ,
" .tmp.dts:9 (column 5): parse error: expected label reference (&foo) " )
verify_error ( """
/ dts - v1 / ;
/ {
foo : { } ;
} ;
""" ,
" .tmp.dts:4 (column 14): parse error: expected node or property name " )
# Multiple /dts-v1/ at the start of a file is fine
verify_parse ( """
/ dts - v1 / ;
/ dts - v1 / ;
/ {
} ;
""" ,
"""
/ dts - v1 / ;
/ {
} ;
""" )
print ( " all tests passed " )
# Only remove these if tests succeed. They're handy to have around otherwise.
shutil . rmtree ( " .tmp " )
shutil . rmtree ( " .tmp2 " )
os . remove ( " .tmp.dts " )
os . remove ( " .tmp2.dts " )
os . remove ( " .tmp3.dts " )
os . remove ( " .tmp.bin " )
if __name__ == " __main__ " :
run ( )