diff --git a/parse.leg b/parse.leg index 90e25d9..1670e83 100644 --- a/parse.leg +++ b/parse.leg @@ -1387,15 +1387,45 @@ oop eval(oop scope, oop ast) case t_GetIndex: { oop map = eval(scope, map_get(ast, map_symbol)); oop key = eval(scope, map_get(ast, key_symbol)); - return map_get(map, key); + switch (getType(map)) { + case String: + if (getInteger(key) >= get(map, String, size)) { + fprintf(stderr, "\nGetIndex out of range on String\n"); + exit(1); + } + return makeInteger(unescape(get(map, String, value))[getInteger(key)]); + case Map: + return map_get(map, key); + default: + // should it returns null instead? + fprintf(stderr, "\nGetIndex on non Map or String\n"); + exit(1); + } } case t_SetIndex: { oop map = eval(scope, map_get(ast, map_symbol)); oop key = eval(scope, map_get(ast, key_symbol)); oop op = map_get(ast, operator_symbol); oop value = eval(scope, map_get(ast, value_symbol)); - if (null != op) value= applyOperator(op, map_get(map, key), value); - return map_set(map, key, value); + switch (getType(map)) { + case String: + if (getInteger(key) >= get(map, String, size)) { + fprintf(stderr, "\nSetIndex out of range on String\n"); + exit(1); + } + get(map, String, value)[getInteger(key)] = getInteger(value); + return value; + case Map: + if (null != op) { + value= applyOperator(op, map_get(map, key), value); + } + return map_set(map, key, value); + default: + // should it returns null instead? + fprintf(stderr, "\nSetIndex on non Map or String\n"); + exit(1); + } + } # define SETINDEXOP(OPERATION, OPERATOR) \ case t_SetIndex##OPERATION: { \