diff options
author | Adrian Thurston <thurston@complang.org> | 2015-06-05 11:40:51 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-06-05 11:40:51 -0400 |
commit | b550332997a2cca6e670452af4f145a8381f45e3 (patch) | |
tree | 48148173ebc06f0212da19c09d3627b0c91c0e0d | |
parent | db0fd98a4f646abef622684d4228d879a933cbce (diff) | |
download | colm-b550332997a2cca6e670452af4f145a8381f45e3.tar.gz |
more vmap implementation
-rw-r--r-- | src/bytecode.c | 69 | ||||
-rw-r--r-- | src/bytecode.h | 1 | ||||
-rw-r--r-- | src/synthesis.cc | 30 | ||||
-rw-r--r-- | test/lookup1.lm | 43 |
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, '}' ) |