classes.tuple.parser: throw bad-slot-name immediately when an invalid slot name in a tuple/struct literal is scanned
							parent
							
								
									bde65fe2d0
								
							
						
					
					
						commit
						bb58cf4d16
					
				| 
						 | 
					@ -68,23 +68,28 @@ ERROR: invalid-slot-name name ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ERROR: bad-literal-tuple ;
 | 
					ERROR: bad-literal-tuple ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: parse-slot-value ( -- )
 | 
					ERROR: bad-slot-name class slot ;
 | 
				
			||||||
    scan scan-object 2array , scan {
 | 
					
 | 
				
			||||||
 | 
					: check-slot-name ( class slots name -- name )
 | 
				
			||||||
 | 
					    2dup swap slot-named* nip [ 2nip ] [ nip bad-slot-name ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: parse-slot-value ( class slots -- )
 | 
				
			||||||
 | 
					    scan check-slot-name scan-object 2array , scan {
 | 
				
			||||||
        { f [ \ } unexpected-eof ] }
 | 
					        { f [ \ } unexpected-eof ] }
 | 
				
			||||||
        { "}" [ ] }
 | 
					        { "}" [ ] }
 | 
				
			||||||
        [ bad-literal-tuple ]
 | 
					        [ bad-literal-tuple ]
 | 
				
			||||||
    } case ;
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: (parse-slot-values) ( -- )
 | 
					: (parse-slot-values) ( class slots -- )
 | 
				
			||||||
    parse-slot-value
 | 
					    2dup parse-slot-value
 | 
				
			||||||
    scan {
 | 
					    scan {
 | 
				
			||||||
        { f [ \ } unexpected-eof ] }
 | 
					        { f [ 2drop \ } unexpected-eof ] }
 | 
				
			||||||
        { "{" [ (parse-slot-values) ] }
 | 
					        { "{" [ (parse-slot-values) ] }
 | 
				
			||||||
        { "}" [ ] }
 | 
					        { "}" [ 2drop ] }
 | 
				
			||||||
        [ bad-literal-tuple ]
 | 
					        [ 2nip bad-literal-tuple ]
 | 
				
			||||||
    } case ;
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: parse-slot-values ( -- values )
 | 
					: parse-slot-values ( class slots -- values )
 | 
				
			||||||
    [ (parse-slot-values) ] { } make ;
 | 
					    [ (parse-slot-values) ] { } make ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GENERIC# boa>object 1 ( class slots -- tuple )
 | 
					GENERIC# boa>object 1 ( class slots -- tuple )
 | 
				
			||||||
| 
						 | 
					@ -92,8 +97,6 @@ GENERIC# boa>object 1 ( class slots -- tuple )
 | 
				
			||||||
M: tuple-class boa>object
 | 
					M: tuple-class boa>object
 | 
				
			||||||
    swap prefix >tuple ;
 | 
					    swap prefix >tuple ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ERROR: bad-slot-name class slot ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: check-slot-exists ( class initials slot-spec/f index/f name -- class initials slot-spec index )
 | 
					: check-slot-exists ( class initials slot-spec/f index/f name -- class initials slot-spec index )
 | 
				
			||||||
    over [ drop ] [ nip nip nip bad-slot-name ] if ;
 | 
					    over [ drop ] [ nip nip nip bad-slot-name ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,7 +112,7 @@ ERROR: bad-slot-name class slot ;
 | 
				
			||||||
    scan {
 | 
					    scan {
 | 
				
			||||||
        { f [ unexpected-eof ] }
 | 
					        { f [ unexpected-eof ] }
 | 
				
			||||||
        { "f" [ drop \ } parse-until boa>object ] }
 | 
					        { "f" [ drop \ } parse-until boa>object ] }
 | 
				
			||||||
        { "{" [ parse-slot-values assoc>object ] }
 | 
					        { "{" [ 2dup parse-slot-values assoc>object ] }
 | 
				
			||||||
        { "}" [ drop new ] }
 | 
					        { "}" [ drop new ] }
 | 
				
			||||||
        [ bad-literal-tuple ]
 | 
					        [ bad-literal-tuple ]
 | 
				
			||||||
    } case ;
 | 
					    } case ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue