static HRESULT WINAPI unknode_appendChild( IXMLDOMNode *iface, IXMLDOMNode* newNode, IXMLDOMNode** outNewNode) { unknode *This = unknode_from_IXMLDOMNode( iface ); return node_append_child(&This->node, newNode, outNewNode); }
static HRESULT WINAPI domtext_appendChild( IXMLDOMText *iface, IXMLDOMNode *child, IXMLDOMNode **outChild) { domtext *This = impl_from_IXMLDOMText( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); return node_append_child(&This->node, child, outChild); }
static HRESULT WINAPI entityref_appendChild( IXMLDOMEntityReference *iface, IXMLDOMNode *child, IXMLDOMNode **outChild) { entityref *This = impl_from_IXMLDOMEntityReference( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); return node_append_child(&This->node, child, outChild); }
static HRESULT WINAPI dom_pi_appendChild( IXMLDOMProcessingInstruction *iface, IXMLDOMNode *child, IXMLDOMNode **outChild) { dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); return node_append_child(&This->node, child, outChild); }
static HRESULT WINAPI domcdata_appendChild( IXMLDOMCDATASection *iface, IXMLDOMNode *child, IXMLDOMNode **outChild) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); return node_append_child(&This->node, child, outChild); }
static HRESULT WINAPI domfrag_appendChild( IXMLDOMDocumentFragment *iface, IXMLDOMNode *child, IXMLDOMNode **outChild) { domfrag *This = impl_from_IXMLDOMDocumentFragment( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); return node_append_child(&This->node, child, outChild); }
node_t* node_add_return(node_t*n) { if(n->type != &node_return) { node_t*p = node_new(&node_return, n->parent); node_append_child(p, n); return p; } return n; }
node_t* node_insert_brackets(node_t*n) { int t; for(t=0;t<n->num_children;t++) { node_set_child(n, t, node_insert_brackets(n->child[t])); } if(n->parent) { if(lower_precedence(n, n->parent)) { node_t*p = node_new(&node_brackets, n->parent); node_append_child(p, n); return p; } } return n; }
node_t* node_do_cascade_returns(node_t*n) { switch(node_get_opcode(n)) { case opcode_node_block: node_set_child(n, n->num_children-1, node_do_cascade_returns(n->child[n->num_children-1])); return n; case opcode_node_if: node_set_child(n, 1, node_do_cascade_returns(n->child[1])); node_set_child(n, 2, node_do_cascade_returns(n->child[2])); return n; case opcode_node_nop: case opcode_node_setlocal: case opcode_node_inclocal: return n; case opcode_node_return: return n; default: { node_t*p = node_new(&node_return, n->parent); node_append_child(p, n); return p; } } }
node_t* node_optimize2(node_t*n, bool*again) { int t,num; switch(node_get_opcode(n)) { case opcode_node_block: for(t=0;t<n->num_children;t++) { if(n->child[t]->type == &node_nop) { node_remove_child(n, t--); } } break; case opcode_node_in: /* convert a in [x] to a == x */ if(node_is_array(n->child[1]) && n->child[1]->value.a->size == 1) { node_t*new_node = node_new(&node_equals, n->parent); node_t*constant = node_new_with_args(&node_constant, n->child[1]->value.a->entries[0]); node_append_child(new_node, n->child[0]); node_append_child(new_node, constant); node_destroy_self(n); return new_node; } break; case opcode_node_mul: /* convert a * 1.0 or 1.0 * a to a */ if(n->child[1]->type == &node_float && float_is_one(n->child[1]->value.f)) { node_t*new_node = n->child[0]; node_destroy(n->child[1]); node_destroy_self(n); return new_node; } if(n->child[0]->type == &node_float && float_is_one(n->child[0]->value.f)) { node_t*new_node = n->child[1]; node_destroy(n->child[0]); node_destroy_self(n); return new_node; } /* convert a * 0.0 or 0.0 * a to 0.0 */ if(n->child[0]->type == &node_float && float_is_zero(n->child[0]->value.f)) { node_t*new_node = n->child[0]; node_destroy(n->child[1]); node_destroy_self(n); return new_node; } if(n->child[1]->type == &node_float && float_is_zero(n->child[1]->value.f)) { node_t*new_node = n->child[1]; node_destroy(n->child[0]); node_destroy_self(n); return new_node; } break; case opcode_node_sub: /* convert a - 0.0 to a */ if(n->child[1]->type == &node_float && float_is_zero(n->child[1]->value.f)) { node_t*new_node = n->child[0]; node_destroy_self(n); return new_node; } break; case opcode_node_div: /* convert a / 1.0 to a */ if(n->child[1]->type == &node_float && float_is_one(n->child[1]->value.f)) { node_t*new_node = n->child[0]; node_destroy_self(n); return new_node; } break; case opcode_node_add: /* convert a + 0.0 to a */ num = 0; for(t=0;t<n->num_children;t++) { node_set_child(n, num, n->child[t]); if(n->child[t]->type != &node_float || !float_is_zero(n->child[t]->value.f)) { num++; } } if(!num) { node_set_child(n, num++, node_new_with_args(&node_float, 0.0)); } n->num_children = num; if(num==1) { node_t*new_node = n->child[0]; node_destroy_self(n); return new_node; } break; case opcode_node_if: /* convert if c then a else a to a */ if(node_equals_node(n->child[1], n->child[2])) { node_t*new_node = n->child[1]; node_destroy_self(n); return new_node; } break; case opcode_node_setlocal: /* convert setlocal i getlocal i to nop */ if(n->child[0]->type == &node_getlocal) { if(n->child[0]->value.i == n->value.i) { node_t*new_node = node_new(&node_nop, n->parent); node_destroy(n); *again = true; return new_node; } } break; } for(t=0;t<n->num_children;t++) { node_set_child(n, t, node_optimize2(n->child[t], again)); } return n; }