@@ -510,22 +510,45 @@ private static void SortMetaData(LuaTableExpression metaData) {
510510 }
511511 }
512512
513- private void CheckMetadataMoreThanUpvalues ( ) {
513+ private static IEnumerable < LuaTableExpression > GetMetatables ( LuaTableExpression metaMethods ) {
514+ return metaMethods . Items . OfType < LuaSingleTableItemSyntax > ( ) . Select ( i => ( LuaTableExpression ) i . Expression ) ;
515+ }
516+
517+ private void CheckMetatableMoreThanUpvalues ( LuaTableExpression table , int nameIndex , ref int upvalueCount ) {
514518 const int kMaxUpvalueCount = kUpvaluesMaxCount - 2 ;
515- const int kNameIndex = 2 ;
519+ var expression = table . GetSingleExpression ( nameIndex ) ;
520+ if ( expression is LuaIdentifierNameSyntax name ) {
521+ if ( upvalueCount >= kMaxUpvalueCount ) {
522+ CheckTooManyVariables ( false ) ;
523+ var left = new LuaMemberAccessExpressionSyntax ( LuaIdentifierNameSyntax . MorenManyLocalVarTempTable , name ) ;
524+ methodList_ . Statements . Add ( new LuaAssignmentExpressionSyntax ( left , name ) ) ;
525+ table . Items [ nameIndex ] = new LuaSingleTableItemSyntax ( left ) ;
526+ } else {
527+ ++ upvalueCount ;
528+ }
529+ }
530+ }
531+
532+ private void CheckMetadataMoreThanUpvalues ( ) {
533+ int upvalueCount = 0 ;
516534 if ( metaMethods_ != null ) {
517- int upvalueCount = 0 ;
518- foreach ( LuaSingleTableItemSyntax item in metaMethods_ . Items ) {
519- var table = ( LuaTableExpression ) item . Expression ;
520- var expression = ( LuaSingleTableItemSyntax ) table . Items [ kNameIndex ] ;
521- if ( expression . Expression is LuaIdentifierNameSyntax name ) {
522- if ( upvalueCount >= kMaxUpvalueCount ) {
523- CheckTooManyVariables ( false ) ;
524- var left = new LuaMemberAccessExpressionSyntax ( LuaIdentifierNameSyntax . MorenManyLocalVarTempTable , name ) ;
525- methodList_ . Statements . Add ( new LuaAssignmentExpressionSyntax ( left , name ) ) ;
526- table . Items [ kNameIndex ] = new LuaSingleTableItemSyntax ( left ) ;
527- } else {
528- ++ upvalueCount ;
535+ const int kNameIndex = 2 ;
536+ foreach ( var table in GetMetatables ( metaMethods_ ) ) {
537+ CheckMetatableMoreThanUpvalues ( table , kNameIndex , ref upvalueCount ) ;
538+ }
539+ }
540+ if ( metaProperties_ != null ) {
541+ const int kFlagIndex = 1 ;
542+ const int kGetIndex = 3 ;
543+ const int kSetIndex = 4 ;
544+ foreach ( var table in GetMetatables ( metaProperties_ ) ) {
545+ var flagIdentifierName = ( LuaIdentifierNameSyntax ) table . GetSingleExpression ( kFlagIndex ) ;
546+ int flag = Convert . ToInt32 ( flagIdentifierName . ValueText , 16 ) ;
547+ var kind = ( PropertyMethodKind ) ( ( flag >> 8 ) & 0xff ) ;
548+ if ( kind != PropertyMethodKind . Field ) {
549+ CheckMetatableMoreThanUpvalues ( table , kGetIndex , ref upvalueCount ) ;
550+ if ( kind == PropertyMethodKind . Both ) {
551+ CheckMetatableMoreThanUpvalues ( table , kSetIndex , ref upvalueCount ) ;
529552 }
530553 }
531554 }
0 commit comments