This is an automated email from the ASF dual-hosted git repository.
gregdove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/royale-docs.git
The following commit(s) were added to refs/heads/master by this push:
new d0a7ee9 Adding some docs for various optimization options for
javascript. For review by others...
d0a7ee9 is described below
commit d0a7ee9b60cbeb18665947017117256c0f8c0a4b
Author: greg-dove <[email protected]>
AuthorDate: Thu Jun 27 12:38:30 2019 +1200
Adding some docs for various optimization options for javascript. For
review by others...
---
_data/toc.json | 11 +
build.xml | 21 +-
create-an-Application.md | 3 +
create-an-application/optimizations.md | 35 +++
.../compiler-configuration-settings.md | 163 ++++++++++++++
.../optimizations/doc-comment-directives.md | 243 +++++++++++++++++++++
6 files changed, 474 insertions(+), 2 deletions(-)
diff --git a/_data/toc.json b/_data/toc.json
index 5df2fc3..799d78f 100644
--- a/_data/toc.json
+++ b/_data/toc.json
@@ -157,6 +157,17 @@
},
{
"path": "create-an-application/code-conventions.md"
+ },
+ {
+ "path": "create-an-application/optimizations.md",
+ "children": [
+ {
+ "path":
"create-an-application/optimizations/compiler-configuration-settings.md"
+ },
+ {
+ "path":
"create-an-application/optimizations/doc-comment-directives.md"
+ }
+ ]
}
]
}
diff --git a/build.xml b/build.xml
index 31109d8..850d2b9 100644
--- a/build.xml
+++ b/build.xml
@@ -25,13 +25,30 @@
<property environment="env"/>
<property file="${basedir}/../local.properties"/>
<property file="${basedir}/../build.properties"/>
-
+ <condition property="jekyll.executable" value="jekyll" else="jekyll.bat" >
+ <not>
+ <os family="windows"/>
+ </not>
+ </condition>
+
+ <property name="launchURL" value="http://127.0.0.1:4000/royale-docs/"/>
+
<target name="main" description="Build everything">
- <exec executable="jekyll" failonerror="true">
+ <exec executable="${jekyll.executable}" failonerror="true">
<arg value="build" />
<arg value="--config" />
<arg value="local_config.yml" />
</exec>
</target>
+ <target name="serve" description="Serve and launch">
+ <!-- this approach/sequence works on windows, needs checking on
mac -->
+ <script language="javascript"><![CDATA[
+ var location =
project.getProperty("launchURL").toString();
+
java.awt.Desktop.getDesktop().browse(java.net.URI.create(location));
+ ]]></script>
+ <exec executable="${jekyll.executable}" failonerror="true">
+ <arg value="serve" />
+ </exec>
+ </target>
</project>
diff --git a/create-an-Application.md b/create-an-Application.md
index b8f1a98..ba1d02f 100644
--- a/create-an-Application.md
+++ b/create-an-Application.md
@@ -36,3 +36,6 @@ This document is divided into several sections:
[Modules](create-an-application/modules.html) discusses how to break your
application into pieces so it doesn't have to all get downloaded at once. Or
have the whole thing compiled at once.
[Royale code conventions](create-an-application/code-conventions.html)
explains the typical ways Royale developers name files, classes, function,
variables and more.
+
+[Optimizations](create-an-application/optimizations.html) explains some of the
compiler settings and in-code doc comment directives that can be used to tune
the output of javascript that Royale generates.
+
diff --git a/create-an-application/optimizations.md
b/create-an-application/optimizations.md
new file mode 100644
index 0000000..5f28067
--- /dev/null
+++ b/create-an-application/optimizations.md
@@ -0,0 +1,35 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+layout: docpage
+title: Optimizations
+---
+# Optimizations
+
+Warning: This document is a work-in-progress/undergoing review.
+
+## Optimization options
+
+The following content explains optimizations for javascript output that you
can use when configuring the Royale compiler directly or by using doc-comment
directives in your actionscript code.
+Many settings have corresponding approaches between the over-arching compiler
level influence of compilation settings and those with more specificity at the
code level, so to avoid repetition, it is recommended that you get familiar
with the Compiler settings first.
+
+[Compiler Configuration
Settings](create-an-application/optimizations/compiler-configuration-settings.html)
These are settings that affect the output of the current compilation based on
compiler configuration settings.
+
+[Doc-Comment Compiler
Directives](create-an-application/optimizations/doc-comment-directives.html)
These are settings that affect the output of the current compilation by using
doc-comment compiler directives in your actionscript code.
+
+
+
+
diff --git
a/create-an-application/optimizations/compiler-configuration-settings.md
b/create-an-application/optimizations/compiler-configuration-settings.md
new file mode 100644
index 0000000..2a00941
--- /dev/null
+++ b/create-an-application/optimizations/compiler-configuration-settings.md
@@ -0,0 +1,163 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+layout: docpage
+title: Compiler configuration settings
+---
+## (Optimization options)
+# Compiler configuration settings
+
+Warning: This document is a work-in-progress/undergoing review.
+
+Definitions:
+AVM
+: Actionscript Virtual Machine. You can also broadly interpret this to mean
'SWF at runtime', the 'flash player' or 'Adobe AIR runtime'.
+
+The following content explains optimizations for javascript output that you
can use when configuring the Royale compiler directly.
+Often these settings involve removing some javascript emulations of runtime
type-safety that are present in AVM.
+It can be useful to develop your application with these settings 'on' and then
consider 'switching them off' for your release build when you have assured
yourself it is safe to do so.
+This can help to improve performance and/or reduce the size of your final
application build.
+These settings can be provided on the commandline or via royale-config.xml, or
via the additionalOptions tag for compiler in maven's pom.xml.
+
+|[Initialization of default
values](create-an-application/optimizations/compiler-configuration-settings.html#default-initializers)
|
+|[Implict Coercions of non-primitive
types](create-an-application/optimizations/compiler-configuration-settings.html#implicit-complex-coercions)
|
+|[Parity for strict equality
comparisons](create-an-application/optimizations/compiler-configuration-settings.html#strict-equality-comparisons)
|
+|[Vector Index
Checking](create-an-application/optimizations/compiler-configuration-settings.html#vector-index-checking)
|
+
+* * *
+### Default initializers {#default-initializers}
+#### -js-default-initializers (this setting is true by default)
+
+This corresponds to AVM runtime implicit type intialization values, in
particular for primitive types.
+Note that some reflection utility functions require this to be true in order
for them to work correctly in javascript.
+
+>Todo: This content is yet to be created
+
+
+
+* * *
+### Implict Coercions of non-primitive types {#implicit-complex-coercions}
+#### -js-complex-implicit-coercions (this setting is true by default)
+
+This corresponds to AVM runtime implicit type coercions for non-primitive
types (anything that is not a Number, int, uint, String, Boolean) and is not
being cast to something that is untyped (__*__ type) or loosely typed, e.g. of
**Object** type.
+
+An (overly simplistic) example would be:
+```actionscript
+var cat:Cat = new Cat();
+var myCats:Array = [cat];
+//from this point on, array access of index 0 in myCats
+//represents an unknown type (from the compiler's perspective)
+//in AVM, the following would always cause a runtime error
+//unless Cat was a subclass of Dog, which we will assume it is not!
+var dog:Dog = myCats[0];
+```
+
+With *-js-complex-implicit-coercions=true* (the default setting), the above
example will behave the same in javascript at runtime as it would in AVM.
+However supporting this runtime behavior does generate extra type-checking
code to achieve that result.
+In most cases this extra code can be eliminated in the output after the
application has been validated to be error-free at runtime.
+There may however be cases with legacy actionscript that depend on
error-handling for these situations and where refactoring that aspect is not a
priority.
+In these cases it can be left on in the release build, or there is also the
option to switch it off in general but force it to remain on for specific code
scope, for example, using
[@royalesuppresscompleximplicitcoercion](create-an-application/optimizations/doc-comment-directives.html#royalesuppresscompleximplicitcoercion).
+
+Does this feature always catch implicit complex coercions?
+No, currently there can still be cases which are missing this level of runtime
type safety.
+Notably this can occur in the processing of mxml instances or binding support.
+
+#### Pro tip:
+How do I know how much of my code is being affected by this setting?
+In the javascript **js‑debug** output, you can do a ***search in
files*** for the string **/* implicit cast */** which precedes the
compiler-generated code the to support this parity with AVM.
+That will show you all the sites where it is being output. As with all other
code, this can be minimized in the js-release output, but as mentioned earlier,
if the application does not have runtime errors, then the performance of the
application could be optimized by eliminating these checks.
+
+* * *
+### Parity for strict equality comparisons {#strict-equality-comparisons}
+#### -js-resolve-uncertain (this setting is true by default)
+
+This is a relatively rare as3 language parity feature that is applied by the
compiler when instantiating an unknown class.
+It ensures greater compatibility between AVM and javascript, in particular for
strict equality comparisons.
+This is not just important for the binary operators like `===` or `!==`, but
also for things like `Array.indexOf`, which uses strict equality for checking.
+
+An (overly simplistic) example would be:
+```actionscript
+var clazz:Class = String;
+var test:Array = ['test', new clazz(30.5)];
+//in AVM, the above would result in: ['test', '30.5']
+var idx:int = test.indexOf('30.5');
+//with js-resolve-uncertain=true idx will be 1 above (correct)
+//in javscript, with js-resolve-uncertain=false, it would be -1 (incorrect)
+```
+
+In most cases this setting is probably not going to cause performance issues.
But it does add a small amount of extra overhead in both size and performance.
+The main variations to cover are the primitive types: **Number**, **String**,
**Boolean** etc., as well as synthetic types for **int** and **uint**.
+So it can be switched off if after testing it is deemed safe to do so.
+Or it can be specifically avoided or explicitly switched on in specific areas
of code with
[@royalesuppressresolveuncertain](create-an-application/optimizations/doc-comment-directives.html#royalesuppressresolveuncertain).
+
+***Pro tip:***
+How do I know how much of my code is being affected by this setting?
+In javascript the **js‑debug** output, you can do a ***search in
files*** for the string **Language.resolveUncertain**
+* * *
+
+### Vector index checking {#vector-index-checking}
+#### -js-vector-index-checks (this setting is true by default)
+This corresponds to AVM runtime checking during Vector index assignments
(*note:* currently only for assignment, not access)
+
+An (overly simplistic) example would be:
+```actionscript
+var myVec:Vector.<Number> = new Vector.<Number>();
+myVec[1] = 2;
+//the above will generate a runtime error in AVM,
+//because Vectors must have contiguous index ranges.
+//In this case the length is zero, and the first assignment
+//can only be made to index 0, not index 1.
+```
+
+or:
+```actionscript
+myVec = new Vector.<Number>(20,true); //create a fixed length Vector, with
indices 0 to 19.
+myVec[20] = 2;
+//the above will generate a runtime error in AVM,
+//because you cannot use an index beyond the permitted range
+//of fixed Vectors.
+//In this case the length is 20, and the only assignment can be to indices 0
to 19
+```
+
+With *-js-vector-index-checks=true* (the default setting), the above 2
examples will behave the same in javascript at runtime as they would in AVM and
in both cases generate a runtime error.
+However supporting this runtime behavior does generate extra code to achieve
that result.
+In most cases it could be avoided to assist with performance. This is
particularly relevant when index level assignments are made inside a loop.
+Often the loop variable is used as the index for the value assignment, and in
this case, it is usually already certain to be within the valid range for the
targetted Vector instance.
+For example:
+
+```actionscript
+var l:uint = myVec.length;
+for (var i:uint = 0; i<l; i++) {
+ myVec[i] = i/SOME_CONST;
+ //in the above case i is always in the valid range for myVec
+}
+```
+
+In the above example, the compiler will by default be generating something in
javascript that is (pseudocode) sort of like:
+`myVec[myVec.checkIndex(i)] = i/SOME_CONST;`
+
+Where `myVec.checkIndex(i)` in the pseudocode checks that `i` is in the valid
range for myVec, and returns it unchanged if it is, otherwise throws an error
that corresponds to what would happen at runtime in AVM.
+
+This is obviously not needed in the above case, and will definitely slow the
loop down, so for performance reasons it is important to remove this generated
code for large loops.
+So once everything has been verified to work correctly in your app, it is
often a good idea to switch off the generation of this type of code.
+As with other settings it is possible to switch it off or on with more
specificity by using [doc comment
directives](create-an-application/optimizations/doc-comment-directives.html).
+If you are porting legacy as3 code, it can be useful to check that the code
does not rely on error trapping for any of these cases before switching this
setting off.
+
+***Pro tip:***
+How do I know how much of my code is being affected by this setting?
+In javascript the **js‑debug** output, you can do a ***search in
files*** for the string **Language.CHECK_INDEX**
+* * *
+
diff --git a/create-an-application/optimizations/doc-comment-directives.md
b/create-an-application/optimizations/doc-comment-directives.md
new file mode 100644
index 0000000..7f7eaf8
--- /dev/null
+++ b/create-an-application/optimizations/doc-comment-directives.md
@@ -0,0 +1,243 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+layout: docpage
+title: Doc-Comment Directives
+---
+## (Optimization options)
+# Doc-Comment Directives
+
+
+Warning: This document is a work-in-progress/undergoing review.
+
+
+These settings are actionscript code level settings. They are implemented in
the form of instructions to the compiler based on doc-comment tags, frequently
as annotations against members of classes.
+They are always in the format
+ **@royale{name here}**
+
+They have no case variation (all lower case, not camel case, for example) and
may have arguments that follow after some white space. They are fully expressed
on a single line, and a newline terminates them.
+
+
+|[Suppress
Warnings](create-an-application/optimizations/doc-comment-directives.html#suppress-warnings)
|[@royalesuppresspublicvarwarning](create-an-application/optimizations/doc-comment-directives.html#royalesuppresspublicvarwarning)
|
+|[Output
Optimizations](create-an-application/optimizations/doc-comment-directives.html#output-optimizations)
|[@royaleigorecoercion](create-an-application/optimizations/doc-comment-directives.html#royaleigorecoercion)
|
+|
|[@royalesuppressresolveuncertain](create-an-application/optimizations/doc-comment-directives.html#royalesuppressresolveuncertain)
|
+|
|[@royalesuppresscompleximplicitcoercion](create-an-application/optimizations/doc-comment-directives.html#royalesuppresscompleximplicitcoercion)
|
+|
|[@royalesuppressvectorindexcheck](create-an-application/optimizations/doc-comment-directives.html#royalesuppressvectorindexcheck)
|
+|[Miscellaneous](create-an-application/optimizations/doc-comment-directives.html#miscellaneous)
|[@royalesuppressexport](create-an-application/optimizations/doc-comment-directives.html#royalesuppressexport)
|
+|
|[@royalesuppressclosure](create-an-application/optimizations/doc-comment-directives.html#royalesuppressclosure)
|
+
+
+* * *
+## Todo
+The following are placeholders/reminders for future content while this
document is being worked on:
+>@royaleignoreimport
+>@royaledebug
+>@royalenoimplicitstringconversion
+
+* * *
+## Suppress Warnings
+
+### @royalesuppresspublicvarwarning {#royalesuppresspublicvarwarning}
+This is used to suppress warning output by the compiler.
+
+public variables are not protected from renaming optimizations by javascript
in a way that permits them to continue to be accessible via dynamic access.
+This means that for:
+
+class MyThing{
+ public var myImportantVar:String = 'myValue';
+}
+```actionscript
+var myThing:MyThing = new MyThing();
+var s:String = myThing.myImportantVar; //this always works
+var fieldName:String = 'myImportantVar';
+s = myThing[fieldName]; //this will work in a js-debug build, but may not work
in js-release
+```
+Because of issues like the above, the Royale compiler outputs a warning to
alert the developer.
+However in many cases, the dynamic access may not be needed, and using a
public var will be fine.
+To prevent the warning from the compiler, the doc comment directive can be
used as follows:
+```actionscript
+/**
+* @royalesuppresspublicvarwarning
+*/
+public var myImportantVar:String = 'myValue';
+```
+* * *
+## Output Optimizations
+
+### @royaleigorecoercion type {#royaleigorecoercion}
+
+Used for: performance tuning, code size tuning.
+This is an option to avoid compiler output of coercions of a certain type.
+It can help avoid unnecessary code and improve performance.
+
+A simplistic, illustrative example is:
+```actionscript
+if (myVar is MyClass) { //this generates code to check if myVar is of type
'MyClass'
+ (myVar as MyClass).myClassMethod();
+ //the above normally generates similar code to check if myVar is of
type 'MyClass'
+ //or a subclass of MyClass, and if it is not, treats it as null
+ MyClass(myVar).myOtherClassMethod();
+ //the above normally generates similar code to check if myVar is of
type 'MyClass'
+ //or a subclass of MyClass, and if it is not, throws an error
+}
+```
+In both the above examples, the outer conditional `myVar is MyClass` check
already assures us that myVar resolves to 'MyClass' as a type.
+So the extra overhead of code that performs `myVar as MyClass` or
`MyClass(myVar)` coercions is redundant, because we can already be sure it will
resolve successfully.
+If the definition of MyClass is in a package called mypackage, then its
**fully qualified name** is mypackage.MyClass.
+The following can then be used to avoid the redundant (as described above)
javascript output code:
+```
+/**
+* @royaleigorecoercion mypackage.MyClass
+* /
+```
+
+* * *
+
+### @royalesuppressresolveuncertain optional_arg
{#royalesuppressresolveuncertain}
+
+Used for: performance tuning, code size tuning.
+This is a local variation for controlling specificity of the corresponding
compiler configuration setting '-js-resolve-uncertain'.
+Please read the [Strict equality
comparisons](create-an-application/optimizations/compiler-configuration-settings.html#strict-equality-comparisons)
section of [Compiler Configuration
Settings](create-an-application/optimizations/compiler-configuration-settings.html)
for general information about this setting.
+
+
+How to use:
+A simplistic example is:
+```actionscript
+/**
+* setting goes here
+*/
+public function testResolveUncertain():void{
+ var myClass:Class = int;
+ if (new myClass(30) === 30) trace('it worked!);
+ var myOtherClass:Class = String;
+ if (new myOtherClass('test') === 'test') trace('it worked again!);
+}
+```
+In the above example, both of 'new myClass(30)' and 'new myOtherClass('test')'
will have extra code to cover the cases where variations occur in javascript.
+
+**@royalesuppressresolveuncertain false**
+
+Using the above setting, if the compiler configuration setting is
-js-resolve-uncertain=false, then the above annotation will override that
locally to turn it on (true).
+This only affects the code scope of the annnotated method definition.
+
+**@royalesuppressresolveuncertain true**
+or simply:
+**@royalesuppressresolveuncertain**
+Both of the above settings will be the same as '-js-resolve-uncertain=false'
for the annotated method's code scope.
+
+**@royalesuppressresolveuncertain myClass**
+Using the above setting, if the compiler configuration setting is
-js-resolve-uncertain=true, then the above annotation will override that
locally to turn it off (false) only for the myClass Class variable and not for
the myOtherClass Class variable.
+
+
+* * *
+
+### @royalesuppressvectorindexcheck optional_arg
{#royalesuppressvectorindexcheck}
+
+Used for: performance tuning, code size tuning.
+This is a local variation for controlling specificity of the corresponding
configuration setting '-js-vector-index-checks'.
+
+Please read the [Vector Index
Checking](create-an-application/optimizations/compiler-configuration-settings.html#vector-index-checking)
section of [Compiler Configuration
Settings](create-an-application/optimizations/compiler-configuration-settings.html)
for general information about this setting.
+
+How to use:
+A simplistic example is:
+```actionscript
+/**
+* setting goes here
+*/
+public function myTest():void{
+ var vi:Vector.<int> = new <int>[0, 1, 2, 3, 4];
+ vi[8] = 0;
+ //index 8 above is too high
+ //by default this will throw a RangeError, but if
+ //@royalesuppressvectorindexcheck is used to suppress index checking,
+ //no runtime error would be thrown in javascript.
+}
+```
+
+**@royalesuppressvectorindexcheck false**
+
+In the above case, if the compiler configuration setting is
*-js-vector-index-checks=false*, then the above annotation will override that
locally to turn it on (true).
+This only affects the code scope of the annnotated method definition.
+
+**@royalesuppressvectorindexcheck true**
+or simply:
+**@royalesuppressvectorindexcheck**
+
+Both of the above settings will be the same as '-js-vector-index-checks=false'
for the annotated method's code scope.
+
+**@royalesuppressvectorindexcheck vi**
+
+In the above case, the effect is as if there was a
'-js-vector-index-checks=false' setting applied specifically to any Vector with
a variable name of 'vi'
+
+
+* * *
+
+### @royalesuppresscompleximplicitcoercion optional_arg
{#royalesuppresscompleximplicitcoercion}
+
+Used for: performance tuning, code size tuning.
+This is a local variation for controlling specificity of the corresponding
configuration setting '-js-complex-implicit-coercions'.
+Please read the [Implict Coercions of non-primitive
types](create-an-application/optimizations/compiler-configuration-settings.html#implicit-complex-coercions)
section in [Compiler Configuration
Settings](create-an-application/optimizations/compiler-configuration-settings.html)
for general information about this setting if you have not already done so.
+How to use:
+
+A simplistic example is:
+```actionscript
+/**
+* setting goes here
+*/
+public function testComplexImplicitCoercion():void{
+ var something:* = new Cat();
+ var myDog:Dog = something;
+}
+```
+In the above example, the default output will have extra code generated in
javascript, that would be similar in actionscript to:
+`var myDog:Dog = Dog(something);`
+
+**@royalesuppresscompleximplicitcoercion false**
+
+Using the above setting, if the compiler configuration setting is
-js-complex-implicit-coercions=false, then the above annotation will override
that locally to turn it on (true).
+This only affects the code scope of the annnotated method definition.
+
+**@royalesuppresscompleximplicitcoercion true**
+or simply:
+**@royalesuppresscompleximplicitcoercion**
+Both of the above settings will be the same as
'-js-complex-implicit-coercions=false' for the annotated method's code scope.
+
+**@royalesuppresscompleximplicitcoercion Dog**
+Note that in this example, Dog is a top level class (top level package).
Otherwise it needs the fully qualified class name.
+Using the above setting, if the compiler configuration setting is
-js-complex-implicit-coercions=true, then the above annotation will override
that locally to turn it off (false) only for the implicit coercions involving
the Dog class.
+As another example, if the definition of Dog is in a package called myanimals,
then its fully qualified name is myanimals.Dog, and it should be expressed as
follows:
+**@royalesuppresscompleximplicitcoercion myanimals.Dog**
+
+
+
+* * *
+## Miscellaneous
+
+The following are intended mainly for use by framework developers, but are
documented here for completeness. In most cases these are not recommended for
use in applications.
+They may be helpful in specific cases *when used with caution* for library
development.
+
+### @royalesuppressexport {#royalesuppressexport}
+The above is used to prevent a public class member from having an exported
setting in the release build.
+This can be used with classes that are used to emulate certain as3 language
features in javascript, and often are intended only for output generated by the
compiler and not used directly by a developer.
+It has the effect to making the annotated class member 'pay as you go' because
if the compiler does not generate output that uses it, the code and any
dependencies that are specific to it are eliminated from the release build
output.
+They can also be used as another way to offer opt-in features, for a type of
PAYG approach that works in regular actionscrip, and which could also be then
supported in code via a bead for use in mxml.
+An example of this is the ExtraData class in the Reflection library, which has
static methods to add opt-in support for additional reflection data.
+
+### @royalesuppressclosure {#royalesuppressclosure}
+The above is used to suppress closure generation inside a method scope of a
class member.
+This breaks normal as3 behavior in the javascript output, and is only rarely
needed in cases where there is an advantage to use it to generate javascript
that treats the ***this*** reference differently in the generated code.
+An example of its usage is in the default Vector emulation code for javascript.
+Recommendation: use with caution and test extensively.
\ No newline at end of file