@@ -623,9 +623,12 @@ export class Compiler extends DiagnosticEmitter {
623
623
break ;
624
624
}
625
625
case ElementKind . FIELD : {
626
- this . makeExportedFieldGetter ( prefix + GETTER_PREFIX + name , < Field > element ) ;
627
- if ( ! element . is ( CommonFlags . READONLY ) ) {
628
- this . makeExportedFieldSetter ( prefix + SETTER_PREFIX + name , < Field > element ) ;
626
+ if ( element . is ( CommonFlags . COMPILED ) ) {
627
+ let module = this . module ;
628
+ module . addFunctionExport ( ( < Field > element ) . internalGetterName , prefix + GETTER_PREFIX + name ) ;
629
+ if ( ! element . is ( CommonFlags . READONLY ) ) {
630
+ module . addFunctionExport ( ( < Field > element ) . internalSetterName , prefix + SETTER_PREFIX + name ) ;
631
+ }
629
632
}
630
633
break ;
631
634
}
@@ -674,48 +677,6 @@ export class Compiler extends DiagnosticEmitter {
674
677
}
675
678
}
676
679
677
- /** Makes an exported function to get the value of an instance field. */
678
- private makeExportedFieldGetter ( name : string , field : Field ) : void {
679
- var type = field . type ;
680
- var nativeThisType = this . options . nativeSizeType ;
681
- var nativeValueType = type . toNativeType ( ) ;
682
- var module = this . module ;
683
- var returnExpr = module . load ( type . byteSize , type . is ( TypeFlags . SIGNED ) ,
684
- module . local_get ( 0 , nativeThisType ) ,
685
- nativeValueType , field . memoryOffset
686
- ) ;
687
- // functions retain the return value for the caller
688
- if ( type . isManaged ) returnExpr = this . makeRetain ( returnExpr ) ;
689
- module . addFunction ( name , nativeThisType , nativeValueType , null , returnExpr ) ;
690
- module . addFunctionExport ( name , name ) ;
691
- }
692
-
693
- /** Makes an exported function to set the value of an instance field. */
694
- private makeExportedFieldSetter ( name : string , field : Field ) : void {
695
- var type = field . type ;
696
- var nativeThisType = this . options . nativeSizeType ;
697
- var nativeValueType = type . toNativeType ( ) ;
698
- var module = this . module ;
699
- var valueExpr = module . local_get ( 1 , nativeValueType ) ;
700
- if ( type . isManaged ) {
701
- valueExpr = this . makeReplace (
702
- module . load ( type . byteSize , false ,
703
- module . local_get ( 0 , nativeThisType ) ,
704
- nativeValueType , field . memoryOffset
705
- ) ,
706
- valueExpr
707
- ) ;
708
- }
709
- module . addFunction ( name , createType ( [ nativeThisType , nativeValueType ] ) , NativeType . None , null ,
710
- module . store ( type . byteSize ,
711
- module . local_get ( 0 , nativeThisType ) ,
712
- valueExpr ,
713
- nativeValueType , field . memoryOffset
714
- )
715
- ) ;
716
- module . addFunctionExport ( name , name ) ;
717
- }
718
-
719
680
// === Elements =================================================================================
720
681
721
682
/** Compiles any element. */
@@ -1423,15 +1384,12 @@ export class Compiler extends DiagnosticEmitter {
1423
1384
}
1424
1385
break ;
1425
1386
}
1426
- case ElementKind . FIELD_PROTOTYPE : {
1427
- element . set ( CommonFlags . COMPILED ) ;
1387
+ case ElementKind . FIELD : {
1388
+ this . compileField ( < Field > element ) ;
1428
1389
break ;
1429
1390
}
1430
1391
case ElementKind . PROPERTY : {
1431
- let getterInstance = ( < Property > element ) . getterInstance ;
1432
- if ( getterInstance ) this . compileFunction ( getterInstance ) ;
1433
- let setterInstance = ( < Property > element ) . setterInstance ;
1434
- if ( setterInstance ) this . compileFunction ( setterInstance ) ;
1392
+ this . compileProperty ( < Property > element ) ;
1435
1393
break ;
1436
1394
}
1437
1395
}
@@ -1440,6 +1398,56 @@ export class Compiler extends DiagnosticEmitter {
1440
1398
return true ;
1441
1399
}
1442
1400
1401
+ /** Compiles an instance field to a getter and a setter. */
1402
+ compileField ( instance : Field ) : bool {
1403
+ if ( instance . is ( CommonFlags . COMPILED ) ) return true ;
1404
+ instance . set ( CommonFlags . COMPILED ) ;
1405
+ var type = instance . type ;
1406
+ var nativeThisType = this . options . nativeSizeType ;
1407
+ var nativeValueType = type . toNativeType ( ) ;
1408
+ var module = this . module ;
1409
+
1410
+ // Make a getter
1411
+ var returnExpr = module . load ( type . byteSize , type . is ( TypeFlags . SIGNED ) ,
1412
+ module . local_get ( 0 , nativeThisType ) ,
1413
+ nativeValueType , instance . memoryOffset
1414
+ ) ;
1415
+ if ( type . isManaged ) returnExpr = this . makeRetain ( returnExpr ) ;
1416
+ module . addFunction ( instance . internalGetterName , nativeThisType , nativeValueType , null , returnExpr ) ;
1417
+
1418
+ // Make a setter
1419
+ var valueExpr = module . local_get ( 1 , nativeValueType ) ;
1420
+ if ( type . isManaged ) {
1421
+ valueExpr = this . makeReplace (
1422
+ module . load ( type . byteSize , false ,
1423
+ module . local_get ( 0 , nativeThisType ) ,
1424
+ nativeValueType , instance . memoryOffset
1425
+ ) ,
1426
+ valueExpr
1427
+ ) ;
1428
+ }
1429
+ module . addFunction ( instance . internalSetterName , createType ( [ nativeThisType , nativeValueType ] ) , NativeType . None , null ,
1430
+ module . store ( type . byteSize ,
1431
+ module . local_get ( 0 , nativeThisType ) ,
1432
+ valueExpr ,
1433
+ nativeValueType , instance . memoryOffset
1434
+ )
1435
+ ) ;
1436
+
1437
+ return true ;
1438
+ }
1439
+
1440
+ /** Compiles a property to a getter and potentially a setter. */
1441
+ compileProperty ( instance : Property ) : bool {
1442
+ if ( instance . is ( CommonFlags . COMPILED ) ) return true ;
1443
+ instance . set ( CommonFlags . COMPILED ) ;
1444
+ var getterInstance = instance . getterInstance ;
1445
+ if ( getterInstance ) this . compileFunction ( getterInstance ) ;
1446
+ var setterInstance = instance . setterInstance ;
1447
+ if ( setterInstance ) this . compileFunction ( setterInstance ) ;
1448
+ return true ;
1449
+ }
1450
+
1443
1451
// === Memory ===================================================================================
1444
1452
1445
1453
/** Adds a static memory segment with the specified data. */
0 commit comments