Skip to content
This repository has been archived by the owner on Feb 20, 2019. It is now read-only.

java.lang.VerifyError: Bad type on operand stack while encapsulating Pickler #445

Open
zzvara opened this issue Nov 25, 2016 · 0 comments
Open

Comments

@zzvara
Copy link

zzvara commented Nov 25, 2016

The following code:

import scala.pickling.{FastTypeTag, Pickler, Unpickler}
import scala.pickling.binary._
import scala.pickling.Defaults._

class Serializer[T : Pickler : FastTypeTag] {
  def serialize(data: T): Array[Byte] = {
    Foo.bar(data)
  }
}

object Foo {
  def bar[T: Pickler: FastTypeTag](t: T): Array[Byte] = t.pickle.value
  def unbar[T: Unpickler: FastTypeTag](bytes: Array[Byte]): T = bytes.unpickle[T]
}

class Message(message: String)

implicit object messageSerializer extends Serializer[Message]

def test[A: Pickler: FastTypeTag: Serializer](message: A): Array[Byte] = {
  implicitly[Serializer[A]].serialize(message)
}

val message = new Message("message")

test(message)

Evaluates to:



import scala.pickling.{FastTypeTag, Pickler, Unpickler}
import scala.pickling.binary._
import scala.pickling.Defaults._

defined class Serializer





defined module Foo




defined class Message

defined module messageSerializer

test: test[A](val message: A)(implicit <synthetic> val evidence$10: scala.pickling.Pickler[A],implicit <synthetic> val evidence$11: pickling.FastTypeTag[A],implicit <synthetic> val evidence$12: Serializer[A]) => Array[Byte]



message: Message = com.impresign.hub.core.A$A12$A$A12$Message@6c7df044

java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    com/impresign/hub/core/A$A12$A$A12$messageSerializer$.<init>(Lcom/impresign/hub/core/A$A12$A$A12;)V @212: invokespecial
  Reason:
    Type uninitializedThis (current frame, stack[3]) is not assignable to 'com/impresign/hub/core/A$A12$A$A12$messageSerializer$'
  Current Frame:
    bci: @212
    flags: { flagThisUninit }
    locals: { uninitializedThis, 'com/impresign/hub/core/A$A12$A$A12', 'scala/runtime/VolatileObjectRef', 'scala/Tuple2' }
    stack: { uninitializedThis, 'com/impresign/hub/core/A$A12$A$A12', 'scala/Predef$', uninitializedThis, 'scala/runtime/VolatileObjectRef', 'com/impresign/hub/core/A$A12$A$A12' }
  Bytecode:
    0x0000000: 2a2b b200 2db8 0031 4db2 0036 b600 3ab9
    0x0000010: 0040 0100 b900 4601 0099 00c5 bb00 4859
    0x0000020: b200 36b6 003a b900 4001 00b2 004d 124f
    0x0000030: b200 54b6 0058 b900 5e01 00b9 0062 0200
    0x0000040: b200 36b6 003a b900 4001 00b2 004d 124f
    0x0000050: b200 54b6 0058 b900 5e01 00b9 0065 0200
    0x0000060: b700 684e 2dc6 006c 2db6 006c c000 6e3a
    0x0000070: 042d b600 71c0 006e 3a05 1904 c100 7399
    0x0000080: 0052 1904 c000 733a 0619 06b6 0076 c000
    0x0000090: 783a 0719 05c1 0073 9900 3919 05c0 0073
    0x00000a0: 3a08 1908 b600 76c0 007a 3a09 1907 1909
    0x00000b0: 3a0a 59c7 000c 5719 0ac6 000e a700 1519
    0x00000c0: 0ab6 0080 9900 0d19 07c0 0082 3a0b a700
    0x00000d0: 0b2a 2c2b b700 843a 0b19 0ba7 0009 2a2c
    0x00000e0: 2bb7 0084 b600 88c0 0078 b200 4d12 4fb2
    0x00000f0: 0054 b600 58b7 008b b1                 
  Stackmap Table:
    full_frame(@191,{UninitializedThis,Object[#147],Object[#10],Object[#72],Object[#110],Object[#110],Object[#115],Object[#120],Object[#115],Object[#122],Object[#122]},{UninitializedThis,Object[#147],Object[#41],Object[#120]})
    full_frame(@199,{UninitializedThis,Object[#147],Object[#10],Object[#72],Object[#110],Object[#110],Object[#115],Object[#120],Object[#115],Object[#122],Object[#122]},{UninitializedThis,Object[#147],Object[#41]})
    full_frame(@209,{UninitializedThis,Object[#147],Object[#10],Object[#72]},{UninitializedThis,Object[#147],Object[#41]})
    full_frame(@217,{UninitializedThis,Object[#147],Object[#10],Object[#72],Top,Top,Top,Top,Top,Top,Top,Object[#130]},{UninitializedThis,Object[#147],Object[#41]})
    full_frame(@222,{UninitializedThis,Object[#147],Object[#10]},{UninitializedThis,Object[#147],Object[#41]})
    full_frame(@228,{UninitializedThis,Object[#147],Object[#10]},{UninitializedThis,Object[#147],Object[#41],Object[#130]})
Output exceeds cutoff limit.

When the Serializer is changed to accept a pre-generated Pickler of a concreted type through the constructor, the same problem is encountered. For example:

object messageSerializer extends Serializer[Message](PicklerUnpickler.generate[Message])

But if the Serializer is abstract and has an abstract implicit val pickler: AbstractPicklerUnpickler that the messageSerializer defined upon extending, to PicklerUnpickler.generate[Message], it works.

Is this an issue related to Scala Pickling, or a compiler bug?

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant