summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bytecode.c25
-rw-r--r--src/declare.cc2
-rw-r--r--src/map.c15
-rw-r--r--src/map.h3
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",
diff --git a/src/map.c b/src/map.c
index c69ba208..d6b24e8f 100644
--- a/src/map.c
+++ b/src/map.c
@@ -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 );
diff --git a/src/map.h b/src/map.h
index 5599dc1d..6c7cce66 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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)
}