@@ -80,11 +80,10 @@ import {
80
80
import {
81
81
ElementKind ,
82
82
FunctionPrototype ,
83
- Field ,
84
83
Global ,
85
84
DecoratorFlags ,
86
- ClassPrototype ,
87
- Class
85
+ Class ,
86
+ PropertyPrototype
88
87
} from "./program" ;
89
88
90
89
import {
@@ -1075,11 +1074,12 @@ function builtin_offsetof(ctx: BuiltinContext): ExpressionRef {
1075
1074
return module . unreachable ( ) ;
1076
1075
}
1077
1076
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 ) ;
1083
1083
}
1084
1084
}
1085
1085
compiler . error (
@@ -10261,32 +10261,31 @@ function ensureVisitMembersOf(compiler: Compiler, instance: Class): void {
10261
10261
// TODO: for (let member of members.values()) {
10262
10262
for ( let _values = Map_values ( members ) , j = 0 , l = _values . length ; j < l ; ++ j ) {
10263
10263
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
+ ) ;
10290
10289
}
10291
10290
}
10292
10291
}
@@ -10458,66 +10457,6 @@ export function compileRTTI(compiler: Compiler): void {
10458
10457
}
10459
10458
}
10460
10459
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
-
10521
10460
// Helpers
10522
10461
10523
10462
let checkConstantType_expr : ExpressionRef = 0 ;
0 commit comments