Changeset 051bc69a in mainline for uspace/app/sbi/src/run_texpr.c
- Timestamp:
- 2010-05-08T08:10:44Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 640ffe6, c5cb943d
- Parents:
- 25a76ab8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run_texpr.c
r25a76ab8 r051bc69a 31 31 #include <assert.h> 32 32 #include <stdlib.h> 33 #include "cspan.h" 33 34 #include "debug.h" 34 35 #include "list.h" … … 102 103 tdata_deleg_t *tdeleg; 103 104 stree_csi_t *base_csi; 105 stree_deleg_t *deleg; 106 stree_enum_t *enum_d; 107 tdata_enum_t *tenum; 104 108 105 109 #ifdef DEBUG_RUN_TRACE … … 115 119 116 120 if (targ_i->tic != tic_tobject) { 117 printf("Error: Using '.' with type which is not an object.\n"); 121 cspan_print(taccess->texpr->cspan); 122 printf(" Error: Using '.' with type which is not an " 123 "object.\n"); 118 124 *res = tdata_item_new(tic_ignore); 119 125 return; … … 125 131 sym = symbol_lookup_in_csi(prog, base_csi, taccess->member_name); 126 132 if (sym == NULL) { 127 printf("Error: CSI '"); 133 cspan_print(taccess->member_name->cspan); 134 printf(" Error: CSI '"); 128 135 symbol_print_fqn(csi_to_symbol(base_csi)); 129 136 printf("' has no member named '%s'.\n", … … 142 149 tobject->static_ref = b_false; 143 150 tobject->csi = sym->u.csi; 144 list_init(&tobject->targs); /* XXX */ 145 break; 146 case sc_deleg: 147 /* Construct type item. */ 148 titem = tdata_item_new(tic_tdeleg); 149 tdeleg = tdata_deleg_new(); 150 titem->u.tdeleg = tdeleg; 151 152 tdeleg->deleg = sym->u.deleg; 153 break; 154 case sc_fun: 155 case sc_var: 156 case sc_prop: 157 printf("Error: Symbol '"); 158 symbol_print_fqn(sym); 159 printf("' is not a type.\n"); 160 titem = tdata_item_new(tic_ignore); 161 break; 162 } 163 164 *res = titem; 165 } 166 167 /** Evaluate type indexing expression. 168 * 169 * Evaluate operation per the type indexing ('[', ']') operator. 170 * A type indexing operation may have extents specified or only rank 171 * specified. 172 * 173 * @param prog Program 174 * @param ctx Current CSI (context) 175 * @param tindex Type indexing expression to evaluate 176 * @param res Place to store type result 177 */ 178 static void run_tindex(stree_program_t *prog, stree_csi_t *ctx, 179 stree_tindex_t *tindex, tdata_item_t **res) 180 { 181 tdata_item_t *base_ti; 182 tdata_item_t *titem; 183 tdata_array_t *tarray; 184 stree_expr_t *arg_expr; 185 list_node_t *arg_node; 186 187 #ifdef DEBUG_RUN_TRACE 188 printf("Evaluating type index operation.\n"); 189 #endif 190 /* Evaluate base type. */ 191 run_texpr(prog, ctx, tindex->base_type, &base_ti); 192 193 if (base_ti->tic == tic_ignore) { 194 *res = tdata_item_new(tic_ignore); 195 return; 196 } 197 198 /* Construct type item. */ 199 titem = tdata_item_new(tic_tarray); 200 tarray = tdata_array_new(); 201 titem->u.tarray = tarray; 202 203 tarray->base_ti = base_ti; 204 tarray->rank = tindex->n_args; 205 206 /* Copy extents. */ 207 list_init(&tarray->extents); 208 arg_node = list_first(&tindex->args); 209 210 while (arg_node != NULL) { 211 arg_expr = list_node_data(arg_node, stree_expr_t *); 212 list_append(&tarray->extents, arg_expr); 213 arg_node = list_next(&tindex->args, arg_node); 214 } 215 216 *res = titem; 217 } 218 219 /** Evaluate type literal expression. 220 * 221 * @param prog Program 222 * @param ctx Current CSI (context) 223 * @param tliteral Type literal 224 * @param res Place to store type result 225 */ 226 static void run_tliteral(stree_program_t *prog, stree_csi_t *ctx, 227 stree_tliteral_t *tliteral, tdata_item_t **res) 228 { 229 tdata_item_t *titem; 230 tdata_primitive_t *tprimitive; 231 tprimitive_class_t tpc; 232 233 #ifdef DEBUG_RUN_TRACE 234 printf("Evaluating type literal.\n"); 235 #endif 236 (void) prog; 237 (void) ctx; 238 (void) tliteral; 239 240 switch (tliteral->tlc) { 241 case tlc_bool: tpc = tpc_bool; break; 242 case tlc_char: tpc = tpc_char; break; 243 case tlc_int: tpc = tpc_int; break; 244 case tlc_string: tpc = tpc_string; break; 245 case tlc_resource: tpc = tpc_resource; break; 246 } 247 248 /* Construct type item. */ 249 titem = tdata_item_new(tic_tprimitive); 250 tprimitive = tdata_primitive_new(tpc); 251 titem->u.tprimitive = tprimitive; 252 253 *res = titem; 254 } 255 256 static void run_tnameref(stree_program_t *prog, stree_csi_t *ctx, 257 stree_tnameref_t *tnameref, tdata_item_t **res) 258 { 259 stree_symbol_t *sym; 260 tdata_item_t *titem; 261 tdata_object_t *tobject; 262 stree_targ_t *targ; 263 tdata_vref_t *tvref; 264 stree_deleg_t *deleg; 265 tdata_deleg_t *tdeleg; 266 267 #ifdef DEBUG_RUN_TRACE 268 printf("Evaluating type name reference.\n"); 269 printf("'%s'\n", strtab_get_str(tnameref->name->sid)); 270 #endif 271 /* In interactive mode we are not in a class */ 272 if (ctx != NULL) { 273 /* Look for type argument */ 274 targ = stree_csi_find_targ(ctx, tnameref->name); 275 276 if (targ != NULL) { 277 /* Found type argument */ 278 #ifdef DEBUG_RUN_TRACE 279 printf("Found type argument '%s'.\n", 280 strtab_get_str(tnameref->name->sid)); 281 #endif 282 titem = tdata_item_new(tic_tvref); 283 tvref = tdata_vref_new(); 284 titem->u.tvref = tvref; 285 tvref->targ = targ; 286 287 *res = titem; 288 return; 289 } 290 } 291 292 /* Look for symbol */ 293 sym = symbol_lookup_in_csi(prog, ctx, tnameref->name); 294 if (sym == NULL) { 295 printf("Error: Symbol '%s' not found.\n", 296 strtab_get_str(tnameref->name->sid)); 297 *res = tdata_item_new(tic_ignore); 298 return; 299 } 300 301 switch (sym->sc) { 302 case sc_csi: 303 /* Construct type item. */ 304 titem = tdata_item_new(tic_tobject); 305 tobject = tdata_object_new(); 306 titem->u.tobject = tobject; 307 308 tobject->static_ref = b_false; 309 tobject->csi = sym->u.csi; 310 list_init(&tobject->targs); /* XXX */ 311 break; 151 list_init(&tobject->targs); 152 break; 153 case sc_ctor: 154 /* It is not possible to reference a constructor explicitly. */ 155 assert(b_false); 312 156 case sc_deleg: 313 157 /* Fetch stored delegate type. */ … … 330 174 } 331 175 break; 176 case sc_enum: 177 /* Fetch stored enum type. */ 178 enum_d = symbol_to_enum(sym); 179 assert(enum_d != NULL); 180 if (enum_d->titem == NULL) { 181 /* 182 * Prepare a partial enum whic will be completed 183 * later. 184 */ 185 titem = tdata_item_new(tic_tenum); 186 tenum = tdata_enum_new(); 187 titem->u.tenum = tenum; 188 tenum->enum_d = enum_d; 189 } else { 190 titem = enum_d->titem; 191 } 192 break; 332 193 case sc_fun: 333 194 case sc_var: 334 195 case sc_prop: 335 printf("Error: Symbol '"); 196 cspan_print(taccess->member_name->cspan); 197 printf(" Error: Symbol '"); 198 symbol_print_fqn(sym); 199 printf("' is not a type.\n"); 200 titem = tdata_item_new(tic_ignore); 201 break; 202 } 203 204 *res = titem; 205 } 206 207 /** Evaluate type indexing expression. 208 * 209 * Evaluate operation per the type indexing ('[', ']') operator. 210 * A type indexing operation may have extents specified or only rank 211 * specified. 212 * 213 * @param prog Program 214 * @param ctx Current CSI (context) 215 * @param tindex Type indexing expression to evaluate 216 * @param res Place to store type result 217 */ 218 static void run_tindex(stree_program_t *prog, stree_csi_t *ctx, 219 stree_tindex_t *tindex, tdata_item_t **res) 220 { 221 tdata_item_t *base_ti; 222 tdata_item_t *titem; 223 tdata_array_t *tarray; 224 stree_expr_t *arg_expr; 225 list_node_t *arg_node; 226 227 #ifdef DEBUG_RUN_TRACE 228 printf("Evaluating type index operation.\n"); 229 #endif 230 /* Evaluate base type. */ 231 run_texpr(prog, ctx, tindex->base_type, &base_ti); 232 233 if (base_ti->tic == tic_ignore) { 234 *res = tdata_item_new(tic_ignore); 235 return; 236 } 237 238 /* Construct type item. */ 239 titem = tdata_item_new(tic_tarray); 240 tarray = tdata_array_new(); 241 titem->u.tarray = tarray; 242 243 tarray->base_ti = base_ti; 244 tarray->rank = tindex->n_args; 245 246 /* Copy extents. */ 247 list_init(&tarray->extents); 248 arg_node = list_first(&tindex->args); 249 250 while (arg_node != NULL) { 251 arg_expr = list_node_data(arg_node, stree_expr_t *); 252 list_append(&tarray->extents, arg_expr); 253 arg_node = list_next(&tindex->args, arg_node); 254 } 255 256 *res = titem; 257 } 258 259 /** Evaluate type literal expression. 260 * 261 * @param prog Program 262 * @param ctx Current CSI (context) 263 * @param tliteral Type literal 264 * @param res Place to store type result 265 */ 266 static void run_tliteral(stree_program_t *prog, stree_csi_t *ctx, 267 stree_tliteral_t *tliteral, tdata_item_t **res) 268 { 269 tdata_item_t *titem; 270 tdata_primitive_t *tprimitive; 271 tprimitive_class_t tpc; 272 273 #ifdef DEBUG_RUN_TRACE 274 printf("Evaluating type literal.\n"); 275 #endif 276 (void) prog; 277 (void) ctx; 278 (void) tliteral; 279 280 switch (tliteral->tlc) { 281 case tlc_bool: tpc = tpc_bool; break; 282 case tlc_char: tpc = tpc_char; break; 283 case tlc_int: tpc = tpc_int; break; 284 case tlc_string: tpc = tpc_string; break; 285 case tlc_resource: tpc = tpc_resource; break; 286 } 287 288 /* Construct type item. */ 289 titem = tdata_item_new(tic_tprimitive); 290 tprimitive = tdata_primitive_new(tpc); 291 titem->u.tprimitive = tprimitive; 292 293 *res = titem; 294 } 295 296 static void run_tnameref(stree_program_t *prog, stree_csi_t *ctx, 297 stree_tnameref_t *tnameref, tdata_item_t **res) 298 { 299 stree_symbol_t *sym; 300 tdata_item_t *titem; 301 tdata_object_t *tobject; 302 stree_targ_t *targ; 303 tdata_vref_t *tvref; 304 stree_deleg_t *deleg; 305 tdata_deleg_t *tdeleg; 306 stree_enum_t *enum_d; 307 tdata_enum_t *tenum; 308 309 #ifdef DEBUG_RUN_TRACE 310 printf("Evaluating type name reference.\n"); 311 printf("'%s'\n", strtab_get_str(tnameref->name->sid)); 312 #endif 313 /* In interactive mode we are not in a class */ 314 if (ctx != NULL) { 315 /* Look for type argument */ 316 targ = stree_csi_find_targ(ctx, tnameref->name); 317 318 if (targ != NULL) { 319 /* Found type argument */ 320 #ifdef DEBUG_RUN_TRACE 321 printf("Found type argument '%s'.\n", 322 strtab_get_str(tnameref->name->sid)); 323 #endif 324 titem = tdata_item_new(tic_tvref); 325 tvref = tdata_vref_new(); 326 titem->u.tvref = tvref; 327 tvref->targ = targ; 328 329 *res = titem; 330 return; 331 } 332 } 333 334 /* Look for symbol */ 335 sym = symbol_lookup_in_csi(prog, ctx, tnameref->name); 336 if (sym == NULL) { 337 cspan_print(tnameref->texpr->cspan); 338 printf(" Error: Symbol '%s' not found.\n", 339 strtab_get_str(tnameref->name->sid)); 340 *res = tdata_item_new(tic_ignore); 341 return; 342 } 343 344 switch (sym->sc) { 345 case sc_csi: 346 /* Construct type item. */ 347 titem = tdata_item_new(tic_tobject); 348 tobject = tdata_object_new(); 349 titem->u.tobject = tobject; 350 351 tobject->static_ref = b_false; 352 tobject->csi = sym->u.csi; 353 list_init(&tobject->targs); 354 break; 355 case sc_ctor: 356 /* It is not possible to reference a constructor explicitly. */ 357 assert(b_false); 358 case sc_deleg: 359 /* Fetch stored delegate type. */ 360 deleg = symbol_to_deleg(sym); 361 assert(deleg != NULL); 362 if (deleg->titem == NULL) { 363 /* 364 * Prepare a partial delegate which will be completed 365 * later. 366 */ 367 titem = tdata_item_new(tic_tdeleg); 368 tdeleg = tdata_deleg_new(); 369 titem->u.tdeleg = tdeleg; 370 tdeleg->deleg = deleg; 371 tdeleg->tsig = NULL; 372 373 deleg->titem = titem; 374 } else { 375 titem = deleg->titem; 376 } 377 break; 378 case sc_enum: 379 /* Fetch stored enum type. */ 380 enum_d = symbol_to_enum(sym); 381 assert(enum_d != NULL); 382 if (enum_d->titem == NULL) { 383 /* 384 * Prepare a partial enum whic will be completed 385 * later. 386 */ 387 titem = tdata_item_new(tic_tenum); 388 tenum = tdata_enum_new(); 389 titem->u.tenum = tenum; 390 tenum->enum_d = enum_d; 391 } else { 392 titem = enum_d->titem; 393 } 394 break; 395 case sc_fun: 396 case sc_var: 397 case sc_prop: 398 cspan_print(tnameref->texpr->cspan); 399 printf(" Error: Symbol '"); 336 400 symbol_print_fqn(sym); 337 401 printf("' is not a type.\n"); … … 379 443 380 444 if (base_ti->tic != tic_tobject) { 381 printf("Error: Base type of generic application is not " 445 cspan_print(tapply->gtype->cspan); 446 printf(" Error: Base type of generic application is not " 382 447 "a CSI.\n"); 383 448 *res = tdata_item_new(tic_ignore); … … 410 475 411 476 if (farg_n != NULL || arg_n != NULL) { 412 printf("Error: Incorrect number of type arguments.\n"); 477 cspan_print(tapply->texpr->cspan); 478 printf(" Error: Incorrect number of type arguments.\n"); 413 479 *res = tdata_item_new(tic_ignore); 414 480 return;
Note:
See TracChangeset
for help on using the changeset viewer.