ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace
@ 2025-05-13  9:56 byroot (Jean Boussier) via ruby-core
  2025-05-13 12:00 ` [ruby-core:122051] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced tagomoris (Satoshi Tagomori) via ruby-core
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: byroot (Jean Boussier) via ruby-core @ 2025-05-13  9:56 UTC (permalink / raw)
  To: ruby-core; +Cc: byroot (Jean Boussier)

Issue #21330 has been reported by byroot (Jean Boussier).

----------------------------------------
Bug #21330: Namespace: Class and Module frozen status is not namespace 
https://bugs.ruby-lang.org/issues/21330

* Author: byroot (Jean Boussier)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
```ruby
File.write("/tmp/test.rb", <<~'RUBY')
  Hash.freeze
RUBY

ns = Namespace.new
ns.require("/tmp/test.rb")

class Hash
  def monkey_patch
  end
end
```

Expected behavior:

Since the monkey patch is in a different namespace, I'd expect it to not impact code that is running in another namespace.

Actual behavior:

```
test.rb:9:in '<class:Hash>': can't modify frozen class: Hash (FrozenError)
```

The class is frozen globally, breaking code in other namespaces.

Is this by design, or does that mean the frozen status need to be moved in the `classext_t` as well?

cc @tagomoris 



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:122051] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced
  2025-05-13  9:56 [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace byroot (Jean Boussier) via ruby-core
@ 2025-05-13 12:00 ` tagomoris (Satoshi Tagomori) via ruby-core
  2025-06-03  6:01 ` [ruby-core:122386] " ko1 (Koichi Sasada) via ruby-core
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: tagomoris (Satoshi Tagomori) via ruby-core @ 2025-05-13 12:00 UTC (permalink / raw)
  To: ruby-core; +Cc: tagomoris (Satoshi Tagomori)

Issue #21330 has been updated by tagomoris (Satoshi Tagomori).


The frozen flag is what I missed. I think we should move the flag to `rb_classext_t`.

----------------------------------------
Bug #21330: Namespace: Class and Module frozen status is not namespaced
https://bugs.ruby-lang.org/issues/21330#change-113201

* Author: byroot (Jean Boussier)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
```ruby
File.write("/tmp/test.rb", <<~'RUBY')
  Hash.freeze
RUBY

ns = Namespace.new
ns.require("/tmp/test.rb")

class Hash
  def monkey_patch
  end
end
```

Expected behavior:

Since the monkey patch is in a different namespace, I'd expect it to not impact code that is running in another namespace.

Actual behavior:

```
test.rb:9:in '<class:Hash>': can't modify frozen class: Hash (FrozenError)
```

The class is frozen globally, breaking code in other namespaces.

Is this by design, or does that mean the frozen status need to be moved in the `classext_t` as well?

cc @tagomoris 



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:122386] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced
  2025-05-13  9:56 [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace byroot (Jean Boussier) via ruby-core
  2025-05-13 12:00 ` [ruby-core:122051] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced tagomoris (Satoshi Tagomori) via ruby-core
@ 2025-06-03  6:01 ` ko1 (Koichi Sasada) via ruby-core
  2025-06-03  6:08 ` [ruby-core:122387] " jeremyevans0 (Jeremy Evans) via ruby-core
  2025-06-03  6:30 ` [ruby-core:122388] " byroot (Jean Boussier) via ruby-core
  3 siblings, 0 replies; 5+ messages in thread
From: ko1 (Koichi Sasada) via ruby-core @ 2025-06-03  6:01 UTC (permalink / raw)
  To: ruby-core; +Cc: ko1 (Koichi Sasada)

Issue #21330 has been updated by ko1 (Koichi Sasada).


I'm afraid that moving frozen flag into class_ext (and each built-in class variants can has each frozen state) makese `OBJ_FROZEN` code:


```C
// include/ruby/internal/fl_type.h
static inline VALUE
RB_OBJ_FROZEN_RAW(VALUE obj)
{
    return RB_FL_TEST_RAW(obj, RUBY_FL_FREEZE);
}
```

especially, if nobody freeze builtin classes. Any usecases?


----------------------------------------
Bug #21330: Namespace: Class and Module frozen status is not namespaced
https://bugs.ruby-lang.org/issues/21330#change-113550

* Author: byroot (Jean Boussier)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
```ruby
File.write("/tmp/test.rb", <<~'RUBY')
  Hash.freeze
RUBY

ns = Namespace.new
ns.require("/tmp/test.rb")

class Hash
  def monkey_patch
  end
end
```

Expected behavior:

Since the monkey patch is in a different namespace, I'd expect it to not impact code that is running in another namespace.

Actual behavior:

```
test.rb:9:in '<class:Hash>': can't modify frozen class: Hash (FrozenError)
```

The class is frozen globally, breaking code in other namespaces.

Is this by design, or does that mean the frozen status need to be moved in the `classext_t` as well?

cc @tagomoris 



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:122387] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced
  2025-05-13  9:56 [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace byroot (Jean Boussier) via ruby-core
  2025-05-13 12:00 ` [ruby-core:122051] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced tagomoris (Satoshi Tagomori) via ruby-core
  2025-06-03  6:01 ` [ruby-core:122386] " ko1 (Koichi Sasada) via ruby-core
@ 2025-06-03  6:08 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2025-06-03  6:30 ` [ruby-core:122388] " byroot (Jean Boussier) via ruby-core
  3 siblings, 0 replies; 5+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2025-06-03  6:08 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #21330 has been updated by jeremyevans0 (Jeremy Evans).


ko1 (Koichi Sasada) wrote in #note-4:
> I'm afraid that moving frozen flag into class_ext (and each built-in class variants can has each frozen state) makese `OBJ_FROZEN` code:
> 
> 
> ```C
> // include/ruby/internal/fl_type.h
> static inline VALUE
> RB_OBJ_FROZEN_RAW(VALUE obj)
> {
>     return RB_FL_TEST_RAW(obj, RUBY_FL_FREEZE);
> }
> ```
> 
> especially, if nobody freeze builtin classes. Any usecases?

roda-sequel-stack (https://github.com/jeremyevans/roda-sequel-stack) supports and recommends freezing all core classes at runtime (after the application is loaded).  This is how production Roda applications are commonly run.  Freezing core classes is recommended to ensure that no libraries the application is using are modifying the core classes at runtime (they probably aren't, but how can you be sure without freezing them)?

----------------------------------------
Bug #21330: Namespace: Class and Module frozen status is not namespaced
https://bugs.ruby-lang.org/issues/21330#change-113551

* Author: byroot (Jean Boussier)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
```ruby
File.write("/tmp/test.rb", <<~'RUBY')
  Hash.freeze
RUBY

ns = Namespace.new
ns.require("/tmp/test.rb")

class Hash
  def monkey_patch
  end
end
```

Expected behavior:

Since the monkey patch is in a different namespace, I'd expect it to not impact code that is running in another namespace.

Actual behavior:

```
test.rb:9:in '<class:Hash>': can't modify frozen class: Hash (FrozenError)
```

The class is frozen globally, breaking code in other namespaces.

Is this by design, or does that mean the frozen status need to be moved in the `classext_t` as well?

cc @tagomoris 



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:122388] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced
  2025-05-13  9:56 [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace byroot (Jean Boussier) via ruby-core
                   ` (2 preceding siblings ...)
  2025-06-03  6:08 ` [ruby-core:122387] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2025-06-03  6:30 ` byroot (Jean Boussier) via ruby-core
  3 siblings, 0 replies; 5+ messages in thread
From: byroot (Jean Boussier) via ruby-core @ 2025-06-03  6:30 UTC (permalink / raw)
  To: ruby-core; +Cc: byroot (Jean Boussier)

Issue #21330 has been updated by byroot (Jean Boussier).


> I'm afraid that moving frozen flag into class_ext (and each built-in class variants can has each frozen state) makese OBJ_FROZEN code:

It seems like your sentence is missing a word. Did you mean to say that it will make `OBJ_FROZEN` slower? If so yes, absolutely, but I thought it was a given. Namespaces are introducing a level of indirection it need to be checked and isn't cheap.

But on this note I'm currently working on two patches that may help with that:

  - Moving the frozen bit inside the shape_id: https://github.com/ruby/ruby/pull/13289
  - Delegating classes variables handling: https://github.com/ruby/ruby/pull/13411

With those two changes, once finished, I believe I can come up with a `RB_OBJ_FROZEN_RAW` that has almost the exact same performance.

> Any usecases?

What Jeremy said, but also just consistency? It's very hard to reason about a feature that isn't behaving consistently.



----------------------------------------
Bug #21330: Namespace: Class and Module frozen status is not namespaced
https://bugs.ruby-lang.org/issues/21330#change-113553

* Author: byroot (Jean Boussier)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
```ruby
File.write("/tmp/test.rb", <<~'RUBY')
  Hash.freeze
RUBY

ns = Namespace.new
ns.require("/tmp/test.rb")

class Hash
  def monkey_patch
  end
end
```

Expected behavior:

Since the monkey patch is in a different namespace, I'd expect it to not impact code that is running in another namespace.

Actual behavior:

```
test.rb:9:in '<class:Hash>': can't modify frozen class: Hash (FrozenError)
```

The class is frozen globally, breaking code in other namespaces.

Is this by design, or does that mean the frozen status need to be moved in the `classext_t` as well?

cc @tagomoris 



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-06-03  6:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-13  9:56 [ruby-core:122042] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespace byroot (Jean Boussier) via ruby-core
2025-05-13 12:00 ` [ruby-core:122051] [Ruby Bug#21330] Namespace: Class and Module frozen status is not namespaced tagomoris (Satoshi Tagomori) via ruby-core
2025-06-03  6:01 ` [ruby-core:122386] " ko1 (Koichi Sasada) via ruby-core
2025-06-03  6:08 ` [ruby-core:122387] " jeremyevans0 (Jeremy Evans) via ruby-core
2025-06-03  6:30 ` [ruby-core:122388] " byroot (Jean Boussier) via ruby-core

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).