From 14b13dc4e55ff843b76f57c8f1a0f883e9e9f1af Mon Sep 17 00:00:00 2001 From: Sei Lisa Date: Fri, 27 Oct 2017 18:49:58 +0200 Subject: [PATCH] Implement flags aimed at removing "magic names" in the code. strlen for llStringLength, detect for llDetected* and touch*/collision*/sensor, touch for touch*, grab for touch(). --- fndata.txt | 59 ++++++++++++++++++++++++++++++++++++-------- lslopt/lslloadlib.py | 32 +++++++++++++++--------- 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/fndata.txt b/fndata.txt index 041f4f2..d7cbfb3 100644 --- a/fndata.txt +++ b/fndata.txt @@ -34,13 +34,23 @@ # it's posible to simplify two identical calls into one. Example: # llGetPermissions(). Counterexample: llFrand(). This is the default; # unstable functions must be marked as such. Does not apply to void -# functions. +# functions. This flag is not implemented; 'unstable' is. # # unstable: -# Not stable. +# Not stable. This flag IS implemented. # -# variable: -# Not stable. Alias for unstable. +# strlen: +# Marks the function as accepting one unique parameter of type string, +# and returning 0 is equivalent to the parameter being an empty string. +# +# detect: +# Marks the function/event as being a detection one. +# +# touch: +# Marks the event as being a touch event. +# +# grab: +# Marks the event as enabling grab detection. # # delay : # Function has a delay. @@ -231,76 +241,93 @@ string llDeleteSubString( string src, integer start, integer end ) void llDetachFromAvatar( ) vector llDetectedGrab( integer number ) +- detect - SEF # llDetectedGrab() only works for touch(), not for touch_start() etc. - return <0,0,0> if event != "" && event != "touch" || number < 0 || number > 15 + integer llDetectedGroup( integer number ) +- detect - SEF - min 0 - max 1 - return 0 if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 key llDetectedKey( integer number ) +- detect - SEF - return "00000000-0000-0000-0000-000000000000" if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 integer llDetectedLinkNumber( integer number ) +- detect - SEF - min 0 - max 256 - return 0 if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 string llDetectedName( integer number ) +- detect - SEF - return "00000000-0000-0000-0000-000000000000" if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 key llDetectedOwner( integer number ) +- detect - SEF - return "00000000-0000-0000-0000-000000000000" if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 vector llDetectedPos( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 rotation llDetectedRot( integer number ) +- detect - SEF - return <0,0,0,1> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 vector llDetectedTouchBinormal( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" || number < 0 || number > 15 integer llDetectedTouchFace( integer number ) +- detect - SEF - min -1 - max 8 - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" || number < 0 || number > 15 vector llDetectedTouchNormal( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" || number < 0 || number > 15 vector llDetectedTouchPos( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" || number < 0 || number > 15 vector llDetectedTouchST( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 - return <-1,-1,0> if (event == "collision" || event == "collision_start" || event == "collision_end" || event == "sensor") && number == 0 vector llDetectedTouchUV( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 - return <-1,-1,0> if (event == "collision" || event == "collision_start" || event == "collision_end" || event == "sensor") && number == 0 integer llDetectedType( integer number ) +- detect - SEF - min 0 - max 15 - return 0 if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 vector llDetectedVel( integer number ) +- detect - SEF - return <0,0,0> if event != "" && event != "touch" && event != "touch_start" && event != "touch_end" && event != "collision" && event != "collision_start" && event != "collision_end" && event != "sensor" || number < 0 || number > 15 @@ -1372,6 +1399,7 @@ void llStopSound( ) integer llStringLength( string str ) - SEF - min 0 +- strlen string llStringToBase64( string str ) - SEF @@ -1483,14 +1511,17 @@ event changed( integer change ) - SEF event collision( integer num_detected ) +- detect # Prevents events in the parent from triggering, depending on llPassCollisions, # therefore not SEF. event collision_end( integer num_detected ) -# Same as with collision(). +- detect +# Not SEF; see collision(). event collision_start( integer num_detected ) -# Same as with collision(). +- detect +# Not SEF; see collision(). event control( key id, integer level, integer edge ) - SEF @@ -1563,8 +1594,9 @@ event run_time_permissions( integer perm ) - SEF event sensor( integer num_detected ) +- detect # There was a time when this was necessary for no_sensor() to trigger, but -# that's no longer the case. +# that's no longer the case and it is SEF now. - SEF event state_entry( ) @@ -1577,13 +1609,20 @@ event timer( ) - SEF event touch( integer num_detected ) -# Adds hand cursor. +- touch +- detect +- grab +# Not SEF for the same reasons as collision(); also it adds a hand cursor. event touch_end( integer num_detected ) -# Adds hand cursor. +- touch +- detect +# Not SEF; see touch(). event touch_start( integer num_detected ) -# Adds hand cursor. +- touch +- detect +# Not SEF; see touch(). event transaction_result( key id, integer success, string data ) - SEF diff --git a/lslopt/lslloadlib.py b/lslopt/lslloadlib.py index 9c2103c..2549495 100644 --- a/lslopt/lslloadlib.py +++ b/lslopt/lslloadlib.py @@ -234,7 +234,8 @@ def LoadLibrary(builtins = None, fndata = None): r'("(?:\\.|[^"])*"|<[^>]+>|[-+0-9x.e]+' # strings, vectors, numbers r'|\[(?:[^]"]|"(?:\\.|[^"])*")*\]))' # lists r'(?:\s+if\s+(.*\S))?' - r'|(unstable|stop)|(min|max|delay)\s+([-0-9.]+))\s*$', re.I) + r'|(unstable|stop|strlen|detect|touch|grab)' + r'|(min|max|delay)\s+([-0-9.]+))\s*$', re.I) # TODO: "quaternion" doesn't compare equal to "rotation" even if they are # equivalent. Canonicalize it before comparison, to avoid false @@ -352,8 +353,9 @@ def LoadLibrary(builtins = None, fndata = None): # that is conditionally SEF is taken as not SEF) if curr_ty == 'event' and match_flag.group(3): warning(u"Events do not support conditions" - u" in SEF flags, in line %d, event %s" - % (ufndata, linenum, ucurr_fn)) + u" in SEF flags, in line %d, event %s." + u" Omitting: %s" + % (linenum, ucurr_fn, uline)) continue elif curr_ty == 'event': events[curr_fn]['SEF'] = True @@ -362,18 +364,24 @@ def LoadLibrary(builtins = None, fndata = None): functions[curr_fn]['SEF'] = True elif curr_ty == 'event': - warning(u"Events only support bare SEF flags" - u", in line %d, event %s. Omitting %s." - % (ufndata, linenum, ucurr_fn, uline)) + if match_flag.group(4): + flag = match_flag.group(4).lower() + if flag in ('detect','touch','grab'): + events[curr_fn][flag] = True + else: + warning(u"Events only support a few flags" + u", in line %d, event %s." + u" Omitting: %s" + % (linenum, ucurr_fn, uline)) continue elif match_flag.group(2): pass # return not handled yet - elif (match_flag.group(4) - and match_flag.group(4).lower() == 'unstable' - ): - functions[curr_fn]['uns'] = True - elif match_flag.group(4): # must be stop - functions[curr_fn]['stop'] = True + elif match_flag.group(4): + flag = match_flag.group(4).lower() + if flag == 'unstable': + functions[curr_fn]['uns'] = True + else: + functions[curr_fn][flag] = True elif match_flag.group(5).lower() in ('min', 'max'): minmax = match_flag.group(5).lower() value = match_flag.group(6)