Here’s a fun one: var MinMax:Struct = new Struct({ minCoord: new Pointer(r.uint16, BaseCoord), // May be NULL maxCoord: new Pointer(r.uint16, BaseCoord), // May be NULL featMinMaxCount: r.uint16, // May be 0 featMinMaxRecords: new ArrayStruct(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order });
This struct is then used in another and so on: var BaseLangSysRecord:Struct = new Struct({ tag: new StringStruct(4), // 4-byte language system identification tag minMax: new Pointer(r.uint16, MinMax, {type: 'parent'}) }); I believe one of the primary features of these classes is that they support lazy initialization and the structures can be evaluated as needed. Harbs > On May 2, 2018, at 6:36 PM, Alex Harui <aha...@adobe.com.INVALID> wrote: > > What do some of the actual structs look like? The Restructure > library/language looks like an attempt to strongly-type data structures. > I've been told that type-inferencing is a key part to performance in JS in > the browser. But as we look into the future at other output types, > statically knowing types looks like it will be really important. > > Having a way to output bracket notation might be a bunch of work, and you > might be surprised by the results. Every time you use an Array, the accessor > is returning an Object, not whatever type you know is in there. > > HTH, > -Alex > > On 5/2/18, 12:29 AM, "Harbs" <harbs.li...@gmail.com> wrote: > > Nope. They are data structures that are constructed from binary data. They > are also generally lazily initialized (which makes a huge difference in > performance and memory footprint). Basically, there are tens of tables which > might, or might not exist in any given font. The tables might or might not > have different pieces of information to describe features and functionality. > > It took my a couple of weeks just to wrap my head around all this stuff… > ;-) > > It’s using this set of classes (also migrated to AS3): > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdevongovett%2Frestructure&data=02%7C01%7Caharui%40adobe.com%7C0dba99c3f32b410a1fd608d5affe6efd%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636608429687243487&sdata=%2Bn6rP8sRodUlqLqLlcia%2FWwQMAvBYpYDmlU%2BNE4YGDk%3D&reserved=0 > > <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdevongovett%2Frestructure&data=02%7C01%7Caharui%40adobe.com%7C0dba99c3f32b410a1fd608d5affe6efd%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636608429687243487&sdata=%2Bn6rP8sRodUlqLqLlcia%2FWwQMAvBYpYDmlU%2BNE4YGDk%3D&reserved=0> > > There are 148 instances of Struct alone. Almost every one has a different > set of variables. That does not even include VersionedStruct, Array structs, > Number structs, LazyArray, etc. > > Maybe there’s a way to infer types, but I don’t see how. Many of the > variables can have different types depending on the context too. (Sometimes > they can even be functions.) > > Harbs > >> On May 2, 2018, at 10:16 AM, Alex Harui <aha...@adobe.com.INVALID> wrote: >> >> Are the objects JSON objects? We have a utility that tries to convert JSON >> to AS3 ValueObjects by guessing the data types. >> >> If the objects are externally instantiated, then you only really need >> typedefs and can avoid the memory overhead of the definitions. >> >> -Alex >> >> On 5/1/18, 11:40 PM, "Harbs" <harbs.li...@gmail.com> wrote: >> >> Well, with font parsing there are SOOO MANY different data structures that >> it’s almost impossible to avoid using Object. Even if it was possible (which >> I’m not sure of), it’ll probably take me weeks or months and countless >> classes (with all the memory penalties of doing so) to cover all the types. >> >> I’m going to try and add a compiler option to output bracket notation for >> Object types to deal with the renaming issue of using Objects. >> >> Harbs >> >>> On May 2, 2018, at 9:36 AM, Alex Harui <aha...@adobe.com.INVALID> wrote: >>> >>> Hmm. That's what you get for using Object __ >>> >>> The code expects the expression for the initial value to resolve to a >>> definition (so we know if we need to coerce it), but once you switch to >>> Object, it won't resolve. In this case,we don't know the type of >>> "offsets". The quick fix is to just accept that it might not resolve and >>> just let the browser deal with it. However, we don't know what the Google >>> Closure optimizer will do with the "offsets" property. It may or may not >>> rename it. I keep thinking we should be warning when folks use Object. In >>> Royale you are asking for optimizer trouble if you are not completely >>> strongly-typed. >>> >>> Thoughts? >>> -Alex >>> >>> On 5/1/18, 11:19 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>> >>> FYI, I just tried reverting some changes, and it seems that not all the >>> errors were due to void 0: >>> This code: >>> var glyfPos:int = >>> this._font.getTable('loca').offsets[this.id]; >>> var nextPos:int = >>> this._font.getTable('loca').offsets[this.id + 1]; >>> >>> Causes this error: >>> >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.jx.VarDeclarationEmitter.emit(VarDeclarationEmitter.java:153) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter.emitVarDeclaration(JSRoyaleEmitter.java:699) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitVariable(ASBlockWalker.java:278) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeSwitch.handle(ASNodeSwitch.java:162) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeHandler.handle(ASNodeHandler.java:85) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.BeforeAfterStrategy.handle(BeforeAfterStrategy.java:110) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.walk(ASBlockWalker.java:159) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.jx.StatementEmitter.emit(StatementEmitter.java:40) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.jx.StatementEmitter.emit(StatementEmitter.java:29) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.JSEmitter.emitStatement(JSEmitter.java:323) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter.emitStatement(JSRoyaleEmitter.java:987) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitBlock(ASBlockWalker.java:349) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeSwitch.handle(ASNodeSwitch.java:278) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeHandler.handle(ASNodeHandler.java:85) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.BeforeAfterStrategy.handle(BeforeAfterStrategy.java:110) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.walk(ASBlockWalker.java:159) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASEmitter.emitMethodScope(ASEmitter.java:867) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.jx.MethodEmitter.emit(MethodEmitter.java:145) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter.emitMethod(JSRoyaleEmitter.java:723) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.jx.ClassEmitter.emit(ClassEmitter.java:176) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter.emitClass(JSRoyaleEmitter.java:681) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitClass(ASBlockWalker.java:256) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeSwitch.handle(ASNodeSwitch.java:136) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeHandler.handle(ASNodeHandler.java:85) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.BeforeAfterStrategy.handle(BeforeAfterStrategy.java:110) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.walk(ASBlockWalker.java:159) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitter.emitPackageContents(JSGoogEmitter.java:182) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitPackage(ASBlockWalker.java:244) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeSwitch.handle(ASNodeSwitch.java:132) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeHandler.handle(ASNodeHandler.java:85) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.BeforeAfterStrategy.handle(BeforeAfterStrategy.java:110) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.walk(ASBlockWalker.java:159) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitFile(ASBlockWalker.java:223) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeSwitch.handle(ASNodeSwitch.java:128) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.ASNodeHandler.handle(ASNodeHandler.java:85) >>> [java] at >>> org.apache.royale.compiler.internal.visitor.as.BeforeAfterStrategy.handle(BeforeAfterStrategy.java:110) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.walk(ASBlockWalker.java:159) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.as.ASBlockWalker.visitCompilationUnit(ASBlockWalker.java:188) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.JSWriter.writeTo(JSWriter.java:98) >>> [java] at >>> org.apache.royale.compiler.internal.codegen.js.JSWriter.writeTo(JSWriter.java:82) >>> [java] at >>> org.apache.royale.compiler.clients.COMPJSCRoyale.compile(COMPJSCRoyale.java:308) >>> [java] at >>> org.apache.royale.compiler.clients.MXMLJSCRoyale._mainNoExit(MXMLJSCRoyale.java:240) >>> [java] at >>> org.apache.royale.compiler.clients.MXMLJSCRoyale.mainNoExit(MXMLJSCRoyale.java:197) >>> [java] at >>> org.apache.royale.compiler.clients.COMPJSC._mainNoExit(COMPJSC.java:210) >>> [java] at >>> org.apache.royale.compiler.clients.COMPJSC.mainNoExit(COMPJSC.java:140) >>> [java] at >>> org.apache.royale.compiler.clients.COMPJSC.staticMainNoExit(COMPJSC.java:125) >>> [java] at >>> org.apache.royale.compiler.clients.COMPJSC.main(COMPJSC.java:108) >>> >>> this._font is typed to a class instance >>> getTable() returns an Object type. >>> >>> Changing the code to the following makes the error go away: >>> >>> var glyfPos:int = >>> (this._font.getTable('loca').offsets[this.id] as int); >>> var nextPos:int = >>> (this._font.getTable('loca').offsets[this.id + 1] as int); >>> >>> Harbs >>> >>>> On May 1, 2018, at 7:35 PM, Harbs <harbs.li...@gmail.com> wrote: >>>> >>>> I just finished resolving all my errors. It was hard to trace them down, >>>> but I just discovered that there were uses of "void 0" in the code. I >>>> replaced all those cases with “undefined" and poof! All my errors went >>>> away! :-) >>> >>> >>> >> >> >> > > >