void evaluator::eval_message(TokenStream* st) { oop receiver; oop result = nilObj; symbolOop selector; if (st->eos()) return; if (!get_oop(st, &receiver)) return; if (st->eos()) { receiver->print(); } else if (st->is_unary()) { symbolOop selector = oopFactory::new_symbol(st->current()); if (!validate_lookup(receiver, selector)) return; result = Delta::call(receiver, selector); } else if (st->is_binary()) { selector = oopFactory::new_symbol(st->current()); if (!validate_lookup(receiver, selector)) return; oop argument; st->advance(); if (!get_oop(st, &argument)) return; result = Delta::call(receiver, selector, argument); } else if (st->is_keyword()) { char name[100]; oop arguments[10]; int nofArgs = 0; name[0] = '\0'; while (!st->eos()) { strcat(name, st->current()); st->advance(); oop arg; if (!get_oop(st, &arg)) return; arguments[nofArgs++] = arg; } selector = oopFactory::new_symbol(name); if (!validate_lookup(receiver, selector)) return; static DeltaCallCache cache; result = Delta::call_generic(&cache, receiver, selector, nofArgs, arguments); } result->print_value(); std->cr(); }
btree_node *look_up_node_with_string(btree_node * n, char *string_to_lookup) { int i = 0; btree_node *nn; if (validate_lookup(n, string_to_lookup)) return n; else { for (i = 0; i < n->child_count; i++) { nn = look_up_node_with_string(n->childs[i], string_to_lookup); if (nn) return nn; } } return 0; }