diff options
author | Adrian Thurston <thurston@complang.org> | 2015-02-13 22:59:44 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-02-13 22:59:44 -0500 |
commit | 3151be71170cd2ac01567d6277ccf5019a647bc9 (patch) | |
tree | a980223982b2fff85c6ae2d177cf11404270ce6e | |
parent | 774ace89051bddee3197870aa0a90afde00bd1ad (diff) | |
download | colm-3151be71170cd2ac01567d6277ccf5019a647bc9.tar.gz |
implemented vmap find
-rw-r--r-- | src/bytecode.c | 25 | ||||
-rw-r--r-- | src/declare.cc | 2 | ||||
-rw-r--r-- | src/map.c | 15 | ||||
-rw-r--r-- | src/map.h | 3 |
4 files changed, 36 insertions, 9 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index d5fa8469..38f5a04e 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -2072,7 +2072,7 @@ again: debug( prg, REALM_BYTECODE, "IN_LIST_ITER_ADVANCE\n" ); - TreeIter *iter = (TreeIter*) vm_plocal(field); + ListIter *iter = (ListIter*) vm_plocal(field); Tree *res = colm_list_iter_advance( prg, &sp, iter ); //treeUpref( res ); vm_push( res ); @@ -2084,7 +2084,7 @@ again: debug( prg, REALM_BYTECODE, "IN_MAP_ITER_ADVANCE\n" ); - TreeIter *iter = (TreeIter*) vm_plocal(field); + ListIter *iter = (ListIter*) vm_plocal(field); Tree *res = colm_map_iter_advance( prg, &sp, iter ); //treeUpref( res ); vm_push( res ); @@ -2096,7 +2096,7 @@ again: debug( prg, REALM_BYTECODE, "IN_GEN_ITER_GET_CUR_R\n" ); - TreeIter *iter = (TreeIter*) vm_plocal(field); + ListIter *iter = (ListIter*) vm_plocal(field); Tree *tree = colm_list_iter_deref_cur( prg, iter ); //treeUpref( tree ); vm_push( tree ); @@ -3759,7 +3759,7 @@ again: MapEl *mapEl = colm_map_find( prg, map, key ); struct colm_struct *strct = mapEl != 0 ? - colm_generic_el_container( prg, mapEl, genId ) : 0; + colm_generic_el_container( prg, mapEl, genId ) : 0; vm_push_struct( strct ); break; @@ -3904,7 +3904,7 @@ again: debug( prg, REALM_BYTECODE, "IN_VMAP_REMOVE_WC %hd\n", genId ); Map *map = vm_pop_map(); - Struct *key = vm_pop_struct(); + Tree *key = vm_pop(); colm_vmap_remove( prg, map, key ); @@ -3912,6 +3912,21 @@ again: vm_push( prg->trueVal ); break; } + case IN_VMAP_FIND: { + short genId; + read_half( genId ); + + debug( prg, REALM_BYTECODE, "IN_VMAP_FIND %hd\n", genId ); + + Map *map = vm_pop_map(); + Tree *key = vm_pop(); + + Tree *result = colm_vmap_find( prg, map, key ); + + treeUpref( result ); + vm_push( result ); + break; + } default: { fatal( "UNKNOWN FUNCTION: 0x%2x -- something is wrong\n", c ); break; diff --git a/src/declare.cc b/src/declare.cc index 2b396dbe..386a0638 100644 --- a/src/declare.cc +++ b/src/declare.cc @@ -1046,7 +1046,7 @@ void Compiler::initMapFunctions( GenericType *gen ) void Compiler::initValueMapFunctions( GenericType *gen ) { - initFunction( gen->utArg, gen->objDef, "find", + initFunction( gen->valueUT, gen->objDef, "find", IN_VMAP_FIND, IN_VMAP_FIND, gen->keyUT, true, true, gen ); initFunction( uniqueTypeInt, gen->objDef, "insert", @@ -663,19 +663,30 @@ MapEl *colm_vmap_insert( Program *prg, Map *map, Struct *key, Struct *value ) colm_map_insert( prg, map, mapEl ); } -MapEl *colm_vmap_remove( Program *prg, Map *map, Struct *key ) +MapEl *colm_vmap_remove( Program *prg, Map *map, Tree *key ) { MapEl *mapEl = colm_map_find( prg, map, key ); if ( mapEl != 0 ) colm_map_detach( prg, map, mapEl ); } +Tree *colm_vmap_find( Program *prg, Map *map, Tree *key ) +{ + MapEl *mapEl = colm_map_find( prg, map, key ); + if ( mapEl != 0 ) { + Struct *s = colm_generic_el_container( prg, mapEl, map->genericInfo - prg->rtd->genericInfo ); + Tree *val = colm_struct_get_field( s, Tree*, 0 ); + treeUpref( val ); + return val; + } + return 0; +} + void colm_map_detach( Program *prg, Map *map, MapEl *mapEl ) { mapDetach( prg, map, mapEl ); } - MapEl *colm_map_find( Program *prg, Map *map, Tree *key ) { return mapImplFind( prg, map, key ); @@ -69,7 +69,8 @@ void colm_map_detach( Program *prg, Map *map, MapEl *mapEl ); MapEl *colm_map_find( Program *prg, Map *map, Tree *key ); MapEl *colm_vmap_insert( Program *prg, Map *map, Struct *key, Struct *value ); -MapEl *colm_vmap_remove( Program *prg, Map *map, Struct *key ); +MapEl *colm_vmap_remove( Program *prg, Map *map, Tree *key ); +Tree *colm_map_iter_advance( Program *prg, Tree ***psp, ListIter *iter ); #if defined(__cplusplus) } |