Hi

Yes (it's weird!) - okay so I just set the -remove-circulars option to true 
explicitly but still no change (from the default).

If you look in your html file, do you get just:
goog.addDependency('../../../org/apache/royale/utils/BinaryData.js', 
['org.apache.royale.utils.BinaryData'], 
['org.apache.royale.utils.IBinaryDataInput', 
'org.apache.royale.utils.IBinaryDataOutput']);
for the dependencies of it?

In the big list of dependencies at the start, then yes Endian is showing up 
there. BinaryData isn't in that big list, because this is a dependency of 
another of my classes (which is in the list). It's constructor is being called 
because there's a static property being initialised i.e.
static private var _bytes : BinaryData = new BinaryData();


From a bit more digging, the issue (whether it happens or not) seems to be due 
to the order in which the files are loaded; there can be a specific order be 
applied in terms of ensuring that the dependencies are loaded before the 
classes that require them, but there isn't a dependency link between BinaryData 
and Endian (as you can see from your compiled .js files). So without this 
dependency, it seems like luck? as to which order these go in?

I've just created another project and this one works fine, but in the network 
info I can that Endian.js is being loaded prior to BinaryData.js. I can't see 
why this would be: it seems to just be down to the order that the big 
dependency list at the start of the html script is written. And I can't 
actually see why with one project, I'm ending up with one of our own classes 
early on in that list ... which means I currently have two solutions for fixing 
this: (a) add the endian dependency to the binarydata line in the html; (b) 
reorder the main list of dependencies at the top of the html to make endian 
appear earlier on. Neither of these are a good solution when this file is 
generated on every build!!

So: am I right in thinking that the dependency list for the BinaryData.js 
should include the Endian one? i.e. this is wrong:
goog.addDependency('../../../org/apache/royale/utils/BinaryData.js', 
['org.apache.royale.utils.BinaryData'], 
['org.apache.royale.utils.IBinaryDataInput', 
'org.apache.royale.utils.IBinaryDataOutput']);

If so, then that needs to change (somehow) and it would then solve my problem...

thanks

   Andrew


-----Original Message-----
From: Harbs [mailto:harbs.li...@gmail.com] 
Sent: 19 July 2018 13:32
To: dev@royale.apache.org
Subject: [EXTERNAL] Re: Query on Royale dependency generation

The Endian dependency should be added to the main application dependency. The 
entire list should be included there. (I have 872 dependencies listed.) 
‘org.apache.royale.utils.Endian’ is one of them.

I am also using URLStream and URLBinaryLoader which list Endian as a 
dependency, so it’s possible it’s being pulled from there. I’m not sure I have 
an application which uses BinaryData without one of those.

> On Jul 19, 2018, at 3:19 PM, Harbs <harbs.li...@gmail.com> wrote:
> 
> That’s weird. I believe the default is false (although I think the default 
> should be true).
> 
> Try setting -remove-circulars to true. I think that should resolve it.
> 
> Yes. I’m using BinaryData extensively.
> 
>> On Jul 19, 2018, at 3:15 PM, Frost, Andrew <andrew.fr...@harman.com> wrote:
>> 
>> Hi
>> 
>> I'm not using it on my build command line, i.e. it's set as the default 
>> 'true'.
>> 
>> If I do set it to 'false' then I get what I would expect from the code, i.e. 
>> it ignores the interfaces and just outputs the discovered dependencies - 
>> including the google one:
>> goog.addDependency('../../../org/apache/royale/utils/BinaryData.js', 
>> ['org.apache.royale.utils.BinaryData'], ['goog.DEBUG', 
>> 'org.apache.royale.utils.Endian']);
>> 
>> But now I get hundreds of errors from the browser's JS engine e.g. 
>> IStatesObject.js:42 Uncaught TypeError: Cannot read property 
>> 'IEventDispatcher' of undefined
>>   at IStatesObject.js:42
>> (anonymous) @ IStatesObject.js:42
>> IUIBase.js:58 Uncaught TypeError: Cannot read property 'IEventDispatcher' of 
>> undefined
>>   at IUIBase.js:58
>> (anonymous) @ IUIBase.js:58
>> IBeadModel.js:38 Uncaught TypeError: Cannot read property 'IEventDispatcher' 
>> of undefined
>>   at IBeadModel.js:38
>> (anonymous) @ IBeadModel.js:38
>> Event.js:33 Uncaught TypeError: Cannot read property 'Event' of undefined
>>   at Event.js:33
>> (anonymous) @ Event.js:33
>> base.js:2484 Uncaught TypeError: Cannot read property 'prototype' of 
>> undefined
>>   at Object.goog.inherits (base.js:2484)
>>   at UIBase.js:44
>> goog.inherits @ base.js:2484
>> (anonymous) @ UIBase.js:44
>> base.js:2484 Uncaught TypeError: Cannot read property 'prototype' of 
>> undefined
>>   at Object.goog.inherits (base.js:2484)
>>   at eventtarget.js:96
>> goog.inherits @ base.js:2484
>> (anonymous) @ eventtarget.js:96
>> base.js:2484 Uncaught TypeError: Cannot read property 'prototype' of 
>> undefined
>>   at Object.goog.inherits (base.js:2484)
>>   at HTMLElementWrapper.js:28
>> .....
>> 
>> 
>> I'm assuming I'm not meant to be editing the html dependency list manually 
>> (there's another one to change, Namespace.js has a dependency on Language.js 
>> due to the use of "is") so unless something here is project-specific that's 
>> changing how it's outputting/parsing the dependencies, I'm not sure what's 
>> up.
>> 
>> If anyone has a project that uses BinaryData, are they able to check 
>> what they see in the generated HTML for that one, to see whether it's 
>> just me who doesn't have the Endian dependency added..? FWIW I've 
>> been trying both with 0.9.2 downloaded via NPM, and the latest 
>> develop branch (well perhaps a week out of date now..)
>> 
>> thanks
>> 
>>  Andrew
>> 
>> 
>> -----Original Message-----
>> From: Harbs [mailto:harbs.li...@gmail.com]
>> Sent: 19 July 2018 12:18
>> To: dev@royale.apache.org
>> Subject: [EXTERNAL] Re: Query on Royale dependency generation
>> 
>> Are you using the -remove-circulars compiler option?
>> 
>>> On Jul 19, 2018, at 1:05 PM, Frost, Andrew <andrew.fr...@harman.com> wrote:
>>> 
>>> Hi guys
>>> 
>>> I'd been getting an error when running a simple Royale application:
>>> Uncaught TypeError: Cannot read property 'BIG_ENDIAN' of undefined  
>>> at new org.apache.royale.utils.BinaryData (BinaryData.js:28)
>>> 
>>> the line in question is from the constructor:
>>> org.apache.royale.utils.BinaryData = function(bytes) {  bytes = 
>>> typeof bytes !== 'undefined' ? bytes : null;  this._endian = 
>>> org.apache.royale.utils.Endian.BIG_ENDIAN;
>>> and "Endian" is undefined.
>>> 
>>> After a little digging I found this is because the BinaryData object is 
>>> being constructed without the JS engine having knowledge of the "Endian" 
>>> class: something went wrong with the google dependency thing. In my 
>>> generated html page I have a line:
>>> goog.addDependency('../../../org/apache/royale/utils/BinaryData.js',
>>> ['org.apache.royale.utils.BinaryData'],
>>> ['org.apache.royale.utils.IBinaryDataInput',
>>> 'org.apache.royale.utils.IBinaryDataOutput']);
>>> and if I change this to:
>>> goog.addDependency('../../../org/apache/royale/utils/BinaryData.js',
>>> ['org.apache.royale.utils.BinaryData'],
>>> ['org.apache.royale.utils.IBinaryDataInput',
>>> 'org.apache.royale.utils.IBinaryDataOutput',
>>> 'org.apache.royale.utils.Endian']);
>>> then it works.
>>> 
>>> Looking at where this comes from in the compiler:
>>> compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/
>>> Go ogleDepsWriter.java function "generateDeps" is creating these 
>>> lists, and if the "removeCirculars" value is true (which it is by 
>>> default unless changed on the command-line) then we add dependencies for 
>>> the interfaces that we implement (gd.fileInfo.impls) and any static 
>>> dependencies (gd.fileInfo.staticDeps) but we don't add the actual 
>>> dependencies that were calculated (gd.deps or gd.fileInfo.deps - both of 
>>> these contain the Endian definition).
>>> 
>>> So I can fix my project by updating the compiler to do:
>>>    if (gd.fileInfo.deps != null)
>>>          deps.addAll(gd.fileInfo.deps); and then it works: the 
>>> generated line though is:
>>> goog.addDependency('../../../org/apache/royale/utils/BinaryData.js',
>>> ['org.apache.royale.utils.BinaryData'], ['goog.DEBUG', 
>>> 'org.apache.royale.utils.Endian', 
>>> 'org.apache.royale.utils.IBinaryDataInput',
>>> 'org.apache.royale.utils.IBinaryDataOutput']);
>>> 
>>> 
>>> So my questions:
>>> 
>>> 1.  where is the fault here? Am I right in thinking that there's a 
>>> missing set of dependencies that need to also be added per the above 
>>> snippet, or should the Endian definition be listed as a dependency in the 
>>> gd.fileInfo.staticDeps list (which is null for me)  2.  presumably we don't 
>>> want "goog.DEBUG" to end up in the dependency list: is there a sensible way 
>>> of getting rid of this (or should we just manually filter out anything 
>>> starting "goog.")?
>>> 3.  if we should be adding these dependencies separately, is there a 
>>> preference for "gd.deps" vs "gd.fileInfo.deps"?
>>> 
>>> thanks
>>> 
>>> Andrew
>>> 
>>> 
>> 
> 

Reply via email to