RBParser parseMethod: '...' parses a method
RBParser parseExpression: '...' does it for an expression But I think both of them return a method node? I cannot recall. However, you can always do at the end node methodNode statements last isBlockNode or something like that. Can't you? On Sun, Aug 13, 2017 at 4:32 AM, Eliot Miranda <[email protected]> wrote: > Hi Mariano, > > _,,,^..^,,,_ (phone) > > On Jul 24, 2017, at 9:21 AM, Mariano Martinez Peck <[email protected]> > wrote: > > Hi guys, > > Is there a portable (that would work in GemStone too) and safe way to know > if a String would be a block? > > I must support this kind of strings: > > 'singleString' -> false > 'multi string' -> false > ' [:a | 42]' -> true > ' '' '' [:a | 42]' -> true > '[:a | 42]' -> true > ' "a commet" [:a | 42]' -> true > ' WhateverClass someVeryBadHackishMethod. [:a | 42]' -> true > > I need to identify whether the string is a closure or not. And ideally, I > don't want to do an #evaluate: because I don't want any left hand code to > be executed. > I tried with #parse: why I am having problems. > > Any ideas? > > > Not sure if you're still stuck but if you dive into evaluate: you'll be > able to find the point at which it parses, and find out how to invoke the > parser for an expression (a doit). evaluate: parses an expression so > you want to check that the resulting parse tree is that of a return node > whose expression is a literal block. You can also check the block's > argument count. > > Once you've extracted the parser invocation you can wrap this in a > suitable exception handler. Then you have your block parser. You still > have to validate the parse tree and/or generated code before evaluating > since someone could write malicious code within the block right? > > > Thanks in advance > > -- > Mariano > http://marianopeck.wordpress.com > > -- Guille Polito Research Engineer French National Center for Scientific Research - *http://www.cnrs.fr* <http://www.cnrs.fr> *Web:* *http://guillep.github.io* <http://guillep.github.io> *Phone: *+33 06 52 70 66 13
