public PythonWrapperNode(PythonContext context, PNode child) {
   /**
    * Don't insert the child here, because child node will be replaced with the wrapper node. If
    * child node is inserted here, it's parent (which will be wrapper's parent after replacement)
    * will be lost. Instead, wrapper is created, and the child is replaced with its wrapper, and
    * then wrapper's child is adopted by calling adoptChildren() in {@link ProfilerTranslator}.
    */
   this.child = child;
   /**
    * context.getProbe will either generate a probe for this source section, or return the existing
    * probe for this section. There can be only one probe for the same source section.
    */
   this.probe = context.createProbe(child.getSourceSection());
 }
  @Override
  public PEnumerate executePEnumerate(VirtualFrame frame) throws UnexpectedResultException {
    probe.enter(child, frame);
    PEnumerate result;

    try {
      result = child.executePEnumerate(frame);
    } catch (KillException e) {
      throw (e);
    } catch (Exception e) {
      probe.leaveExceptional(child, frame, e);
      throw (e);
    }

    return result;
  }
  @Override
  public int executeInt(VirtualFrame frame) throws UnexpectedResultException {
    probe.enter(child, frame);
    int result;

    try {
      result = child.executeInt(frame);
      probe.leave(child, frame);
    } catch (KillException e) {
      throw (e);
    } catch (Exception e) {
      probe.leaveExceptional(child, frame, e);
      throw (e);
    }

    return result;
  }
  @Override
  public Object execute(VirtualFrame frame) {
    probe.enter(child, frame);
    Object result;

    try {
      result = child.execute(frame);
      probe.leave(child, frame);
    } catch (KillException e) {
      throw (e);
    } catch (Exception e) {
      probe.leaveExceptional(child, frame, e);
      throw (e);
    }

    return result;
  }
  @Override
  public PSequenceIterator executePSequenceIterator(VirtualFrame frame)
      throws UnexpectedResultException {
    probe.enter(child, frame);
    PSequenceIterator result;

    try {
      result = child.executePSequenceIterator(frame);
      probe.leave(child, frame);
    } catch (KillException e) {
      throw (e);
    } catch (Exception e) {
      probe.leaveExceptional(child, frame, e);
      throw (e);
    }

    return result;
  }
  @Override
  public PythonBuiltinClass executePythonBuiltinClass(VirtualFrame frame)
      throws UnexpectedResultException {
    probe.enter(child, frame);
    PythonBuiltinClass result;

    try {
      result = child.executePythonBuiltinClass(frame);
      probe.leave(child, frame);
    } catch (KillException e) {
      throw (e);
    } catch (Exception e) {
      probe.leaveExceptional(child, frame, e);
      throw (e);
    }

    return result;
  }