@@ -333,6 +333,22 @@ LookupMemberSymbol(AST *expr, AST *objtype, const char *name, Module **Ptr, int
333
333
return sym ;
334
334
}
335
335
336
+ /*
337
+ * get a namespace symbol table, or NULL if the
338
+ * name is not a namespace
339
+ */
340
+ SymbolTable *
341
+ LookupNamespace (AST * expr )
342
+ {
343
+ Symbol * sym ;
344
+ if (!IsIdentifier (expr ))
345
+ return NULL ;
346
+ sym = LookupSymbol (GetUserIdentifierName (expr ));
347
+ if (!sym || sym -> kind != SYM_NAMESPACE )
348
+ return NULL ;
349
+ return (SymbolTable * )sym -> v .ptr ;
350
+ }
351
+
336
352
/*
337
353
* look up a symbol from a method reference
338
354
* "expr" is the pointer to the method ref
@@ -347,6 +363,12 @@ LookupMethodRef(AST *expr, Module **Ptr, int *valid)
347
363
const char * name ;
348
364
349
365
name = GetUserIdentifierName (ident );
366
+ if (!type ) {
367
+ SymbolTable * nametable = LookupNamespace (expr -> left );
368
+ if (nametable ) {
369
+ return LookupSymbolInTable (nametable , name );
370
+ }
371
+ }
350
372
return LookupMemberSymbol (expr , type , name , Ptr , valid );
351
373
352
374
}
@@ -1803,22 +1825,35 @@ EvalExpr(AST *expr, unsigned flags, int *valid, int depth)
1803
1825
case AST_CONSTREF :
1804
1826
case AST_METHODREF :
1805
1827
{
1806
- Module * P ;
1828
+ Module * P = current ;
1807
1829
1808
1830
sym = LookupMethodRef (expr , & P , valid );
1809
1831
if (!sym ) {
1810
1832
return intExpr (0 );
1811
1833
}
1812
- #if 0
1813
- if ((sym -> kind != SYM_CONSTANT && sym -> kind != SYM_FLOAT_CONSTANT )) {
1814
- if (valid ) {
1815
- * valid = 0 ;
1816
- } else {
1817
- ERROR (expr , "%s is not a constant of %s" , GetIdentifierName (expr -> right ), P -> classname );
1834
+ switch (sym -> kind ) {
1835
+ case SYM_LABEL :
1836
+ /* got a label in a namespace */
1837
+ if (flags & PASM_FLAG ) {
1838
+ Label * lref = (Label * )sym -> v .ptr ;
1839
+ if (lref -> flags & LABEL_IN_HUB ) {
1840
+ return intExpr (lref -> hubval );
1841
+ }
1842
+ if (lref -> cogval & 0x03 ) {
1843
+ if (reportError ) {
1844
+ ERROR (expr , "label %s in COG memory not on longword boundary" , sym -> user_name );
1845
+ } else {
1846
+ * valid = 0 ;
1847
+ }
1848
+ return intExpr (0 );
1849
+ }
1850
+ return intExpr (lref -> cogval >> 2 );
1818
1851
}
1819
- return intExpr (0 );
1852
+ break ;
1853
+ default :
1854
+ break ;
1820
1855
}
1821
- #endif
1856
+
1822
1857
/* while we're evaluating, use the object context */
1823
1858
ret = EvalExprInState (P , expr -> right , flags , valid , depth + 1 );
1824
1859
return ret ;
0 commit comments