copies the object at idx on the stack into a new DukValue and returns it
| 140 | |
| 141 | // copies the object at idx on the stack into a new DukValue and returns it |
| 142 | static DukValue copy_from_stack(duk_context* ctx, duk_idx_t idx = -1) { |
| 143 | DukValue value; |
| 144 | value.mContext = ctx; |
| 145 | value.mType = (Type) duk_get_type(ctx, idx); |
| 146 | switch (value.mType) { |
| 147 | case UNDEFINED: |
| 148 | break; |
| 149 | |
| 150 | case NULLREF: |
| 151 | value.mPOD.pointer = NULL; |
| 152 | break; |
| 153 | |
| 154 | case BOOLEAN: |
| 155 | value.mPOD.boolean = duk_require_boolean(ctx, idx) ? true : false; |
| 156 | break; |
| 157 | |
| 158 | case NUMBER: |
| 159 | value.mPOD.number = duk_require_number(ctx, idx); |
| 160 | break; |
| 161 | |
| 162 | case STRING: |
| 163 | { |
| 164 | duk_size_t len; |
| 165 | const char* data = duk_get_lstring(ctx, idx, &len); |
| 166 | value.mString.assign(data, len); |
| 167 | break; |
| 168 | } |
| 169 | |
| 170 | case OBJECT: |
| 171 | value.mPOD.ref_array_idx = stash_ref(ctx, idx); |
| 172 | break; |
| 173 | |
| 174 | case POINTER: |
| 175 | value.mPOD.pointer = duk_require_pointer(ctx, idx); |
| 176 | break; |
| 177 | |
| 178 | case BUFFER: |
| 179 | case LIGHTFUNC: |
| 180 | default: |
| 181 | throw DukException() << "Cannot turn type into DukValue (" << value.type_name() << ")"; |
| 182 | } |
| 183 | |
| 184 | return value; |
| 185 | } |
| 186 | |
| 187 | protected: |
| 188 | static duk_ret_t json_decode_safe(duk_context* ctx, void* user_data) |
nothing calls this directly
no test coverage detected