@@ -80,11 +80,10 @@ import {
8080import {
8181 ElementKind ,
8282 FunctionPrototype ,
83- Field ,
8483 Global ,
8584 DecoratorFlags ,
86- ClassPrototype ,
87- Class
85+ Class ,
86+ PropertyPrototype
8887} from "./program" ;
8988
9089import {
@@ -1075,11 +1074,12 @@ function builtin_offsetof(ctx: BuiltinContext): ExpressionRef {
10751074 return module . unreachable ( ) ;
10761075 }
10771076 let fieldName = ( < StringLiteralExpression > firstOperand ) . value ;
1078- let classMembers = classReference . members ;
1079- if ( classMembers && classMembers . has ( fieldName ) ) {
1080- let member = assert ( classMembers . get ( fieldName ) ) ;
1081- if ( member . kind == ElementKind . Field ) {
1082- return contextualUsize ( compiler , i64_new ( ( < Field > member ) . memoryOffset ) , contextualType ) ;
1077+ let fieldMember = classReference . getMember ( fieldName ) ;
1078+ if ( fieldMember && fieldMember . kind == ElementKind . PropertyPrototype ) {
1079+ let property = ( < PropertyPrototype > fieldMember ) . instance ;
1080+ if ( property && property . isField ) {
1081+ assert ( property . memoryOffset >= 0 ) ;
1082+ return contextualUsize ( compiler , i64_new ( property . memoryOffset ) , contextualType ) ;
10831083 }
10841084 }
10851085 compiler . error (
@@ -10261,32 +10261,31 @@ function ensureVisitMembersOf(compiler: Compiler, instance: Class): void {
1026110261 // TODO: for (let member of members.values()) {
1026210262 for ( let _values = Map_values ( members ) , j = 0 , l = _values . length ; j < l ; ++ j ) {
1026310263 let member = unchecked ( _values [ j ] ) ;
10264- if ( member . kind == ElementKind . Field ) {
10265- if ( ( < Field > member ) . parent == instance ) {
10266- let fieldType = ( < Field > member ) . type ;
10267- if ( fieldType . isManaged ) {
10268- let fieldOffset = ( < Field > member ) . memoryOffset ;
10269- assert ( fieldOffset >= 0 ) ;
10270- needsTempValue = true ;
10271- body . push (
10272- // if ($2 = value) __visit($2, $1)
10273- module . if (
10274- module . local_tee ( 2 ,
10275- module . load ( sizeTypeSize , false ,
10276- module . local_get ( 0 , sizeTypeRef ) ,
10277- sizeTypeRef , fieldOffset
10278- ) ,
10279- false // internal
10280- ) ,
10281- module . call ( visitInstance . internalName , [
10282- module . local_get ( 2 , sizeTypeRef ) , // value
10283- module . local_get ( 1 , TypeRef . I32 ) // cookie
10284- ] , TypeRef . None )
10285- )
10286- ) ;
10287- }
10288- }
10289- }
10264+ if ( member . kind != ElementKind . PropertyPrototype ) continue ;
10265+ // Class should have resolved fields during finalization
10266+ let property = ( < PropertyPrototype > member ) . instance ;
10267+ if ( ! property ) continue ;
10268+ let fieldType = property . type ;
10269+ if ( ! property . isField || property . getBoundClassOrInterface ( ) != instance || ! fieldType . isManaged ) continue ;
10270+ let fieldOffset = property . memoryOffset ;
10271+ assert ( fieldOffset >= 0 ) ;
10272+ needsTempValue = true ;
10273+ body . push (
10274+ // if ($2 = value) __visit($2, $1)
10275+ module . if (
10276+ module . local_tee ( 2 ,
10277+ module . load ( sizeTypeSize , false ,
10278+ module . local_get ( 0 , sizeTypeRef ) ,
10279+ sizeTypeRef , fieldOffset
10280+ ) ,
10281+ false // internal
10282+ ) ,
10283+ module . call ( visitInstance . internalName , [
10284+ module . local_get ( 2 , sizeTypeRef ) , // value
10285+ module . local_get ( 1 , TypeRef . I32 ) // cookie
10286+ ] , TypeRef . None )
10287+ )
10288+ ) ;
1029010289 }
1029110290 }
1029210291 }
@@ -10458,66 +10457,6 @@ export function compileRTTI(compiler: Compiler): void {
1045810457 }
1045910458}
1046010459
10461- /** Compiles a class-specific instanceof helper, checking a ref against all concrete instances. */
10462- export function compileClassInstanceOf ( compiler : Compiler , prototype : ClassPrototype ) : void {
10463- let module = compiler . module ;
10464- let sizeTypeRef = compiler . options . sizeTypeRef ;
10465- let instanceofInstance = assert ( prototype . program . instanceofInstance ) ;
10466- compiler . compileFunction ( instanceofInstance ) ;
10467-
10468- let stmts = new Array < ExpressionRef > ( ) ;
10469-
10470- // if (!ref) return false
10471- stmts . push (
10472- module . if (
10473- module . unary (
10474- sizeTypeRef == TypeRef . I64
10475- ? UnaryOp . EqzI64
10476- : UnaryOp . EqzI32 ,
10477- module . local_get ( 0 , sizeTypeRef )
10478- ) ,
10479- module . return (
10480- module . i32 ( 0 )
10481- )
10482- )
10483- ) ;
10484-
10485- // if (__instanceof(ref, ID[i])) return true
10486- let instances = prototype . instances ;
10487- if ( instances && instances . size > 0 ) {
10488- // TODO: for (let instance of instances.values()) {
10489- for ( let _values = Map_values ( instances ) , i = 0 , k = _values . length ; i < k ; ++ i ) {
10490- let instance = unchecked ( _values [ i ] ) ;
10491- stmts . push (
10492- module . if (
10493- module . call ( instanceofInstance . internalName , [
10494- module . local_get ( 0 , sizeTypeRef ) ,
10495- module . i32 ( instance . id )
10496- ] , TypeRef . I32 ) ,
10497- module . return (
10498- module . i32 ( 1 )
10499- )
10500- )
10501- ) ;
10502- }
10503- }
10504-
10505- // return false
10506- stmts . push (
10507- module . return (
10508- module . i32 ( 0 )
10509- )
10510- ) ;
10511-
10512- module . addFunction (
10513- `${ prototype . internalName } ~instanceof` ,
10514- sizeTypeRef ,
10515- TypeRef . I32 ,
10516- null ,
10517- module . flatten ( stmts )
10518- ) ;
10519- }
10520-
1052110460// Helpers
1052210461
1052310462let checkConstantType_expr : ExpressionRef = 0 ;
0 commit comments