         o 'setup()V', (rs) -> # NOP, because we don't support threads
       ]
       Throwable: [
+        o 'fillInStackTrace()L!/!/!;', (rs, _this) ->
+            # we aren't creating the actual Java objects -- we're using our own
+            # representation.
+            _this.fields.$stack = stack = []
+            # we don't want to include the stack frames that were created by
+            # the construction of this exception
+            for sf in rs.meta_stack.slice(1) when sf.locals[0] isnt _this.ref
+              cls = sf.method.class_type
+              attrs = rs.class_lookup(cls).attrs
+              source_file =
+                _.find(attrs, (attr) -> attr.constructor.name == 'SourceFile')?.name or 'unknown'
+              line_nums = sf.method.get_code()?.attrs[0]
+              if line_nums?
+                ln = _.last(row.line_number for i,row of line_nums when row.start_pc <= sf.pc)
+              else
+                ln = 'unknown'
+              stack.push {'op':sf.pc, 'line':ln, 'file':source_file, 'method':sf.method.name, 'cls':cls}
+            _this.ref
         o 'printStackTrace(L!/io/PrintWriter;)V', (rs) -> # NOP, since we didn't fill in anything
       ]
       StringCoding: [

          o 'newArray(L!/!/Class;I)L!/!/Object;', (rs, _this, len) ->
              rs.heap_newarray _this.fields.$type, len
        ]
      Shutdown: [
        o 'halt0(I)V', (rs) -> throw new util.HaltException(rs.curr_frame().locals[0])
      ]

            throw new util.YieldException (cb) ->
              setTimeout(cb, millis.toNumber())
      ]
    security:
      AccessController: [
        o 'doPrivileged(L!/!/PrivilegedAction;)L!/lang/Object;', doPrivileged
