Giter Site home page Giter Site logo

Comments (8)

pouyayarandi avatar pouyayarandi commented on July 16, 2024

For more details, I also found an issue in generated code for one-of fields. First for a better vision, when a non one-of field is getting decoded it passes its current value to the decoder as an inout parameter. Like this:

case 11: try { try decoder.decodeSingularFloatField(value: &_storage._singularFloat) }()

But in one of fields it happens completely different. It's a sample of code that generated for decoding a one-of field:

case 71: try {
  var v: Float?
  try decoder.decodeSingularFloatField(value: &v)
  if let v = v {
    if _storage._o != nil {try decoder.handleConflictingOneOf()}
    _storage._o = .oneofFloat(v)
  }
}()

In the above code the inout parameter that is passing to decode method is always nil (v variable is never set before passing to decoder method). My suggestion would be to add a line of code setting the current value to variable if it's possible:

case 71: try {
  var v: Float?
  if case .oneofFloat(let _v)? = _storage._o {v = _v}    // add this line
  try decoder.decodeSingularFloatField(value: &v)
  if let v = v {
    if _storage._o != nil {try decoder.handleConflictingOneOf()}
    _storage._o = .oneofFloat(v)
  }
}()

from swift-protobuf.

thomasvl avatar thomasvl commented on July 16, 2024

We should probably look at some of the upstream binary tests to see if they have some good example of merging tests that we should bring over, would help make sure we catch these types of issues.

from swift-protobuf.

thomasvl avatar thomasvl commented on July 16, 2024

We'll need to give this some more thought, but for primitive fields, the fact that we pass nil might not matter, yes it could be a single to the decoder the value was set, but for we also have the handleConflictingOneOf callback for that. The pace we really need to pass it is where merge would be adding instead of replacing, so sub message, maps?, and probably repeated fields. So it might make sense to only do the fetch in those cases to keep the code sizes down.

from swift-protobuf.

pouyayarandi avatar pouyayarandi commented on July 16, 2024

I'm not sure we are on the same page, but let me explain a scenario for it:

Let's say we have a message (m1) with oneof field and we try to merge it with another message (m2) with the same type. The oneof type has two possible cases oneof_int32(int32) and oneof_int64(int64). If we merge m1 with m2 by a field mask of both oneof_int32 and oneof_int64 paths, we expect that m1 oneof field should be same as m2. But currently, since merge decoder can't get value of oneof paths, it becomes nil.

from swift-protobuf.

thomasvl avatar thomasvl commented on July 16, 2024

Ah, that's potentially a different problem then I was thinking of, I was thinking purely about the nested messages within the oneof, and if the same oneof field is set, a merge wouldn't combine the submessage like it would for a non oneof field. Yea, I guess for collection of the field being set, we might need to always provide the value.

Anyway, all the more reason for the addition of merging related tests not just specific to the field mask cases.

from swift-protobuf.

pouyayarandi avatar pouyayarandi commented on July 16, 2024

I guess reproducing and fixing of this bug would be easier in case #1505 get merged first

from swift-protobuf.

thomasvl avatar thomasvl commented on July 16, 2024

Generally, fixing this seems worthwhile independent of that PR. Just need someone to code up some test cases and the fixes.

from swift-protobuf.

pouyayarandi avatar pouyayarandi commented on July 16, 2024

I close this issue as I commented in #1632 my problem fixed without any additional code generation.

from swift-protobuf.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.