diff --git a/cpp/std/std_gc.go b/cpp/std/std_gc.go new file mode 100644 index 00000000..21902954 --- /dev/null +++ b/cpp/std/std_gc.go @@ -0,0 +1,39 @@ +//go:build !nogc +// +build !nogc + +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package std + +import ( + "unsafe" + + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/bdwgc" +) + +// ----------------------------------------------------------------------------- + +func allocString() *String { + ptr := bdwgc.Malloc(unsafe.Sizeof(String{})) + bdwgc.RegisterFinalizer(ptr, func(obj, data c.Pointer) { + (*String)(obj).Dispose() + }, nil, nil, nil) + return (*String)(ptr) +} + +// ----------------------------------------------------------------------------- diff --git a/cpp/std/std_nogc.go b/cpp/std/std_nogc.go new file mode 100644 index 00000000..20f8c880 --- /dev/null +++ b/cpp/std/std_nogc.go @@ -0,0 +1,35 @@ +//go:build nogc +// +build nogc + +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package std + +import ( + "unsafe" + + "github.com/goplus/llgo/c" +) + +// ----------------------------------------------------------------------------- + +func allocString() *String { + ptr := c.Malloc(unsafe.Sizeof(String{})) + return (*String)(ptr) +} + +// ----------------------------------------------------------------------------- diff --git a/cpp/std/string.go b/cpp/std/string.go index fa04524f..5427a51a 100644 --- a/cpp/std/string.go +++ b/cpp/std/string.go @@ -20,7 +20,6 @@ import ( "unsafe" "github.com/goplus/llgo/c" - "github.com/goplus/llgo/c/bdwgc" ) // ----------------------------------------------------------------------------- @@ -32,7 +31,7 @@ type StringView = string // String represents a C++ std::string object. type String struct { - Unused [24]byte + Unused [3]uintptr } // llgo:link (*String).InitEmpty C.stdStringInitEmpty @@ -52,14 +51,6 @@ func (s *String) Dispose() {} // ----------------------------------------------------------------------------- -func allocString() *String { - ptr := bdwgc.Malloc(unsafe.Sizeof(String{})) - bdwgc.RegisterFinalizer(ptr, func(obj, data c.Pointer) { - (*String)(obj).Dispose() - }, nil, nil, nil) - return (*String)(ptr) -} - // NewString creates a C++ std::string object. func NewString(v string) *String { ret := allocString()