Commit graph

473 commits

Author SHA1 Message Date
Sei Lisa
5ad68906e9 Name the groups of keywords.
This is in preparation for having pragmas/defines to select compliation options on the fly within the code.
2016-06-27 20:33:47 +02:00
Sei Lisa
8488254d53 Generate labels sequentially rather than randomly. 2016-06-27 20:32:59 +02:00
Sei Lisa
79dff25769 Update copyright years of some files; add legalese to seftable.txt 2016-06-27 20:06:41 +02:00
Sei Lisa
8fc4240142 Ignore preprocessor commands while scanning for globals.
The pragma warnings were duplicated, one during globals scan, another during actual parsing. This should fix it.

This is somewhat potentially dangerous, as some directives (pragmas, notably) could in future affect the global scan phase by changing the language.
2016-06-27 19:07:20 +02:00
Sei Lisa
633c31df6c The RE wasn't correct, since we want to isolate the directive.
Also check for pragma and emit a warning.
2016-06-27 18:38:40 +02:00
Sei Lisa
fb83279706 Add infrastructure to process preprocessor directives.
Also check that they appear at the beginning of the line.
2016-06-27 16:50:09 +02:00
Sei Lisa
ee091c63a6 Someone's been misusing Python's re.match... O:) 2016-06-26 22:33:10 +02:00
Sei Lisa
893bcf177b Remove dead code.
Commit b73805e introduced lazy lists in assignments only. Commit 890e960 generalized it, allowing any identifier to be followed by brackets, removing the need for assignment-specific treatment. However, we forgot to remove the assignment-specific code parsing, so do it now.
2016-06-26 17:21:52 +02:00
Sei Lisa
f32489a5a8 Distinguish indeterminates and improve infinities in output.
'(float)"-nan"' doesn't return Indet in LSL:
  llOwnerSay(llList2CSV([(float)"-nan"])); // outputs "nan", not "-nan"
Therefore, for the output to yield the correct result we have to use a different strategy to generate an indeterminate. We choose '(1e40*0)' which is shorter than the rest.

Also, we don't output infinites as '(float)"[-]inf"' but alwas as '1e40' or '(float)-1e40' (or just '-1e40' if we're in globals).
2016-05-26 20:00:11 +02:00
Sei Lisa
51a7e6d199 Fix bug with reduction, and remove useless code.
Oops, we have to reduce *after* testing for range!

Also, the special cases for the tangent are unnecessary, because the results are already correct.
2016-05-21 04:16:34 +02:00
Sei Lisa
9cf9478270 Improve the (in)accuracy of llSin, llCos, llTan
All three functions have in SL the Intel problem of inaccuracy with high values. Since we work in single precision, it's barely detectable usually, but for large input numbers the difference between the imprecise results of SL and the more accurate results of recent glibc become more obvious.

This change brings back the Intel inaccuracy, even across systems (different versions of Python/C might behave differently otherwise).

Reference:
https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion/
2016-05-21 03:56:27 +02:00
Sei Lisa
e40c52075b Make ForceFloat more robust on non-float input.
It was designed so that only ints and floats should be accepted. But for safety, and for reuse, make that "any non-float" so that long integers are also truncated to F32.
2016-05-21 03:10:31 +02:00
Sei Lisa
13663ff077 -0x1p63 is not included in the valid range of trig functions. 2016-05-21 02:50:55 +02:00
Sei Lisa
7b70bfe55f Fix precision error in llTan special values. 2016-05-21 02:27:15 +02:00
Sei Lisa
4172f02439 One more way to transform a float to single (commented out) 2016-05-21 01:59:05 +02:00
Sei Lisa
60f257279b Use math.copysign to distinguish indeterminates
We were using a very dubious method to distinguish an indeterminate from a NaN, via struct.unpack. Turns out that math.copysign gets the job done and seems more robust.
2016-05-15 19:55:45 +02:00
Sei Lisa
b06ac33b5f Fix misspelling in the latest commit. 2016-05-15 18:44:45 +02:00
Sei Lisa
23b27bd3af Produce more math errors in division
Besides dividing by zero, any result producing NaN including inf/inf, NaN/anything, anything/NaN causes a math error as well. We only contemplated NaN/anything and neglected the rest, so we generalize it.
2016-05-15 18:21:24 +02:00
Sei Lisa
28a8f0757c Check the scope as well as the label name, for academic correctness' sake. 2016-05-08 04:14:32 +02:00
Sei Lisa
91ad438bb7 Be a bit smarter when optimizing out default labels.
(Was a TODO item). Also cosmetic changes.
2016-05-08 03:55:55 +02:00
Sei Lisa
3669bbb06e Only add a label and a jump for default and break when necessary.
Well, within reasonable limits.

For break, it's explained in the code. If the block is empty of actual code (code that generates output), then the break position is eliminated.

For default, if the default label is at the top of the block, the jump and the label are both eliminated. This check doesn't include verifying that there are other non-code-generating statements in between, so there's room for improvement (added corresponding TODO item).

This way, we're on par with FS, in case someone (ab)used the FS brokeness when the 'default' label was absent. All one has to do now is add the default label at the top, and the generated code will be the same as it was in FS when abusing that bug, with no extra burden.

Example: In FS, the code at the top acted as default and there was no jump for it:

  default { timer() {
    switch(1)
    {
      0;
     case 1:
      1;
    }
  }}

This generated roughly:
  default { timer() {
    {
      if (1 == 1) jump CASE_1;
      0;
      @CASE_1;
      1;
    }
  }}

In this system, it would trigger an error by default. To obtain the FS behaviour, the scripter can do instead:
  default { timer() {
    switch(1)
    {
     default:
      0;
     case 1:
      1;
    }
  }}

Thanks to this optimization, the code will be the same as in FS. Without it, an extra default label and corresponding jump would be present.
2016-05-07 04:40:37 +02:00
Sei Lisa
b7e6e6f7b1 Fix bug with tab handling.
Commit 5804a9a introduced a bug where having the foldtabs option disabled (normal) prevented optimizations of functions. Fix it for good (hopefully). While on it, rename the nofoldtabs option to warntabs, making it default, and use it to disable a warning when there are tabs in a string.
2016-05-07 03:18:50 +02:00
Sei Lisa
697e80cb16 Rather than reproduce the broken behaviour, throw an error on missing default.
Changed my mind. This looks saner. Now, if the 'default:' label is missing, an error will be thrown by default. It has to be explicitly disabled if normal C-like behaviour is desired (namely to jump to the 'break' label if no condition is met).
2016-05-07 02:38:54 +02:00
Sei Lisa
b1b84a123e Add broken FS switch behaviour for compatibility.
In the absence of a 'default' label within a switch, FS falls through to the first CASE label (or to the code before the first CASE if there's any).

This commit adds an option, active by default for FS compatibility, that mimics this broken behaviour, as well as a warning in case the 'default' label is absent, which also triggers another warning when the option is active.
2016-05-06 20:15:46 +02:00
Sei Lisa
bb198b3745 Add a (currently disabled) viable and tested alternative to c_float for F32. 2016-05-06 20:11:41 +02:00
Sei Lisa
41149a17aa Report a type mismatch in globals in a more meaningful position.
For example, this script reported the type mismatch in default:

key k=0;
default{timer(){}}

Now it's reported at the semicolon, which is as early as it can be identified and much more meaningful.
2016-04-04 13:58:25 +02:00
Sei Lisa
dc98e477d7 Add 'nofoldtabs' option to disable warning when a function generates tabs
When a function folds to a string that contains a tab, e.g. llUnescapeURL("%09"), or to a list that contains a string that contains a tab, a warning is emitted unless the foldtabs option (which forces the optimization) is used. This option allows to quiet the warning without forcing the optimization.
2016-04-01 20:48:33 +02:00
Sei Lisa
5804a9a610 Refine the test for tabs so that it checks strings in lists too. 2016-03-30 21:01:16 +02:00
Sei Lisa
7283842b3a Make an error message more explicit.
Resolving some constant function calls may generate tabs, e.g. llUnescapeURL("%09"). That can't be pasted into a script, and a warning is emitted. The warning text was misleading, making one think that something went wrong when all that happened is that an optimization couldn't be applied. Rewrite the text of the warning to be clearer about what the problem is.
2016-03-30 18:29:11 +02:00
Sei Lisa
b0e5a50a59 Fix discrepancy with LSL in llCSV2List.
In LSL, llCSV2List eats the very first space in the string if there's one. This patch implements that behaviour.
2016-03-25 20:52:48 +01:00
Sei Lisa
14f70c93b4 Fix bug in llCSV2List when there's no space after comma but there's a space in the value.
E.g. llCSV2List(",A B") produced ["", "B"].
2016-03-25 20:44:59 +01:00
Sei Lisa
661853be53 Fix llRot2Axis to negate the axis when s is negative. 2016-01-22 20:54:43 +01:00
Sei Lisa
c555a01a48 It's possible to enter Infinity as a float constant, so do that rather than the (float)"inf" kludge. It remains for NaN though. 2016-01-06 01:21:04 +01:00
Sei Lisa
881a33a427 Remove unnecessary line 2016-01-03 01:30:22 +01:00
Sei Lisa
cfb9dee941 Parse_unary_postfix_expression shouldn't accept the token (i.e. advance to the next) if it's not processed. This caused a mismatch between the reported syntax error and the position where it should have been detected. Fixed.
Added corresponding regression test.
2016-01-03 01:29:57 +01:00
Sei Lisa
ceb442e931 Improve error reporting, by printing the errored line and a caret (^), taking care to display the beginning of the token the error is at. 2016-01-02 03:39:47 +01:00
Sei Lisa
9469855769 Document the internal behaviour of run_time_permissions under LSO 2015-12-11 02:28:51 +01:00
Sei Lisa
91201f1e30 Remove old TODO and add new one.
Identifiers can be equal if they belong to different syntactic scopes. That will allow better reuse and less creation of new identifiers, most notably as function and event parameter names.

The implementation would require a stack of counters where the current value is pushed when entering a new scope, and popped when exiting, rather than using a single counter for the whole program.
2015-12-09 05:11:53 +01:00
Sei Lisa
025f0f8440 str() doesn't return a fully-expanded float. repr() does. 2015-12-09 03:37:01 +01:00
Sei Lisa
6ec2667bf3 Refine comments 2015-09-24 22:02:46 +02:00
Sei Lisa
57cacf29bb Return a float when typecasting returns zero (fixes inconsistent type) 2015-09-22 14:14:26 +02:00
Sei Lisa
aee638e900 Return denormals as 0 in (float)"number". Found by Pedro Oval. 2015-09-21 21:15:48 +02:00
Sei Lisa
2d72b8e198 Fix llList2CSV with -nan in vector and quaternion (with test case). 2015-09-09 18:14:27 +02:00
Sei Lisa
2044f888d4 Fix bug where (typecast)[single_expr] was output as (typecast)(list)single_expr, producing a syntax error in the output for lack of extra parentheses. 2015-09-09 04:14:55 +02:00
Sei Lisa
6b7b366f63 Fix llRot2Euler exception 2015-09-08 03:47:00 +02:00
Sei Lisa
bc4f574b33 Managed to deal with the '-nan' case in llList2CSV. Add test cases. 2015-09-07 02:56:44 +02:00
Sei Lisa
0122d6ed70 On second thought, disable explicitcast for list+nonlist and nonlist+list entirely, as they are not the same as list+(list)nonlist and (list)nonlist+list anyway. 2015-09-05 03:09:46 +02:00
Sei Lisa
d8649deebd nonlist + list was returning the type of the nonlist element. Fixed and added a
regression test.

Funnily enough, it was correct if explicit cast was active. Removed from explicit cast now that it's active for all.
2015-09-04 05:56:05 +02:00
Sei Lisa
aa74e6ed64 Sadly, Python can't represent -nan, even though llList2CSV can display it. Add a note to that effect. 2015-09-04 05:46:18 +02:00
Sei Lisa
15f1a07a72 There were more translated events. After an exhaustive analysis this is the definitive list. 2015-08-21 03:35:20 +02:00