summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-06-05 11:40:51 -0400
committerAdrian Thurston <thurston@complang.org>2015-06-05 11:40:51 -0400
commitb550332997a2cca6e670452af4f145a8381f45e3 (patch)
tree48148173ebc06f0212da19c09d3627b0c91c0e0d
parentdb0fd98a4f646abef622684d4228d879a933cbce (diff)
downloadcolm-b550332997a2cca6e670452af4f145a8381f45e3.tar.gz
more vmap implementation
-rw-r--r--src/bytecode.c69
-rw-r--r--src/bytecode.h1
-rw-r--r--src/synthesis.cc30
-rw-r--r--test/lookup1.lm43
4 files changed, 98 insertions, 45 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 749a6f85..ff7389da 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -2054,7 +2054,7 @@ again:
short field;
read_half( field );
- debug( prg, REALM_BYTECODE, "IN_RE_LIST_ITER_ADVANCE\n" );
+ debug( prg, REALM_BYTECODE, "IN_REV_LIST_ITER_ADVANCE\n" );
generic_iter_t *iter = (generic_iter_t*) vm_get_plocal(exec, field);
tree_t *res = colm_rev_list_iter_advance( prg, &sp, iter );
@@ -4107,6 +4107,49 @@ again:
vm_push_tree( prg->true_val );
break;
}
+ case IN_VMAP_INSERT_WV: {
+ short gen_id;
+ read_half( gen_id );
+
+ debug( prg, REALM_BYTECODE, "IN_VMAP_INSERT_WV %hd\n", gen_id );
+
+ map_t *map = vm_pop_map();
+ struct_t *value = vm_pop_struct();
+ struct_t *key = vm_pop_struct();
+
+ colm_vmap_insert( prg, map, key, value );
+
+ //colm_tree_upref( prg->trueVal );
+ vm_push_tree( prg->true_val );
+
+ rcode_code( exec, IN_FN );
+ rcode_code( exec, IN_VMAP_INSERT_BKT );
+ rcode_half( exec, gen_id );
+ rcode_code( exec, 0 ); //inserted != 0 ? 1 : 0 );
+ rcode_word( exec, 0 ); //(word_t)map_el );
+ rcode_unit_term( exec );
+ break;
+ }
+ case IN_VMAP_INSERT_BKT: {
+ short gen_id;
+ uchar inserted;
+ word_t wmap_el;
+
+ read_half( gen_id );
+ read_byte( inserted );
+ read_word( wmap_el );
+
+ map_el_t *map_el = (map_el_t*)wmap_el;
+
+ debug( prg, REALM_BYTECODE, "IN_VMAP_INSERT_BKT %d\n",
+ (int)inserted );
+
+ map_t *map = vm_pop_map();
+
+ if ( inserted )
+ colm_map_detach( prg, map, map_el );
+ break;
+ }
case IN_VMAP_REMOVE_WC: {
short gen_id;
read_half( gen_id );
@@ -4370,7 +4413,7 @@ again:
goto out;
}
default: {
- fatal( "UNKNOWN FUNCTION: 0x%2x -- something is wrong\n", c );
+ fatal( "UNKNOWN FUNCTION: 0x%02x -- something is wrong\n", c );
break;
}}
break;
@@ -4388,7 +4431,7 @@ again:
break;
}
default: {
- fatal( "UNKNOWN INSTRUCTION: 0x%2x -- something is wrong\n", *(instr-1) );
+ fatal( "UNKNOWN INSTRUCTION: 0x%02x -- something is wrong\n", *(instr-1) );
assert(false);
break;
}
@@ -4630,6 +4673,22 @@ again:
(int)inserted );
break;
}
+ case IN_VMAP_INSERT_BKT: {
+ short gen_id;
+ uchar inserted;
+ word_t wmap_el;
+
+ read_half( gen_id );
+ read_byte( inserted );
+ read_word( wmap_el );
+
+ map_el_t *map_el = (map_el_t*)wmap_el;
+
+ debug( prg, REALM_BYTECODE, "IN_VMAP_INSERT_BKT %d\n",
+ (int)inserted );
+
+ break;
+ }
case IN_MAP_DETACH_BKT: {
tree_t *key, *val;
read_tree( key );
@@ -4667,13 +4726,13 @@ again:
}
default: {
- fatal( "UNKNOWN FN 0x%2x: -- reverse code downref\n", *(instr-1));
+ fatal( "UNKNOWN FUNCTION 0x%02x: -- reverse code downref\n", *(instr-1));
assert(false);
}}
break;
}
default: {
- fatal( "UNKNOWN INSTRUCTION 0x%2x: -- reverse code downref\n", *(instr-1));
+ fatal( "UNKNOWN INSTRUCTION 0x%02x: -- reverse code downref\n", *(instr-1));
assert(false);
break;
}
diff --git a/src/bytecode.h b/src/bytecode.h
index bddaed91..3cbdc1ec 100644
--- a/src/bytecode.h
+++ b/src/bytecode.h
@@ -402,6 +402,7 @@ typedef unsigned long colm_value_t;
#define IN_VMAP_FIND 0x29
#define IN_VMAP_INSERT_WC 0x25
#define IN_VMAP_INSERT_WV 0x26
+#define IN_VMAP_INSERT_BKT 0x3d
#define IN_VMAP_REMOVE_WC 0x27
#define IN_VMAP_REMOVE_WV 0x28
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 539cf5ed..402b9dd1 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -129,9 +129,9 @@ IterImpl::IterImpl( Type type ) :
inAdvance = IN_LIST_ITER_ADVANCE;
inGetCurR = IN_GEN_ITER_GET_CUR_R;
- inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
- inSetCurWC = //IN_HALT;
- inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
+// inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
+// inSetCurWC = //IN_HALT;
+// inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
useGenericId = true;
break;
@@ -143,9 +143,9 @@ IterImpl::IterImpl( Type type ) :
inAdvance = IN_LIST_ITER_ADVANCE;
inGetCurR = IN_GEN_VITER_GET_CUR_R;
- inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
- inSetCurWC = //IN_HALT;
- inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
+// inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
+// inSetCurWC = //IN_HALT;
+// inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
useGenericId = true;
break;
@@ -157,9 +157,9 @@ IterImpl::IterImpl( Type type ) :
inAdvance = IN_REV_LIST_ITER_ADVANCE;
inGetCurR = IN_GEN_VITER_GET_CUR_R;
- inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
- inSetCurWC = //IN_HALT;
- inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
+// inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
+// inSetCurWC = //IN_HALT;
+// inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
useGenericId = true;
break;
@@ -172,9 +172,9 @@ IterImpl::IterImpl( Type type ) :
inAdvance = IN_MAP_ITER_ADVANCE;
inGetCurR = IN_GEN_VITER_GET_CUR_R;
- inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
- inSetCurWC = //IN_HALT;
- inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
+ inGetCurWC = IN_GEN_VITER_GET_CUR_R; //IN_HALT; //IN_LIST_ITER_GET_CUR_WC;
+// inSetCurWC = IN_HALT;//IN_HALT;
+// inRefFromCur = IN_HALT;//IN_LIST_ITER_REF_FROM_CUR;
useGenericId = true;
break;
@@ -186,9 +186,9 @@ IterImpl::IterImpl( Type type ) :
inAdvance = IN_MAP_ITER_ADVANCE;
inGetCurR = IN_GEN_ITER_GET_CUR_R;
- inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
- inSetCurWC = //IN_HALT;
- inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
+// inGetCurWC = //IN_LIST_ITER_GET_CUR_WC;
+// inSetCurWC = //IN_HALT;
+// inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR;
useGenericId = true;
break;
diff --git a/test/lookup1.lm b/test/lookup1.lm
index 51385cb3..eac83f77 100644
--- a/test/lookup1.lm
+++ b/test/lookup1.lm
@@ -12,13 +12,8 @@ context lookup
alias list_int
vlist<int>
- struct map_list_lang_object_el
- List: list_lang_object
- map_el<str> el
- end
-
alias map_list_lang_object
- map<str, map_list_lang_object_el>
+ vmap<str, list_lang_object>
#
# Data types for global data.
@@ -94,10 +89,10 @@ context lookup
{
# LOG print( ' looking in ', obj->name, '\n' )
- ol: map_list_lang_object_el = obj->objectMap->find( name )
+ ol: list_lang_object = obj->objectMap->find( name )
if ol {
# LOG print( ' * found an object: ', ol.head, '\n' )
- return ol->List->head
+ return ol->head
}
return nil
@@ -288,22 +283,20 @@ context lookup
# Building the language object tree.
int insertObject( definedIn: lang_object, name: str, obj: lang_object )
{
- ol: map_list_lang_object_el = definedIn->objectMap->find( name )
+ ol: list_lang_object = definedIn->objectMap->find( name )
if !ol {
# Element not in the map already
- ol = new map_list_lang_object_el()
- ol->key = name
- ol->List = new list_lang_object()
- definedIn->objectMap->insert( ol )
+ ol = new list_lang_object()
+ definedIn->objectMap->insert( name, ol )
}
- ol->List->push_tail( obj )
+ ol->push_tail( obj )
}
lang_object findClass( inObj: lang_object, lang_objectname: str )
{
- ol: map_list_lang_object_el = inObj->objectMap->find( name )
- if ol {
- for obj: lang_object in ol->List {
+ List: list_lang_object = inObj->objectMap->find( name )
+ if List {
+ for obj: lang_object in List {
if obj->typeId == ClassType {
return obj
}
@@ -314,9 +307,9 @@ context lookup
lang_object findTemplateClass( inObj: lang_object, name: str )
{
- ol: map_list_lang_object_el = inObj->objectMap->find( name )
- if ol {
- for obj: lang_object in ol->List {
+ List: list_lang_object = inObj->objectMap->find( name )
+ if List {
+ for obj: lang_object in List {
if obj->typeId == TemplateClassType
return obj
}
@@ -2171,15 +2164,15 @@ context lookup
if obj->objectMap->length > 0
print( ' {\n' )
- ChildNames: map_list_lang_object = obj->objectMap
- MapEl: map_list_lang_object_el = ChildNames->head
- while ( MapEl ) {
- for Obj: lang_object in MapEl->List {
+ Map: map_list_lang_object = obj->objectMap
+ for List: list_lang_object in Map {
+ List2: list_lang_object = List
+ for Obj: lang_object in List2 {
printObject( indent + ' ', Obj )
}
- MapEl = MapEl->next
}
+
if obj->objectMap->length > 0
print( indent, '}' )